形態素解析とは、 文章をを意味を持つ最小の単位(=形態素)に分け、それぞれのパーツの品詞などを判別することを指します。 以下に日本語形態素解析システム用のpythonで使えるモジュールを紹介しています。
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) # 結果:感動詞,*,*,*
「https://github.com/ikegami-yukino/mecab/releases/tag/v0.996 」から「mecab-0.996-64.exe」をダウンロード
>"C:\Program Files\MeCab\bin\mecab" こんにちは こんにちは 險伜捷,荳?闊ャ,*,*,*,*,* EOS ^C >UTF-8に対応していないために文字化けしますが、構いません。
(MeCabのインストール先)/binつまり「C:\Program Files\MeCab\bin」にある"libmecab.dll"のファイルをコピーします。
コピー先は、「(Anacondaのインストール先)/Lib/site-packages」です。
例えば「C:\Users\ユーザ名\AppData\Local\Continuum\anaconda3\Lib\site-packages」にコピー&ペーストです。
python環境で「pip install ipykernel」とインストール
python環境で「pip install mecab-python-windows」とインストール
import MeCab
m = MeCab.Tagger ("-Ochasen")
print(m.parse ("こんにちは、何かいいことないですか?"))
print(m)
こんにちは コンニチハ こんにちは 感動詞 、 、 、 記号-読点 何 ナニ 何 名詞-代名詞-一般 か カ か 助詞-副助詞/並立助詞/終助詞 いい イイ いい 形容詞-自立 形容詞・イイ 基本形 こと コト こと 名詞-非自立-一般 ない ナイ ない 形容詞-自立 形容詞・アウオ段 基本形 です デス です 助動詞 特殊・デス 基本形 か カ か 助詞-副助詞/並立助詞/終助詞 ? ? ? 記号-一般 EOS
# -*- 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: [('今日', '名詞,副詞可能,*,*,*,*,今日,キョウ,キョー'), ('は', '助詞,係助詞,*,*,*,*,は,ハ,ワ'), ('疲れ', '動詞,自立,*,*,一段,連用形,疲れる,ツカレ,ツカレ'), ('た', '助動詞,*,*,*,特殊・タ,基本形,た,タ,タ'), ('ので', '助 詞,接続助詞,*,*,*,*,ので,ノデ,ノデ'), ('、', '記号,読点,*,*,*,*,、,、,、'), ('私', '名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ'), ('は', '助詞,係助詞,*,*,*,*,は,ハ,ワ'), ('早く', '形容詞,自立,*,*,形容詞・アウオ段,連用テ接続,早 い,ハヤク,ハヤク'), ('ベッド', '名詞,一般,*,*,*,*,ベッド,ベッド,ベッド'), ('に', '助詞,格助詞,一般,*,*,*,に,ニ, ニ'), ('入る', '動詞,自立,*,*,五段・ラ行,基本形,入る,ハイル,ハイル'), ('こと', '名詞,非自立,一般,*,*,*,こと,コト,コト'), ('に', '助詞,格助詞,一般,*,*,*,に,ニ,ニ'), ('し', '動詞,自立,*,*,サ変・スル,連用形,する,シ,シ'), ('ます', '助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス'), ('。', '記号,句点,*,*,*,*,。,。,。')]