今回はPythonとMeCabを使って日本語の文章を解析し、名詞や形容詞などの頻出度をカウントするコードをつくりました。
Twitterでデータ解析したり、商品のレビューなどを解析する際に使えると思います。
なお、今回はテキストデータを解析する方法のみをやってみました。大量のデータ収集や、その分析はまたの機会に試してみたいと思います。
今後、この記事にあるコードに追加することで簡単に大量データを解析することができるようになる予定です。
■単語頻出度のカウントコード
単語頻出度をカウントするコードをつくりました。なお、今回は形態素解析ライブラリのMeCabを使って、助詞と助動詞、接続詞以外の品詞の単語を全てカウントするコードになっています。
助詞、助動詞、接続詞を取り除くことで、文章の意味のある要素だけを取り出すことができると考えたので除外しました。
まず始めに全コードを紹介します。これをコピペして入力のテキストデータを変更すれば自分の解析したい文章を解析することができます。
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 |
import MeCab import csv wordFreq_dic = {} wordcount_output = [] #解析テキスト text = "今日は楽しい。明日も楽しい。明後日は明日より楽しい。" #単語頻出度カウント def WordFrequencyCount(word): if word in wordFreq_dic: wordFreq_dic[word] +=1 else: wordFreq_dic.setdefault(word, 1) return wordFreq_dic #特定の品詞の単語を抽出 mecab = MeCab.Tagger() mecab.parse('') node = mecab.parseToNode(text) while node: if node.feature.split(",")[0] == "名詞": word = node.surface WordFrequencyCount(word) elif node.feature.split(",")[0] =="動詞": word = node.surface WordFrequencyCount(word) elif node.feature.split(",")[0] == "形容詞": word = node.surface WordFrequencyCount(word) elif node.feature.split(",")[0] == "形容動詞": word = node.surface WordFrequencyCount(word) else:pass node = node.next #辞書リストを取り出し、降順に並び替え for item in wordFreq_dic.items(): wordcount_output.append(item) wordcount_output = sorted(wordcount_output, key = lambda x:x[1], reverse=True) #CSV出力 with open("wordcount_dic.csv", "w", encoding="utf-8) as f: writer = csv.writer(f, lineterminator="\n") writer.writerows(wordcount_output) |
以下コードの解説です。
1 2 3 4 5 6 7 8 |
#単語頻出度カウント def WordFrequencyCount(word): if word in wordFreq_dict: wordFreq_dict[word] +=1 else: wordFreq_dict.setdefault(word, 1) return wordFreq_dict |
WordFreqCountに指定した単語を入力し、word_dicにすでにある単語の場合はカウントを+1に、まだカウントの始まっていない新単語の場合はカウント=1を与えています。
word_dicの中身は、(“単語” , カウント数)の形で保存されています。例えば、(“今日”, 1)や(”新幹線”, 119)ですね。
1 2 3 4 5 6 7 8 9 10 11 |
#特定の品詞の単語を抽出 mecab = MeCab.Tagger() mecab.parse('') node = mecab.parseToNode(text) while node: if node.feature.split(",")[0] == "名詞": word = node.surface WordFrequencyCount(word) else:pass node = node.next |
上から3行目までのコードは、MeCabにより文章を形態素解析する部分です。この時点で、nodeに文章が解析された結果が入っています。
While文内で、抽出したい品詞を指定し、該当する品詞を持つ単語をWordFreqCountメソッドへ渡しています。指定した品詞以外の単語はpassされます。
node = node.nextを書かないと次のnodeへ移動しないので注意して下さい。ハマりかけました(笑)
1 2 3 4 |
#辞書リストを取り出し、降順に並び替え for item in wordFreq_dict.items(): wordcount_output.append(item) wordcount_output = sorted(wordcount_output, key = lambda x:x[1], reverse=True) |
辞書リストをそのまま出力すると、key値(単語)のみが出力されます。なので、key値とvalue値をまとめて出力するためのコードになります。
そして最後に降順に並び替えています。解析する際は最頻出の要素を調べたいですからね。
ちなみにreverse=Trueを消すと、昇順に並び替えられます。
1 2 3 4 |
#CSV出力 with open("wordcount_dic.csv", "w", encoding="utf-8") as f: writer = csv.writer(f, lineterminator="\n") writer.writerows(wordcount_output) |
以上で処理したデータをCSV出力するだけです。
1行目の”wordcount_dic.csv”の部分を”保存したいファイル名.csv”とすることでCSVファイルを出力できます。
■実際に動かしてみた
以上で説明したコードを実際に動かしてみました。
まず初めに簡単な短文を入力!
1 |
今日は楽しい。明日も楽しい。明後日は明日より楽しい。 |
出力は以下のようになりました。
1 2 3 4 |
楽しい,3 明日,2 明後日,1 今日,1 |
短文ですと思った通りに出力ができました!よかったよかった。
次は大量のテキストデータを取得し、データ解析してみたいと思います。
■まとめ
今回紹介したコードを使えばテキストデータから頻出単語をカウントすることができます。
文章の特徴を抽出することができるので、Twitterのデータ解析に使えそうですね。
今回はテキストデータ解析の点だけやったので、次回は大量のテキストデータ収集、およびその解析をやってみたいと思います。
以上になります。最後まで読んでいただきありがとうございました。
はじめてのディープラーニング Pythonで学ぶニューラルネットワークとバックプロパゲーション