【Python】 Mecabでテキスト中から名詞を抽出する

下記のコードを実行することで、名詞のみの形態素解析結果を抽出することができます。

text = "解析したいテキストを入れる。"
m = MeCab.Tagger("-Ochasen")

nouns = [line for line in m.parse(text).splitlines()
               if "名詞" in line.split()[-1]]

for str in nouns:
   print(str.split())

<出力結果>
['解析', 'カイセキ', '解析', '名詞-サ変接続']
['テキスト', 'テキスト', 'テキスト', '名詞-一般']

解説

前提として、MecabとPythonが使える環境があるものとします。
私は、PyCharmで実行しています。

まずは、Mecabを使って、テキストをパースするための準備をします。Taggerインスタンスを生成します。

m = MeCab.Tagger("-Ochasen")

次にテキストをパースします。Taggerクラスのparseメソッドを使うと、テキストを形態素解析した結果を文字列(tsv)形式で返してくれます。

result = m.parse("解析したいテキストを入れる。")

実際にresultをprintすると下記のような結果なります。

<出力結果>
解析	カイセキ	解析	名詞-サ変接続		
し	シ	する	動詞-自立	サ変・スル	連用形
たい	タイ	たい	助動詞	特殊・タイ	基本形
テキスト	テキスト	テキスト	名詞-一般		
を	ヲ	を	助詞-格助詞-一般		
入れる	イレル	入れる	動詞-自立	一段	基本形
。	。	。	記号-句点		
EOS

このresultの結果を使って、名詞のみを抜き出す処理を書きます。tsvなので、まずは1行ごとに分割し、さらにタブごとに分割すれば、うまいこと処理ができそうです。Pythonらしく内包表記を使って書いてみます。

nouns = [line for line in m.parse(text).splitlines()
               if "名詞" in line.split()[-1]]

splitlines()でtsvを1行ごと分割したリストを取得します。そのリストをfor文で回し、行に対してsplit()を行うことでタブごとに文字列を分割したリストを取得することができます。そのリストの一番最後に名詞かどうかが判定できる情報があります。Pythonでは、リストの最後の要素を取得したい場合、-1と指定すると良いようです。in構文を使って、最後の要素に「名詞」という文字が含まれているかどうかを判定し、Trueであれば、その要素をコレクトするようにします。​これで、名詞のみの解析結果をコレクトしたリストを取得することができるようになりました。

あとは、煮るなり焼くなり好きにデータを加工すれば良いです。

たとえば、次のように書けば、完全に名詞のみを抽出することができます。

nouns = [line.split()[0] for line in m.parse(text).splitlines()
               if "名詞" in line.split()[-1]]

print(nouns)
<出力結果>
['解析', 'テキスト']

お気軽にフォローやコメントしてください。けっこう喜びます。