janome
前回、形態素解析ライブラリjanomeとワードクラウド作成ライブラリWordCloudを使って、ワードクラウドを作成してみました。
ただ前回はワードクラウドを表示することに重きを置いて、それぞれのライブラリの解説はしていませんでした。
ということで今回は形態素解析ライブラリjanomeを色々弄って、どう使うのか勉強していきましょう。
ちなみに形態素解析とは、文章を単語レベルまで分割して、それぞれがどのような意味だったり、品詞だったり、読み方だったりしているかを解析することをいいます。
なので今回、janomeでどのように文章が分割され、認識されているのか見てみるというのは重要なことだと思います。
それでは始めていきましょう。
解析結果全てを取得
まずはどのように分割し、解析されたのか、全情報(多分)を取得し、表示する方法です。
from janome.tokenizer import Tokenizer
data = "今日は天気でした。明日天気になぁれ。明後日も天気になぁれ。"
tk = Tokenizer()
tokens = tk.tokenize(data)
for token in tokens:
print(token)
まず「tk = Tokenizer()」としてjanomeのTokenizerクラスを読み込みます。
その後、「tokens = tk.tokenize(data)」で文章データ(ここでは変数data)を解析し、その結果を「tokens」に格納しています。
この「token」は文章が分割・解析されたものがリストのような形式で入っているので、for文を使って一つずつ取り出し、print関数で表示しています。
実行するとこのような結果が得られます。
今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
天気 名詞,一般,*,*,*,*,天気,テンキ,テンキ
でし 助動詞,*,*,*,特殊・デス,連用形,です,デシ,デシ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。 記号,句点,*,*,*,*,。,。,。
明日 名詞,副詞可能,*,*,*,*,明日,アシタ,アシタ
天気 名詞,一般,*,*,*,*,天気,テンキ,テンキ
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
なぁ 助詞,終助詞,*,*,*,*,なぁ,ナァ,ナー
れ 助動詞,*,*,*,文語・ル,連用形,る,レ,レ
。 記号,句点,*,*,*,*,。,。,。
明後日 名詞,副詞可能,*,*,*,*,明後日,ミョウゴニチ,ミョーゴニチ
も 助詞,係助詞,*,*,*,*,も,モ,モ
天気 名詞,一般,*,*,*,*,天気,テンキ,テンキ
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
なぁ 助詞,終助詞,*,*,*,*,なぁ,ナァ,ナー
れ 助動詞,*,*,*,文語・ル,連用形,る,レ,レ
。 記号,句点,*,*,*,*,。,。,。
for文で繰り返し表示しているため、1行が分割された一つの単語を示しています。
解析結果としては、表層形(分割された単位)、品詞、品詞細分類1、品詞細分類2、品詞細分類3、活用形、活用形、原形、読み、発音と並んでいます。
品詞細分類は品詞のさらに細かい分類のようです。
またそれぞれの項目で当てはまるものがない場合、「*」で表示されます。
表層形(分割された単位)を取得:.surface
次にWordCloudで一番使いたい「分割された単位(表層形)」を取得する方法です。
その場合は、「.surface」を使います。
ちなみに何故かは分かりませんが、先ほど作成した「tokens」を使いまわして、結果を表示することができなかったので、全プログラムを記載していきます。
ということでこんな感じ。
from janome.tokenizer import Tokenizer
data = "今日は天気でした。明日天気になぁれ。明後日も天気になぁれ。"
tk = Tokenizer()
tokens = tk.tokenize(data)
for token in tokens:
print(token.surface)
実行結果
今日
は
天気
でし
た
。
明日
天気
に
なぁ
れ
。
明後日
も
天気
に
なぁ
れ
。
分割された単語だけ、表示されています。
前回はこれをリストに追加していって、単語レベルで分割された文章を取得しました。
from janome.tokenizer import Tokenizer
data = "今日は天気でした。明日天気になぁれ。明後日も天気になぁれ。"
tk = Tokenizer()
tokens = tk.tokenize(data)
words = []
for token in tokens:
words.append(token.surface)
words = " ".join(words)
print(words)
実行結果
今日 は 天気 でし た 。 明日 天気 に なぁ れ 。 明後日 も 天気 に なぁ れ 。
品詞を取得:.part_of_speech
次に品詞を取得してみましょう。
品詞のみ取得する場合は「.part_of_speech」を使います。
from janome.tokenizer import Tokenizer
data = "今日は天気でした。明日天気になぁれ。明後日も天気になぁれ。"
tk = Tokenizer()
tokens = tk.tokenize(data)
for token in tokens:
print(token.part_of_speech)
実行結果
名詞,副詞可能,*,*
助詞,係助詞,*,*
名詞,一般,*,*
助動詞,*,*,*
助動詞,*,*,*
記号,句点,*,*
名詞,副詞可能,*,*
名詞,一般,*,*
助詞,格助詞,一般,*
助詞,終助詞,*,*
助動詞,*,*,*
記号,句点,*,*
名詞,副詞可能,*,*
助詞,係助詞,*,*
名詞,一般,*,*
助詞,格助詞,一般,*
助詞,終助詞,*,*
助動詞,*,*,*
記号,句点,*,*
ちなみにこの品詞の解析結果ですが、文字列(str型)なので、もし最初の主の品詞だけ取得したい場合は、「,(カンマ)」で分割したリストを作成し、その最初の要素を取得します。
from janome.tokenizer import Tokenizer
data = "今日は天気でした。明日天気になぁれ。明後日も天気になぁれ。"
tk = Tokenizer()
tokens = tk.tokenize(data)
for token in tokens:
print(token.part_of_speech.split(",")[0])
実行結果
名詞
助詞
名詞
助動詞
助動詞
記号
名詞
名詞
助詞
助詞
助動詞
記号
名詞
助詞
名詞
助詞
助詞
助動詞
記号
ちなみに前回、名詞だけ分類分けした際に「.part_of_speech」を使いました。
読み方を取得:.reading
次に読み方を取得してみましょう。
読み方を取得する場合は「.reading」を使います。
from janome.tokenizer import Tokenizer
data = "今日は天気でした。明日天気になぁれ。明後日も天気になぁれ。"
tk = Tokenizer()
tokens = tk.tokenize(data)
for token in tokens:
print(token.reading)
実行結果
キョウ
ハ
テンキ
デシ
タ
。
アシタ
テンキ
ニ
ナァ
レ
。
ミョウゴニチ
モ
テンキ
ニ
ナァ
レ
。
ここで気づきましたが、「明後日(あさって)」が「みょうごにち」と認識されていますね。
もしひらがなだけの文章にしようと思ったら、ちょっと修正が必要になるのかもしれません。
発音を取得:.phonetic
先ほど読み方を取得しましたが、多分プログラムで話させる時には読み方ではなく、発音を使うのではないかと推測されます。
発音を取得するには「.phonetic」を使います。
from janome.tokenizer import Tokenizer
data = "今日は天気でした。明日天気になぁれ。明後日も天気になぁれ。"
tk = Tokenizer()
tokens = tk.tokenize(data)
for token in tokens:
print(token.phonetic)
実行結果
キョー
ワ
テンキ
デシ
タ
。
アシタ
テンキ
ニ
ナー
レ
。
ミョーゴニチ
モ
テンキ
ニ
ナー
レ
。
先ほどの読み方と比べると、確かに話し方に近い形になっています。
こういうことができるようになると、プログラムで話させるなんてこともやってみたくなりますね。
分かち書き:wakati=True
次に「分かち書き」なるものを試してみましょう。
分かち書きとは単語ごとに分割された状態のことをいうそうです。
つまり先ほど「表層形」でそれぞれ単語単位にして、それを並べたものということです。
分かち書きを取得するには「tk = Tokenizer()」の括弧内に「wakati=True」を追加します。
ちなみに得られる結果はtokenizer特有の形のようなので、最後に「list()」を使ってリスト形式に変更しています。
from janome.tokenizer import Tokenizer
data = "今日は天気でした。明日天気になぁれ。明後日も天気になぁれ。"
tk = Tokenizer(wakati=True)
tokens = tk.tokenize(data)
print(list(tokens))
実行結果
['今日', 'は', '天気', 'でし', 'た', '。', '明日', '天気', 'に', 'なぁ', 'れ', '。', '明後日', 'も', '天気', 'に', 'なぁ', 'れ', '。']
ちなみにスペースを使ってjoinをすると、先ほどfor文を使って表層形を格納していったプログラムと同様の結果が得られます。
from janome.tokenizer import Tokenizer
data = "今日は天気でした。明日天気になぁれ。明後日も天気になぁれ。"
tk = Tokenizer(wakati=True)
tokens = tk.tokenize(data)
print(" ".join(list(tokens)))
実行結果
今日 は 天気 でし た 。 明日 天気 に なぁ れ 。 明後日 も 天気 に なぁ れ 。
こちらの方がプログラムが短くて、スマートですね。
ということでjanomeの使い方を学習しつつ、解説をしてみました。
なかなか面白いライブラリですし、何よりも役に立ちそうだと感じました。
例えば、日本語を学習している外国人にとってはひらがな、カタカナは習得するのはまだ楽なようですが、漢字になると一気にハードルが上がるようです。
そのような人の学習の手助けになるよう、日本語の文章をひらがなの分かち書きに変換するというプログラムが結構役になつんではないかなと思います。
また時間があったらそのようなプログラムを作るのに挑戦してみたいものです。
次回はWordCloudに関して、色々試していきましょう。
ではでは今回はこんな感じで。
コメント