fukke.cafe

Python MeCabを使って形態素解析

はじめに

オンラインのハックツハッカソンで文章から重量単語を抽出する処理を書きました.
MeCabを使用したのでそれについての記事です.
[!NOTE] MeCabは京都大学情報学研究科−日本電信電話株式会社コミュニケーション科学基礎研究所 共同研究ユニットプロジェクトを通じて開発されたオープンソース 形態素解析エンジンです。
https://taku910.github.io/mecab/
環境構築参考記事(Qiita)
https://qiita.com/taroc/items/b9afd914432da08dafc8

試してみる

import MeCab

class Analysis():
    def __init__(self, dir=u'./dic/mecab-ipadic-neologd'):
        # 辞書を選択
        self.mecab = MeCab.Tagger('-d ' + dir)

    def main(self, text):
        self.parseText(text)

    def parseText(self, text):
        node = self.mecab.parseToNode(text).next

        while node.next:
            print('{}: {}'.format(node.surface, node.feature))
            node = node.next


if __name__ == '__main__':
    text = '合法的なトビ方ノススメ'

    analysis = Analysis()
    analysis.main(text)
モジュール化するためにクラスで実装しています.
コンストラクタで形態素解析に使う辞書を指定して、インスタンス変数mecabを初期化します.
辞書は↓から取ってきました. 最新の単語も収集していて自動でクロール・更新しているみたいです.
mecab-ipadic-NEologd
https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md
mainメソッドは外部から呼ぶ用で、parseTextメソッドで形態素解析します.
parseToNodeメソッドがイテレータを返してくれるのでwhileでひとつづつ見ていきます.
'タイトル'
なんかすごくいい感じ(国語嫌いなのでよくわかりません)
まぁあとは実用的?っぽく名詞だけ取り出したりしてみます.
import MeCab

class Analysis():
    def __init__(self, dir=u'./dic/mecab-ipadic-neologd'):
        # 辞書を選択
        self.mecab = MeCab.Tagger('-d ' + dir)

    def main(self, text):
        wordList = self.pickUpNoun(text)

        return wordList

    def pickUpNoun(self, text):
        node = self.mecab.parseToNode(text).next
        result = []
        while node.next:
            # 名詞のとき配列に追加
            if node.feature.split(',')[0] == '名詞':
                result.append(node.surface)
            node = node.next

        return result

if __name__ == '__main__':
    text = '合法的なトビ方ノススメ'

    analysis = Analysis()
    result = analysis.main(text)
    print(result)
'タイトル'
名詞だけをいい感じに取り出しました.
何かには使えるんじゃない?(

終わりに

形態素解析はたのしいですね。マルコフと組み合わせるともっとたのしいかも?
コード書いてるとpythonの言語仕様でけっこう詰まります..
でも出来上がったコードは綺麗だしわりと好きかも
でも型欲しいな〜

公開日 2020/04/29

目次

Thanks you for reading.