Python入門トップページ


目次

  1. 準備
  2. Janome の第一歩
  3. 簡単な形態素解析
  4. TF-IDF を計算してみよう
  5. ワードクラウドを作成してみよう

Python で自然言語処理をしてみよう - Janome 編

Janome の第一歩

目次に戻る

Janome を使う

まずは Janome モジュールをインポートする.もしもエラーが表示されたら,準備を参考に,janome をインストールしよう.

モジュールのインポートfrom janome.tokenizer import Tokenizer

「今日はメロンパンを食べました」という文章を形態素解析してみよう.results を表示すると次のような結果になりました.

今日はメロンパンを食べましたsent = "今日はメロンパンを食べました"
t = Tokenizer()
results = t.tokenize(sent)
print(results)
<generator object Tokenizer.__tokenize_stream at 0x7fdde151ac80>

results の型を確認すると generator であることがわかります.

type(results)
generator

形態素解析した結果は次のように for 文による繰り返しで取得できます.形態素解析により,単語に分割された後,それぞれの単語について品詞や読みなどの情報が得られていることが確認できます.

for token in results:
    print(token)
今日	名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
メロン	名詞,一般,*,*,*,*,メロン,メロン,メロン
パン	名詞,一般,*,*,*,*,パン,パン,パン
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
食べ	動詞,自立,*,*,一段,連用形,食べる,タベ,タベ
まし	助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ

目次に戻る

品詞や活用形,原形,読みや発音の取得

次は,形態素解析の結果から,品詞や活用形,原形,読みや発音の情報を取得してみよう.

sent = "今日はメロンパンを食べました"
t = Tokenizer()
results = t.tokenize(sent)
for token in results:
    print(token)
今日	名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
メロン	名詞,一般,*,*,*,*,メロン,メロン,メロン
パン	名詞,一般,*,*,*,*,パン,パン,パン
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
食べ	動詞,自立,*,*,一段,連用形,食べる,タベ,タベ
まし	助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ

次のように .__next__() を付与すると,先頭の単語の情報だけを取得することができます.

sent = "今日はメロンパンを食べました"
t = Tokenizer()
token = t.tokenize(sent).__next__()
print(token)
今日	名詞,副詞可能,*,*,*,*,今日,キョウ,キョー

上の結果から様々な情報を抽出してみます.まず,表層形を取得します.

print(token.surface)
今日

次は品詞の情報を取得します.結果は「品詞,品詞細分類1,品詞細分類2,品詞細分類3」という構造になっています.なお「*」は細分類の情報がないことを意味しています.

print(token.part_of_speech)
名詞,副詞可能,*,*

カンマで区切られた品詞情報をリストに変換します.

print(token.part_of_speech.split(','))
['名詞', '副詞可能', '*', '*']

リストに変換した品詞情報から先頭要素である「品詞」を取得します.

print(token.part_of_speech.split(',')[0])
名詞

活用形は infl_type で取得します(ただし,名詞の「今日」には活用形がないので「*」という結果になっています).

print(token.infl_type)
*

基本形(原形)は base_form です.

print(token.base_form)
今日

読みと発音を表示します.

print(token.reading)
print(token.phonetic)
キョウ
キョー

目次に戻る

分かち書き

文章を単語に分割する処理は分かち書きと呼ばれます.分かち書きを行うには wakati=True を指定します.

sent = "今日はメロンパンを食べました"
t = Tokenizer()
results = t.tokenize(sent, wakati=True)
for token in results:
    print(token)
今日
は
メロン
パン
を
食べ
まし
た

分かち書きした結果を直接リストに格納するには次のように記述します.

sent = "今日はメロンパンを食べました"
t = Tokenizer()
words = list(t.tokenize(sent, wakati=True))
print(words)
['今日', 'は', 'メロン', 'パン', 'を', '食べ', 'まし', 'た']

次のような書き方でも同じ結果が得られます.

sent = "今日はメロンパンを食べました"
t = Tokenizer(wakati=True)
words = list(t.tokenize(sent))
print(words)
['今日', 'は', 'メロン', 'パン', 'を', '食べ', 'まし', 'た']

目次に戻る

リスト内包表記

リスト内包表記を使って分かち書きの結果をリスト化することも可能です.リスト内包表記を用いると上の方法よりも高速に処理できる可能性があります.次の例は分かち書きした結果をそのまま(表層形を)リスト化しています.

sent = "今日はメロンパンを食べました"
t = Tokenizer()
words = [token.surface for token in t.tokenize(sent)]
print(words)
['今日', 'は', 'メロン', 'パン', 'を', '食べ', 'まし', 'た']

動詞などは原形で取得したい場合は次のように記述することになります.

sent = "今日はメロンパンを食べました"
t = Tokenizer()
words = [token.base_form for token in t.tokenize(sent)]
print(words)
['今日', 'は', 'メロン', 'パン', 'を', '食べる', 'ます', 'た']

目次に戻る

2種類のインポート方法

ここまでは次のような書き方で Janome をインポートして利用しました.

インポート方法(1)from janome.tokenizer import Tokenizer
sent = "今日はメロンパンを食べました"
t = Tokenizer()
results = t.tokenize(sent)
for token in results:
    print(token)
今日	名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
メロン	名詞,一般,*,*,*,*,メロン,メロン,メロン
パン	名詞,一般,*,*,*,*,パン,パン,パン
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
食べ	動詞,自立,*,*,一段,連用形,食べる,タベ,タベ
まし	助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ

なお,次のような方法でインポートすることも可能です.

インポート方法(2)import janome.tokenizer
sent = "今日はメロンパンを食べました"
t = janome.tokenizer.Tokenizer()
results = t.tokenize(sent)
for token in results:
    print(token)
今日	名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
メロン	名詞,一般,*,*,*,*,メロン,メロン,メロン
パン	名詞,一般,*,*,*,*,パン,パン,パン
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
食べ	動詞,自立,*,*,一段,連用形,食べる,タベ,タベ
まし	助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ

インポート方法(2)では Tokenizer() 関数が janome.tokenizer モジュールで定義されている関数であることが明確になるという利点があります.ただし,以降のページでもインポート方法(1)を使うことにします.

目次に戻る