ども
昨日はstapy #49でしたね
LT聴いたくれた方ありがとうございます。
アイドルで理解するTF-IDF 形態素解析編です
TF-IDFまであと一歩です
別に記事を増やしたくて細かく分けてるわけじゃないです
なにごとも一歩ずつ進めていくのがいいと思うんです
知らんけど
TL;DR
NEologdを使うときは
Tagger
に辞書のパスを指定するMeCab.Nodeオブジェクトはiterableじゃない
形態素の詳細な情報は
MeCab.Tagger.parseToNode.feature
で取得できる- 次の形態素は
MeCab.Tagger.parseToNode.next
で取得する
- 次の形態素は
形態素解析する
mecab-python3を使う。
今回のコードはこれだけ。
import csv import MeCab def analysis(in_csv: str, out_csv: str): tagger = MeCab.Tagger('-d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd') with open(out_csv, 'w', encoding='utf-8') as fout: with open(in_csv, encoding='utf-8') as fin: reader = csv.DictReader(fin) for row in reader: lemmas = [] node = tagger.parseToNode(row['body']) while node: result = node.feature.split(",") pos = result[0] lemma = result[-3] if pos == '名詞': lemmas.append(lemma) node = node.next row = f"{row['date']},{row['url']},{row['title']},{','.join(lemmas)}\n" fout.write(row)
tf_idf_with_idol/morphological_analysis.py at master · NaoY-2501/tf_idf_with_idol · GitHub
MeCab: Yet Another Part-of-Speech and Morphological Analyzerのスクリプト言語のバインディングにおおよその使い方が書いてある。
MeCab::Tagger というクラスのインスタンスを生成し, parse (もしくは parseToString) というメソッドを呼ぶことで, 解析結果が文字列として取得できます.
これはPerlの例で書いているけど、Pythonであれば「MeCab.Tagger
というクラスのインスタンスを作成し〜」となる。
また、Taggerクラスの引数にオプションを指定できる。使用する辞書を指定するときは-d
オプションの後に辞書のパスを書く。今回は前回、DockerイメージにインストールしたNEologdの辞書のパスを指定する。
表層系や形態素など詳しい情報を取りたい場合はMeCab.Tagger.parseToNode()
メソッドを使う。
parseToNode()
メソッドは文章を渡されると、'MeCab.Node'
オブジェクトを返す。
MeCab::Node は, 双方向リストとして表現されており, next, prev というメン バ変数があります.
Node
オブジェクトはiterableではないので、for文で回そうとすると怒られる。
Traceback (most recent call last): File "tf_idf_with_idol.py", line 13, in <module> for n in node: TypeError: 'MeCab.Node' object is not iterable
スクリプト言語のバインディング にあるようにwhile文を使って繰り返し処理しよう。
node
は<Swig Object of type 'MeCab::Node *' at 0x7fe6a4fae960>
というようなオブジェクトになっている。
詳細な情報を取得するときはfeature
属性を使う。
こんな感じの文字列が取得できる。
名詞,一般,*,*,*,*,迷路,メイロ,メイロ
カンマ区切りの文字列なので、 split()
メソッドを使ってリストにすると使いやすくなる。品詞は見てわかるように先頭にある。
なんとなくMeCabの使い方がわかったところで「広告の街」の歌詞の一部を形態素解析して終わりにする。
BOS/EOS,*,*,*,*,*,*,*,* 名詞,一般,*,*,*,*,迷路,メイロ,メイロ 助詞,連体化,*,*,*,*,の,ノ,ノ 名詞,非自立,助動詞語幹,*,*,*,様,ヨウ,ヨー 助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ 名詞,一般,*,*,*,*,恋,コイ,コイ 助詞,格助詞,一般,*,*,*,に,ニ,ニ 動詞,自立,*,*,一段,連用形,落ちる,オチ,オチ 助詞,接続助詞,*,*,*,*,て,テ,テ 動詞,非自立,*,*,五段・カ行促音便,基本形,いく,イク,イク 名詞,一般,*,*,*,*,心,ココロ,ココロ 助詞,並立助詞,*,*,*,*,と,ト,ト 名詞,一般,*,*,*,*,裏腹,ウラハラ,ウラハラ 名詞,一般,*,*,*,*,ゲーム,ゲーム,ゲーム 助詞,連体化,*,*,*,*,の,ノ,ノ 名詞,非自立,助動詞語幹,*,*,*,様,ヨウ,ヨー 助詞,副詞化,*,*,*,*,に,ニ,ニ 名詞,サ変接続,*,*,*,*,レベルアップ,レベルアップ,レベルアップ 形容詞,自立,*,*,形容詞・アウオ段,連用テ接続,うまい,ウマク,ウマク 助詞,係助詞,*,*,*,*,は,ハ,ワ 動詞,自立,*,*,五段・カ行促音便,未然形,いく,イカ,イカ 助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ 名詞,サ変接続,*,*,*,*,検索,ケンサク,ケンサク 名詞,副詞可能,*,*,*,*,結果,ケッカ,ケッカ 動詞,自立,*,*,一段,連用形,並べる,ナラベ,ナラベ 助詞,接続助詞,*,*,*,*,て,テ,テ 助詞,係助詞,*,*,*,*,も,モ,モ 動詞,自立,*,*,一段,未然形,探せる,サガセ,サガセ 助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ 名詞,一般,*,*,*,*,気持ち,キモチ,キモチ 助詞,係助詞,*,*,*,*,は,ハ,ワ 名詞,一般,*,*,*,*,迷路,メイロ,メイロ 助詞,連体化,*,*,*,*,の,ノ,ノ 名詞,一般,*,*,*,*,奥,オク,オク 助詞,格助詞,一般,*,*,*,に,ニ,ニ 動詞,自立,*,*,一段,連用形,消える,キエ,キエ 助詞,接続助詞,*,*,*,*,て,テ,テ 動詞,非自立,*,*,五段・カ行促音便,基本形,いく,イク,イク 名詞,代名詞,一般,*,*,*,あなた,アナタ,アナタ 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 動詞,自立,*,*,五段・サ行,基本形,探す,サガス,サガス BOS/EOS,*,*,*,*,*,*,*,*
照井さんたちによる演奏動画もめちゃめちゃかっこいいので観てください。
次回はいよいよTF-IDF編の予定です。PyCon JPが始まる前に書かないと絶対フェードアウトするのでがんばるぞい。