2018年6月11日月曜日

Janomeで形態素解析をやってみる。(python,自然言語処理,分かち書き)

前々回前回、でエネルギー基本計画(案)のpdfからテキストを抽出しましたが、これを分析しようとすると文章を単語に分解(形態素解析)する必要があります。
形態素解析とは、言語学においてある言葉が変化・活用しない部分を最小単位の「素」と捉え、その素ごとに言葉を分解してゆく手法のことである。言語学者のチョムスキーによって考案されたもので、かな漢字変換を初めとする自然言語処理機能などに応用されている。 weblio:IT用語辞典バイナリより

日本語の形態素解析ライブラリとしてはMecabが有名ですが、windowsでは環境構築が難しいようなのでJanomeを使ってみます。

Janome v0.3 documentation (ja)

Janomeのドキュメンテーション。(当然ながら)日本語で書かれており、とても分かりやすいです。

下記ページもとても参考になりました。

コード7区:python で形態素解析。Janome が簡単。pip 一発でインストール

・インストール
!pip install janome

janomeのインストールは、pipで一発でできます。辞書も同時に入ります。

from janome.tokenizer import Tokenizer

t = Tokenizer()
text='原発依存度については、省エネルギー・再生可能エネルギーの導入や火力発電所の効率化などにより、可能な限り低減させる。'

tokens = t.tokenize(text)
 
for token in tokens:
    print(token)

とりあえず使ってみます。janomeをインポート、Tokenizerオブジェクトを作って、形態素解析したい文章を渡します。戻り値は Tokenオブジェクトのリストで、各単語に品詞や読みなどの情報が含まれています。

出力
原発 名詞,一般,*,*,*,*,原発,ゲンパツ,ゲンパツ
依存 名詞,サ変接続,*,*,*,*,依存,イゾン,イゾン
度 名詞,接尾,一般,*,*,*,度,ド,ド
について 助詞,格助詞,連語,*,*,*,について,ニツイテ,ニツイテ
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
、 記号,読点,*,*,*,*,、,、,、
省エネルギー 名詞,一般,*,*,*,*,省エネルギー,ショウエネルギー,ショーエネルギー
・ 記号,一般,*,*,*,*,・,・,・
再生 名詞,サ変接続,*,*,*,*,再生,サイセイ,サイセイ
可能 名詞,形容動詞語幹,*,*,*,*,可能,カノウ,カノー
エネルギー 名詞,一般,*,*,*,*,エネルギー,エネルギー,エネルギー
の 助詞,連体化,*,*,*,*,の,ノ,ノ
導入 名詞,サ変接続,*,*,*,*,導入,ドウニュウ,ドーニュー
や 助詞,並立助詞,*,*,*,*,や,ヤ,ヤ
火力 名詞,一般,*,*,*,*,火力,カリョク,カリョク
発電 名詞,サ変接続,*,*,*,*,発電,ハツデン,ハツデン
所 名詞,接尾,一般,*,*,*,所,ショ,ショ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
効率 名詞,一般,*,*,*,*,効率,コウリツ,コーリツ
化 名詞,接尾,サ変接続,*,*,*,化,カ,カ
など 助詞,副助詞,*,*,*,*,など,ナド,ナド
により 助詞,格助詞,連語,*,*,*,により,ニヨリ,ニヨリ
、 記号,読点,*,*,*,*,、,、,、
可能 名詞,形容動詞語幹,*,*,*,*,可能,カノウ,カノー
な 助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
限り 名詞,非自立,副詞可能,*,*,*,限り,カギリ,カギリ
低減 名詞,サ変接続,*,*,*,*,低減,テイゲン,テイゲン
さ 動詞,自立,*,*,サ変・スル,未然レル接続,する,サ,サ
せる 動詞,接尾,*,*,一段,基本形,せる,セル,セル
。 記号,句点,*,*,*,*,。,。,。

文章が単語に分解され、単語ごとに形態素情報付きで保存されています。形態素情報はコンマ区切りで、

 表層形,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用型,活用形,原形,読み,発音 

の下記の順序になっています。

この文章例では、「省エネルギー」は1つの単語とみなされているのに対し、「再生可能エネルギー」は「再生」「可能」「エネルギー」と3つに分解されました。「効率化」も1単語にしたいところですが、「効率」「化」と2つの単語になっています。辞書によるのでしょうが、複合語には注意が必要なようです。

・情報取り出し
word='寄り添い'

tokens = t.tokenize(word)

for token in tokens:
    print("表層形:",token.surface,"\n"
          "品詞:",token.part_of_speech.split(',')[0],"\n"
          "品詞細分類1:",token.part_of_speech.split(',')[1],"\n"
          "品詞細分類2:",token.part_of_speech.split(',')[2],"\n"
          "品詞細分類3:",token.part_of_speech.split(',')[3],"\n"
          "活用型:",token.infl_type,"\n"
          "活用形:",token.infl_form,"\n"
          "原形:",token.base_form,"\n"
          "読み:",token.reading,"\n"
          "発音:",token.phonetic)
表層形: 寄り添い 
品詞: 動詞 
品詞細分類1: 自立 
品詞細分類2: * 
品詞細分類3: * 
活用型: 五段・ワ行促音便 
活用形: 連用形 
原形: 寄り添う 
読み: ヨリソイ 
発音: ヨリソイ

形態素情報を個別に取り出しました。品詞はtokenオブジェクトの戻り値からコンマ区切りで分割して取り出しです。詳細は下記リファレンス参照。

janome リファレンス :
class janome.tokenizer.Token(node, extra=None)[source]

これらの形態素情報を使って、名詞のみ、原型のみのなどの抽出ができます。(こちらはまた後日書く予定)

・分かち書き
t = Tokenizer()

text_file = open("enegy_plan.txt")
full_text = text_file.read()
full_text= full_text.replace("\n","")

wakati_list = t.tokenize(full_text, wakati=True)
wakati_list[:13]
['はじめ', 'に', '2', '0', '1', '1', '年', '3月', 'の', '東日本', '大震災', '及び', '東京電力']

品詞が必要なく単語に分解するだけなら、"wakati"オプションを付けることで簡単にできます。

ここでは、エネルギー基本計画(案)から抽出したテキストを読み込み、改行記号(\n)を削除した上で形態素解析を行っています。戻り値はリストで、各単語が表層形で格納されています。

この例では、「3月」はひとつの単語なのに、「2011年」は各数字と年に分けられています。「大震災」、「東京電力」は1単語ですね。この辺りも微妙な感じで調整が必要になりそうです。


参考:
Janome v0.3 documentation (ja)
http://mocobeta.github.io/janome/
janome リファレンス
class janome.tokenizer.Token(node, extra=None)[source]

コード7区
python で形態素解析。Janome が簡単。pip 一発でインストール

当ブログ内
修正:PDFMinerでpdfからtxtを抽出する。(python、PDFMiner.six、エネルギー基本計画)
正規表現を使って、エネルギー基本計画のテキストを整形する。(python、re、split)

0 件のコメント:

コメントを投稿

//SyntaxHighlighter CDNより https://cdnjs.com/libraries/SyntaxHighlighter // 対応言語