Pythonで長文自然言語を扱ってみる(NLTKの入門)

現在のビジネス環境だと、あまり使われることはないかもしれませんが、ある一つのテキストをひとまず把握したい!といったときにNLTKは便利機能がそろっています。

ミルクボーイさんのコーンフレーク漫才を文字起こししたものを、題材に使い方を把握してみます。

下準備

janome分かち書きをして、nltkで読み込みます。

esu-ko.hatenablog.com

milkboy = #文字起こししたテキスト

from janome.tokenizer import Tokenizer
t = Tokenizer()

j_tokens = t.tokenize(milkboy)

import nltk

import_text = " ".join([token.base_form for token in j_tokens])
tokens = nltk.word_tokenize(import_text)

text = nltk.Text(tokens)

可視化してデータを見てみる

まずはよく出てくる単語が何かを把握して、次のアクションを決めるため、出現頻度順でその数の累積を見てみます。

import matplotlib.pyplot as plt
import japanize_matplotlib

fdist = nltk.FreqDist(text)
fdist.plot(25,cumulative=True)

f:id:esu-ko:20200810214954p:plain

よくあることですが、助詞が多いですね。

上位に出てきた動詞「分かる」と、この漫才の重要なキーワードである「コーン(フレーク)」、ミルクボーイの漫才の基本パターンである「オカン」の出現タイミングをみてみることにします。

text.dispersion_plot(['コーン','オカン','分かる'])

f:id:esu-ko:20200810215006p:plain

自分の印象だとオカンは最初と最後のイメージでしたが、かなり定期的に出てくるようですね。

コーンフレークは最初にはでてこず、繰り返しパターンに入ると密度高く出てくるようです。

「分かる」は前半集中してでてきたあと、終盤に定期的にでてクライマックスにしていくようです。

バイグラムをみてみる

上記までは分かち書きした単語レベルでしたが、固有や同時に使われる言葉を把握するためにバイグラムの出現トップをみておきます。

from collections import Counter
cntr = Counter()

for w1,w2 in list(nltk.bigrams(text)):
  cntr[w1 + '_' + w2] += 1

pd.DataFrame(
  [[k,v]for k,v in cntr.items()],
  columns = ['bigram','cnt']
).set_index('bigram').sort_values('cnt',ascending=False).head(10).plot.barh()

#単体での出現と、似た単語もみてみる
for w in ['コーン','フレーク']:
  print(w,text.count(w),text.similar(w))

f:id:esu-ko:20200810214927p:plain

コーンフレークというたんが分かれたものがトップで、あとは助詞やリズムを作る感じのものが多そうです。