Pythonでバイグラムの可視化をしてみる(networkx)

こちらの記事で、テキストを分割し、軽く分析しました。最後にバイグラムをつくったので、そこから先をやってみます。

バイグラムをつくるところまでは下記を参照。 esu-ko.hatenablog.com

まず、加工集計しやすくするために、データフレームに変換します。

from collections import Counter
cntr = Counter()

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

df = pd.DataFrame(
  [[k,v]for k,v in cntr.items()],
  columns = ['bigram','cnt']
)
bi_df = df.assign(
    w1 = df.bigram.apply(lambda x : x.split('_')[0]),
    w2 = df.bigram.apply(lambda x : x.split('_')[1])
)

ネガ分析

ネガポジの辞書があれば、それをmergeしてネガポジのスコアなどを出しますが、今回はもっていないので、ないという単語と共起するものを見てみます。

bi_df.query('w2=="ない"')
 bigram  cnt w1  w2
172 や_ない  10  や ない
242 訳_ない  1   訳 ない
459 てる_ない   1   てる  ない
596 は_ない  3   は ない
662 こと_ない   1   こと  ない
688 申し訳_ない    1   申し訳   ない

みてみると、ないがつく組み合わせは6種類、合計でみても17しかありません。 「や + ない」、「は + ない」が多く、名詞や代名詞をうけて、それを否定し、動詞を否定することは少なさそうです。
これはおそらく、漫才という特性上、相手の行ったことをうけて否定する(=つっこみ)で相手の発言を代名詞でうけてるから、なので はないかと思われます。

可視化してみる

バイグラムの組み合わせは、ネットワーク構造で可視化することができます。ここではnetworkxを使っています。

esu-ko.hatenablog.com

まず、グラフを作成します。

import networkx as nx

G = nx.Graph()
edges  = []
for ix in bi_df.query('cnt>4').index:
  row = bi_df.loc[ix,:].to_list()
  edges.append(
    (row[2],row[3],row[1])
  )
  
G.add_weighted_edges_from(edges)

次に可視化をします。

fig = plt.figure(figsize=(10, 10))
nx.draw(G,
        with_labels=True,
        font_family='IPAexGothic',
        width = bi_df.query('cnt>4').cnt.values * 0.1
        )

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

とりあえず、ここからは、決め台詞に関する部分が繰り返しでること(=それ以外は繰り返しはすくない)と関西弁まわりの分割がうまくいってなさそう、という印象をうけました。 分割辞書周りをいじるのがネクストアクションになりそうです。