蛇ノ目の記

技術のことも。そうでないことも。

アイドルで理解するTF-IDF 形態素解析編

ども

昨日はstapy #49でしたね

LT聴いたくれた方ありがとうございます。

アイドルで理解するTF-IDF 形態素解析編です

TF-IDFまであと一歩です

別に記事を増やしたくて細かく分けてるわけじゃないです

なにごとも一歩ずつ進めていくのがいいと思うんです

知らんけど

TL;DR

  • NEologdを使うときはTaggerに辞書のパスを指定する

  • MeCab.Nodeオブジェクトはiterableじゃない

  • 形態素の詳細な情報はMeCab.Tagger.parseToNode.featureで取得できる

    • 次の形態素MeCab.Tagger.parseToNode.nextで取得する

形態素解析する

mecab-python3を使う。

pypi.org

今回のコードはこれだけ。

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の使い方がわかったところで「広告の街」の歌詞の一部を形態素解析して終わりにする。

www.youtube.com

 BOS/EOS,*,*,*,*,*,*,*,*
 名詞,一般,*,*,*,*,迷路,メイロ,メイロ
 助詞,連体化,*,*,*,*,の,ノ,ノ
 名詞,非自立,助動詞語幹,*,*,*,様,ヨウ,ヨー
 助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
 名詞,一般,*,*,*,*,恋,コイ,コイ
 助詞,格助詞,一般,*,*,*,に,ニ,ニ
 動詞,自立,*,*,一段,連用形,落ちる,オチ,オチ
 助詞,接続助詞,*,*,*,*,て,テ,テ
 動詞,非自立,*,*,五段・カ行促音便,基本形,いく,イク,イク
 名詞,一般,*,*,*,*,心,ココロ,ココロ
 助詞,並立助詞,*,*,*,*,と,ト,ト
 名詞,一般,*,*,*,*,裏腹,ウラハラ,ウラハラ
 名詞,一般,*,*,*,*,ゲーム,ゲーム,ゲーム
 助詞,連体化,*,*,*,*,の,ノ,ノ
 名詞,非自立,助動詞語幹,*,*,*,様,ヨウ,ヨー
 助詞,副詞化,*,*,*,*,に,ニ,ニ
 名詞,サ変接続,*,*,*,*,レベルアップ,レベルアップ,レベルアップ
 形容詞,自立,*,*,形容詞・アウオ段,連用テ接続,うまい,ウマク,ウマク
 助詞,係助詞,*,*,*,*,は,ハ,ワ
 動詞,自立,*,*,五段・カ行促音便,未然形,いく,イカ,イカ
 助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ
 名詞,サ変接続,*,*,*,*,検索,ケンサク,ケンサク
 名詞,副詞可能,*,*,*,*,結果,ケッカ,ケッカ
 動詞,自立,*,*,一段,連用形,並べる,ナラベ,ナラベ
 助詞,接続助詞,*,*,*,*,て,テ,テ
 助詞,係助詞,*,*,*,*,も,モ,モ
 動詞,自立,*,*,一段,未然形,探せる,サガセ,サガセ
 助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ
 名詞,一般,*,*,*,*,気持ち,キモチ,キモチ
 助詞,係助詞,*,*,*,*,は,ハ,ワ
 名詞,一般,*,*,*,*,迷路,メイロ,メイロ
 助詞,連体化,*,*,*,*,の,ノ,ノ
 名詞,一般,*,*,*,*,奥,オク,オク
 助詞,格助詞,一般,*,*,*,に,ニ,ニ
 動詞,自立,*,*,一段,連用形,消える,キエ,キエ
 助詞,接続助詞,*,*,*,*,て,テ,テ
 動詞,非自立,*,*,五段・カ行促音便,基本形,いく,イク,イク
 名詞,代名詞,一般,*,*,*,あなた,アナタ,アナタ
 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
 動詞,自立,*,*,五段・サ行,基本形,探す,サガス,サガス
 BOS/EOS,*,*,*,*,*,*,*,*

照井さんたちによる演奏動画もめちゃめちゃかっこいいので観てください。

www.youtube.com

次回はいよいよTF-IDF編の予定です。PyCon JPが始まる前に書かないと絶対フェードアウトするのでがんばるぞい。