こんばんは!
今回はPythonネタで形態素解析をやってみたいと思います!
Janomeをインストールする
JanomeはPythonの形態素解析ライブラリです。 今回はこのライブラリを利用したいと思います。
形態素解析ツールの有名どころだとMeCabもあります。 MeCabでも良いのですが、C実装をPythonバインディングする形でライブラリ化されており環境構築が一手間かかるため今回はJanomeを使います。
$ pip install janome
JanomeはPure Pythonなライブラリなのでpipですんなり入りました。
$ pip install ipython
今回はコマンドラインからインタプリタ上で試したいのでipythonも入れておきます。
形態素解析してみる
$ ipython
インタプリタを起動します。
簡単な形態素解析例
In [1]: from janome.tokenizer import Tokenizer
In [2]: tokenizer = Tokenizer()
In [3]: for token in tokenizer.tokenize('こんにちわ。私は猫です'):
...: print(token)
...:
こんにちわ 感動詞,*,*,*,*,*,こんにちわ,コンニチワ,コンニチワ
。 記号,句点,*,*,*,*,。,。,。
私 名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
猫 名詞,一般,*,*,*,*,猫,ネコ,ネコ
です 助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
単純な文なので綺麗に品詞分割してくれました!
これまで書いたブログ記事の名詞の出現頻度ランキングを作ってみる
ライブラリのAPIを紹介するだけでは味気ないので、私がこれまで公開してきたブログ記事全てのテキストから名詞の出現頻度ランキングを作ってみます。
main.py
import glob
from functools import reduce
from janome.analyzer import Analyzer
from janome.tokenfilter import POSKeepFilter, TokenCountFilter
def read_file(filepath):
'''ファイル読み込み'''
with open(filepath) as f:
return f.read()
def gather_files(root_path):
'''mdファイルをかき集める'''
return glob.glob(f'{root_path}/**/*.md', recursive=True)
def gather_texts(root_path):
'''マークダウン記事全てかき集めてテキスト連結'''
return reduce(
lambda a, b: a + b,
(read_file(filepath) for filepath in gather_files(root_path)),
''
)
def make_ranking(text):
'''名詞のみ抽出して出現頻度順にして返す'''
analyzer = Analyzer(token_filters=[
POSKeepFilter(['名詞']),
TokenCountFilter(sorted=True),
])
for word, count in analyzer.analyze(text):
# ノイズ除去
if len(word) < 2 and word.isascii():
continue
yield word, count
if __name__ == '__main__':
text = gather_texts('gatsbyブログのルートパス')
for word, count in make_ranking(text):
print(word, count)
名詞のみ抽出しているはずが、記号が名詞判定されまくってしまったので、やっつけのノイズ除去で応急処置。ファイルのテキストを連結しているだけなので、前処理的なノーマライズ作業が必要なのかもしれませんね(もしくはデフォルトの辞書だとあまり精度が良くないとか)。
$ python main.py | head -n 20
テスト 94
StrongBlueText 66
こと 57
Python 57
データ 50
index 48
コード 45
実行 44
gatsby 44
csv 42
2020 41
インストール 40
どうやらテストについて一番熱く語っているようです!(笑)
まとめ
私はNLPの専門じゃないので今回のテーマは勉強になりました。
純粋に楽しかったです。
単語の分割精度が悪かったので、勉強して次回リベンジしてみようと思います。
それでは、今回はここまで。
良きPythonライフを!