pythonメニュー

形態素解析用モージュルの確認(Juman、MeCab)

形態素解析とは、 文章をを意味を持つ最小の単位(=形態素)に分け、それぞれのパーツの品詞などを判別することを指します。 以下に日本語形態素解析システム用のpythonで使えるモジュールを紹介しています。

Janome (蛇の目) 「Pure Python モジュール)」

依存ライブラリなしで簡単にインストールでき,アプリケーションに組み込みやすいシンプルな API を備える形態素解析ライブラリを目指しているそうです。
参考URL  : Janome v0.3 documentation (ja)
「pip install janome」のコマンド操作で簡単にインストールできます。
以下で例を示します。
from janome.tokenizer import Tokenizer
TOKENIZER = Tokenizer()
def analyze(text):
    """文字列textを形態素解析し、[(surface, parts)]の形にして返す。"""
    return [(t.surface, t.part_of_speech) for t in TOKENIZER.tokenize(text)]

t= "こんにちは、何かいいことないですか?"
parts = analyze(t)
print(parts)
'''[('こんにちは', '感動詞,*,*,*'), ('、', '記号,読点,*,*'), ('何', '名詞,代名詞,一般,*'), 
('か', '助詞,副助詞/並 立助詞/終助詞,*,*'), ('いい', '形容詞,自立,*,*'), ('こと', '名詞,非自立,一般,*'), ('ない', '形容詞,自立,*,*'), 
('です', '助動詞,*,*,*'), ('か', '助詞,副助詞/並立助詞/終助詞,*,*'), ('?', '記号,一般,*,*')]
'''
tk = TOKENIZER.tokenize(t)[0] # 先頭要素
print(type(tk)) # <class 'janome.tokenizer.Token'>
print(dir(tk))
'''['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
 '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
 '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'base_form', 'infl_form', 'infl_type', 'node_type', 'part_of_speech', 'phonetic',
 'reading', 'surface']
'''
print(tk.surface) # 結果:こんにちは
print(tk.part_of_speech) # 結果:感動詞,*,*,*

MeCab

MeCabはオープンソースの形態素解析エンジンで、高速に動作するが、Windowsで使うためには、別途にインストールが必要である。
以下にWindow10 のPython 3.6.6環境でインストールした過程を示します。(なお、Python 3.5ではできません。)
  1. 「https://github.com/ikegami-yukino/mecab/releases/tag/v0.996 」から「mecab-0.996-64.exe」をダウンロード

  2. 「mecab-0.996-64.exe」で「C:\Program Files\MeCab」にインストール
    コマンドプロンプトで確認(Ctrl+Cで強制終了)
    >"C:\Program Files\MeCab\bin\mecab"
    こんにちは
    こんにちは      險伜捷,荳?闊ャ,*,*,*,*,*
    EOS
    ^C
    >
    UTF-8に対応していないために文字化けしますが、構いません。
  3. (MeCabのインストール先)/binつまり「C:\Program Files\MeCab\bin」にある"libmecab.dll"のファイルをコピーします。
    コピー先は、「(Anacondaのインストール先)/Lib/site-packages」です。
    例えば「C:\Users\ユーザ名\AppData\Local\Continuum\anaconda3\Lib\site-packages」にコピー&ペーストです。

  4. python環境で「pip install ipykernel」とインストール

  5. python環境で「pip install mecab-python-windows」とインストール

次のようなコードで確認できます。
import MeCab
m = MeCab.Tagger ("-Ochasen")
print(m.parse ("こんにちは、何かいいことないですか?"))
print(m)
こんにちは      コンニチハ      こんにちは      感動詞
、      、      、      記号-読点
何      ナニ    何      名詞-代名詞-一般
か      カ      か      助詞-副助詞/並立助詞/終助詞
いい    イイ    いい    形容詞-自立     形容詞・イイ    基本形
こと    コト    こと    名詞-非自立-一般
ない    ナイ    ない    形容詞-自立     形容詞・アウオ段        基本形
です    デス    です    助動詞  特殊・デス      基本形
か      カ      か      助詞-副助詞/並立助詞/終助詞
?      ?      ?      記号-一般
EOS

mac os x (Capitan)でのインストール


JumanとMeCabを比較

# -*- coding: utf-8 -*-
#<meta charset="UTF-8">

import re
from janome.tokenizer import Tokenizer
import MeCab

TOKENIZER = Tokenizer()
MECAB = MeCab.Tagger("mecabrc")


def analyze1(text):
    return [(t.surface, t.part_of_speech) for t in TOKENIZER.tokenize(text)]

def analyze2(text):
    """文字列textを形態素解析し、[(surface, parts)]の形にして返す。"""
    a = MECAB.parse(text).splitlines()
    rtn = []
    i = 0
    while (a[i] != 'EOS'):
        tmp = a[i].split();
        if len(tmp) != 2 : 
            i+=1
            continue
        rtn.append(tuple(a[i].split()))
        i+=1
    
    return rtn


text = "こんにちは、何かいいことないですか?"
text = "今日は疲れたので、私は早くベッドに入ることにします。"

print("janome:", analyze1(text))
print("------------------------------------------------------------")
print("MeCab:", analyze2(text))
実行結果です。

janome: [('今日', '名詞,副詞可能,*,*'), ('は', '助詞,係助詞,*,*'), ('疲れ', '動詞,自立,*,*'), ('た', '助動詞,*,*,*'), ('ので', '助詞,接続助詞,*,*'), ('、', '記号,読点,*,*'), ('私', '名詞,代名詞,一般,*'), ('は', '助詞,係助詞,*,*'), ('早く', '形容詞,自立,*,*'), ('ベッド', '名詞,一般,*,*'), ('に', '助詞,格助詞,一般,*'), ('入る', '動詞,自立,*,*'), ('こと', '名詞,非自立,一般,*'), ('に', '助詞,格助詞,一般,*'), ('し', '動詞,自立,*,*'), ('ます', '助動 詞,*,*,*'), ('。', '記号,句点,*,*')]
------------------------------------------------------------
MeCab: [('今日', '名詞,副詞可能,*,*,*,*,今日,キョウ,キョー'), ('は', '助詞,係助詞,*,*,*,*,は,ハ,ワ'), ('疲れ', '動詞,自立,*,*,一段,連用形,疲れる,ツカレ,ツカレ'), ('た', '助動詞,*,*,*,特殊・タ,基本形,た,タ,タ'), ('ので', '助 詞,接続助詞,*,*,*,*,ので,ノデ,ノデ'), ('、', '記号,読点,*,*,*,*,、,、,、'), ('私', '名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ'), ('は', '助詞,係助詞,*,*,*,*,は,ハ,ワ'), ('早く', '形容詞,自立,*,*,形容詞・アウオ段,連用テ接続,早 い,ハヤク,ハヤク'), ('ベッド', '名詞,一般,*,*,*,*,ベッド,ベッド,ベッド'), ('に', '助詞,格助詞,一般,*,*,*,に,ニ, ニ'), ('入る', '動詞,自立,*,*,五段・ラ行,基本形,入る,ハイル,ハイル'), ('こと', '名詞,非自立,一般,*,*,*,こと,コト,コト'), ('に', '助詞,格助詞,一般,*,*,*,に,ニ,ニ'), ('し', '動詞,自立,*,*,サ変・スル,連用形,する,シ,シ'), ('ます', '助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス'), ('。', '記号,句点,*,*,*,*,。,。,。')]