Pythonで同時に使われやすい単語ペアを調べる(共起分析)
Pythonで共起分析を行います。
共起分析とは、文章の中で「同時に使われやすい言葉」を調べる分析手法です。
(ネットワークをグラフィカルに図示したものを「共起ネットワーク」と呼びます。)
以前、文章中の頻出単語を調べてみましたが、単純に文章中の頻出単語を見るだけでは文章の意味が分からない場合があります。
例えば、「満足」という単語が頻出していたとしても、それが「満足した」という文脈で使われているのか、「満足できなかった」という文脈で使われているのか分かりません。
意味が真逆になってしまうので、一体どちらの意味で「満足」という意味が使われたのかは知っておきたい所です。
そんな「共起分析」をPythonで行ってみましょう。
データの読み込み
今回は、教師データにTwitterの呟きデータを使ってみます。
Twitterのデータを取得するためのAPIを使うには「Twitter Developers」の利用申請が必要です。
申請が完了し、キー等が発行されたら下記のように認証を行います。
1 2 3 4 5 6 7 8 9 10 11 12 |
import tweepy #APIを使用するためのキー、トークン設定 Consumer_key = '(略)' Consumer_secret = '(略)' Access_token = '(略)' Access_secret = '(略)' #認証 auth = tweepy.OAuthHandler(Consumer_key, Consumer_secret) auth.set_access_token(Access_token, Access_secret) api = tweepy.API(auth, wait_on_rate_limit = True) |
過剰に利用しすぎると制限がかかりエラーになるので、APIメソッドの引数に「wait_on_rate_limit = True」を指定しておいて、使用上限に達したらデータ取得を自動で待機してくれる設定した方が良いでしょう。
それでは、今回は「天気」という言葉が含まれたツイートを取得して、それを教師データとしてみます。
1 2 3 4 5 6 7 |
#検索キーワード q = "天気 exclude:retweets" #データ取得 tweet_doc =[] for tweet in tweepy.Cursor(api.search, q=q,tweet_mode="extended").items(1000): tweet_doc.append(tweet.full_text) |
キーワードに「exclude:retweets」を含めると、リツイートは除いたデータが取得できます。
また、引数に「tweet_mode=”extended”」を指定すると、呟きの内容が省略されずに取得できます。
最後のitemsの引数は呟きの取得数です。今回は1000個取得してみます。
上のソースを実行すると、変数「tweet_doc」に「天気」という単語が含まれたツイートが1000個格納されます。
形態素解析
教師データが取得できたので、形態素解析を行います。
形態素解析器MeCabに新語の辞書を追加した「mecab-ipadic-NEologd」を使います。
古典文学などでは通常のMeCabを使ったほうが良さそうに思いますが、Twitterのようなデータには新語対応した辞書を使ったほうが良さそうです。
また、分割した単語のうち「名詞」「動詞」「形容詞」のみを抽出し、リストに格納していきます。
それに加え、出現頻度が高いと想定される単語は省きます。
MeCabで分割結果が空欄の場合に入る「*」と、ツイート内でリンクを張った場合にほぼ確実に入る「HTTPS」も消しました。
また、「天気」という単語は入っていることが明白なので、それも除きます。
このあたりのチョイスに正解は無いので、結果を見ながら試行錯誤していく部分ではありますが、今回は上記の通り決め打ちでやってみます。
という事で、以下のようなメソッドを定義します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import MeCab def sep_by_mecab(text): m = MeCab.Tagger ('-Ochasen -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd') node = m.parseToNode(text) word_list=[] while node: hinshi = node.feature.split(",")[0] if hinshi in ["名詞","動詞","形容詞"]: origin = node.feature.split(",")[6] if origin not in ["*","する","いる","なる","てる","れる","ある","こと","もの","HTTPS","天気"] : word_list.append(origin) node = node.next return word_list |
それでは、先ほど取得したツイートデータを上記メソッドに投入して、単語を抽出していきます。
1 2 3 |
documents=[] for t in tweet_doc: documents.append(set(sep_by_mecab(t))) |
さて、これで分析の準備ができました。
共起分析
いよいよ共起する単語を調べてみます。
方法は色々ありますが、今回はアソシエーション分析(バスケット分析)に用いるpyfpgrowthライブラリを使ってみます。
1 2 3 4 5 6 7 8 9 |
import pyfpgrowth import pprint #分析 patterns = pyfpgrowth.find_frequent_patterns(documents, 30) #降順に並び替えて見やすく表示 sorted_patterns = sorted(patterns.items(),reverse=True,key=lambda x:x[1]) pprint.pprint(sorted_patterns) |
共起回数が30回以上のものに絞って抽出します。
また、見やすさのために共起回数が多い順に並び替え、pprintを使ってdictionaryの要素ごとに改行させて表示させています。
結果を見てみると・・・
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
[(('天気の子',), 195), (('台風',), 127), (('の',), 126), (('ん',), 117), (('ない',), 77), (('見る',), 75), (('天気予報',), 71), (('思う',), 68), (('くる',), 66), (('いい',), 62), (('雨',), 61), (('悪い',), 60), (('明日',), 59), (('災害',), 57), (('良い',), 57), (('情報',), 55), (('そう',), 55), (('Yahoo!',), 52), (('行く',), 52), (('よう',), 51), (('言う',), 48), (('Yahoo!', '災害'), 48), (('今日',), 46), (('みたい',), 46), (('風',), 43), (('情報', '災害'), 43), (('日',), 42), (('人',), 38), (('Yahoo!', '情報'), 38), (('Yahoo!', '情報', '災害'), 38), (('やる',), 37), (('気',), 37), (('今',), 36), (('水位',), 36), (('大丈夫',), 35), (('Yahoo!', '水位'), 35), (('出る',), 34), (('やばい',), 34), (('情報', '水位'), 34), (('水位', '災害'), 34), (('Yahoo!', '情報', '水位'), 34), (('Yahoo!', '水位', '災害'), 34), (('情報', '水位', '災害'), 34), (('Yahoo!', '情報', '水位', '災害'), 34), (('来る',), 33), (('荒れる',), 33), (('ん', '台風'), 33), (('時',), 32), (('中',), 31), (('私',), 30)] |
共起でなく、単純に頻度が多いものも取れています。
最も多いのが映画「天気の子」でした。公開からはだいぶ経過しているのですが、まだまだ人気です。
こういうのは新語辞書を使わないと取得できない単語です。
「Yahoo!」と「情報」などのペアが見られるのは、Yahoo!ニュースを参照している記事が多いからでしょう。
その中でも、「水位」「災害」「情報」などがペアで出ています。
これは、データ取得時、2019年10月、台風19号が日本に迫ってきているタイミングの情報を取得してきたことが要因と思われます。
・・・などなど、本記事では細かい分析までは行いませんが、このように共起性を見ることによって、単語の頻度だけでは分からない示唆を得ることができました。
終わりに
本記事では文章中の単語の共起性を調べてみました。
確かに、資料化したり、細かい分析をするつもりが無いのならば「KH Coder」などを使ってグラフィカルな共起ネットワークを作成した方が分かりやすいものが出来ます。
しかし、あくまでも「データ分析」と考えた時は、自作したほうがデータやパラメータを自由に変化させられ、色々な観点から好きに分析できます。
データの抽出方法や分析方法の吟味はPythonで行い、最後はKH Coderなどで図にするなど、適宜使い分けて下さい。