エクセル、ワードを用いて無料で分かち書き、単語の頻度分析を行う方法!形態素分析
データベースを作成していくと、
・よく出てくるワードは何か?
・最近皆さんが、注目しているものは何か?
を知りたいときが出てくると思います。
そんな時に必要になってくるのが、
・単語を切り取り、集計すること
が必要になってきます。
今日は、ワードの機能を用いて、単語の切り分け、エクセルの機能を用いて単語の集計をするプログラムを作成しましたので、紹介したいと思います。
単語の切り分け≒分かち書き≒形態素分析とは?
単語の切り分けは
分かち書き
と呼ばれたりします。
さらに、分けた後の単語が動詞か名詞か判断するところまで行うことを
形態素分析
といいます。
分かち書き
英語の場合、
I like football
と単語の間に最初から区切りがありますが、
日本語の場合は、
僕はサッカーが好きです。
と、区切りがありません。
ですので、何かのソフトを使って、
僕 / は / サッカー / が / 好き / です
と切り分ける必要があります。
形態素分析
形態素分析ではこれからさらに、
僕 / は / サッカー / が / 好き / です
名詞 /助詞/ 名詞 / 助詞/ 動詞 / 助詞
の様に切り分け、さらに、
・好きという「良いワード」の前にある名詞は何か
・逆に嫌い、汚いなど「悪いワード」の前にある名詞は何か?
などを分析していくことになります。
今回は、この中でも、「分かち書き」し、「単語の出現頻度」を計算できるプログラムになります。
ワードは、単語の分析をしてくれる。
ワードで文章を打つと、見やすいように、
日本語と数字の間隔を自動調整する
など、様々な文章の公正を自動でしてくれます。
これらの機能の一部として、「単語の切り分けも」実は内部で行ってくれています。
今回はその機能を使って分かち書きを実行していきます。
ワードの単語の切り分けは「WORD VBA」の.words
ワードの単語の切り分けは、
word VBAの.wordsという機能になります。
本来は、ワードを切り分けて、単語数をカウントする、
切り分けたワードがどこに出現するか確認する。
などのために使用される関数ですが、
今回はこの関数を使ってプログラムを組んでいこうと思います。
プログラム紹介
では、さっそくプログラムを紹介していきます。
プログラムの出力結果
まずは、プログラムの出力結果です。
このプログラムを使用すると、
①出現した単語の種類と回数(B、C列)
②分かち書きした文章一覧(I列以降)
③計算用(E列)
が表示されます。
プログラム
プログラムは、エクセルのVBAではなく、ワードのVBAに書き込みます。
ワードで処理を行い→エクセルを立ち上げて→エクセルに張り付ける
作業をワードのVBAで行っています。※エクセル側からワードに指示を出すと、作業速度が非常に遅かったですので、
ワード側のVBAでプログラムを書いています。
ExcelVBAでも高速で、しかもきれいにまとめることができました!!!!↓
プログラムの説明
プログラムは大きく分けて、
①単語の切り分け
②エクセルの立ち上げ
③エクセルで計算
の構成でできています。
Sub センテンスごとに配列に格納する2()
Dim str(10000, 500) As String
Dim str2(20000, 1) As String
Dim cnt As Long
Dim i As Long
Z = 0
With ActiveDocument.Sentences
cnt = .Count
For i = 1 To cnt
If i Mod 10 = 0 Then
'ステータスバーへの表示更新
Application.StatusBar = i & "/" & cnt
'エクセルのイベント処理
DoEvents
End If
cnt2 = .Item(i).Words.Count
For J = 1 To cnt2
str(i, J) = .Item(i).Words(J)
str2(Z, 0) = .Item(i).Words(J)
Z = Z + 1
Next
Next i
End With
Set objExcel = CreateObject("Excel.Application")
objExcel.Application.Visible = True
Set exlBook = objExcel.Workbooks.Add()
Set exlSeet = exlBook.Worksheets.Add()
Application.ScreenUpdating = False
'exlSeet.cells(2, 8).Resize(UBound(str, 1) + 1, UBound(str, 2) + 1).Value = str()
exlSeet.cells(2, 8).Resize(i, 100).Value = str()
exlSeet.cells(2, 5).Resize(UBound(str2, 1) + 1, UBound(str2, 2) + 1).Value = str2()
exlSeet.cells(2, 2).Resize(UBound(str2, 1) + 1, UBound(str2, 2) + 1).Value = str2()
exlSeet.Range("$B$1:$B$10000").RemoveDuplicates Columns:=1, Header:=xlNo
exlSeet.cells(2, 3) = "=COUNTA(B:B)"
SHURUI = exlSeet.cells(2, 3)
With exlSeet
.cells(2, 3) = "=COUNTIF(E:E,B2)"
.cells(2, 3).Copy
.Range(exlSeet.cells(2, 3), exlSeet.cells(2 + SHURUI, 3)).Select
.Paste
.Range(exlSeet.cells(2, 2), exlSeet.cells(2 + SHURUI, 3)).Sort Key1:=exlSeet.cells(2, 3), order1:=xlDescending
End With
Application.ScreenUpdating = True
End Sub
①単語の切り分け
単語の切り分けは、先ほど説明した通り、
.WORDSを使って単語の切り分けをしています。
・段落ごとに切り分け ループ
・センテンス(文章)に切り分け ループ
・文章を単語に切り分けして、配列に代入
という構成をとっており、
二次元配列で、行ごとに
・文章毎に、単語を切り分けた結果
を代入していっています。
※文章ごとにする必要はありませんでしたが、
メモリなどの影響でプログラムが非常に遅くなるのを防いでいます。
エクセルを立ち上げる
次にエクセルを立ち上げています。
エクセルを立ち上げる方法は2通りあり、
①Set WordApp = CreateObject("Excel.Application")
②Set WordApp = New Excel.Application
とありますが、②では、エクセルVBAのコードをワードVBAにも読み込んでおく必要がありますので、①を使用しています。
結果を貼り付ける
エクセルを貼り付けた後は、結果を貼り付けています。
文章ごとに分かち書きした内容を「列」以降に張り付け、
計算用に「列」に単語一覧を縦一列に表示しています。
「列に」単語の種類を洗い出すために重複を削除した結果を表示、
その横に、出現頻度を計算しています。
まとめ
ワードVBAはあまり使ったことがありませんでしたが、
エクセルではできない機能が使えたりします。
分かち書きをして、単語の頻度を求めることで、最近の流行などをとらえることができると思いますので、ぜひ利用してみてください!
コメント欄