こちらの記事で、ワードVBAで分かち書きする方法を記載したのですが、
ExcelVBAでも分かち書き、単語の頻度分析を行うことができましたので紹介させてもらいます。
エクセルVBAで分かち書き、単語の頻度分析を行う方法!形態素分析
今回は、エクセルVBAから
・ワードを立ち上げて、
・セルの値をワードに打ち込んで、
・ワードを使って分かち書きを行い
・セルに書きこむ
という作業を自動化していきたいと思います。
エクセルVBAではなぜか速度が遅く、ワードVBAでどうにか行っていたのですが、
やはりExcelの方が扱いやすいですね。
それでは、エクセルVBAを用いた分かち書きの方法を紹介していきたいと思います。
仕事でよく使われる言葉の分析などなど、
色々使ってみてください!
単語の切り分け≒分かち書き≒形態素分析とは?
まずは簡単に、分かち書きについて紹介していきます。
分かち書きは文章を「単語」に分けることで、
さらに、分けた後の単語が動詞か名詞か判断するところまで行うことを
形態素分析
といいます。

英語の場合の分かち書きは単語の間に最初から区切りがありますので、
非常に簡単なのですが、(I like football など)
日本語の場合は、
僕はサッカーが好きです。
と、区切りがありません。
ですので、何かのソフトを使って、
僕 / は / サッカー / が / 好き / です
と切り分ける必要があります。
形態素分析
形態素分析ではこれからさらに、
僕 / は / サッカー / が / 好き / です
名詞 /助詞/ 名詞 / 助詞/ 動詞 / 助詞
の様に切り分け、さらに、
・好きという「良いワード」の前にある名詞は何か
・逆に嫌い、汚いなど「悪いワード」の前にある名詞は何か?
などを分析していくことになります。
今回は、この中でも、「分かち書き」し、「単語の出現頻度」を計算できるプログラムになります。
ワードは、分かち書きができる。
パソコンで文章を打つと、適度な区切り位置を決めて、漢字に変換してくれますよね。
時々無茶苦茶なときもありますが、よく考えると、、この機能ってすごいですよね。
更に、ワードで文章を打つと、見やすいように日本語と数字の間隔を自動調整するなど、様々な文章の公正を自動でしてくれます。
これらの機能の一部として、「単語の切り分けも」行うことができます。
今回はその機能を使って分かち書きを実行していこうと思います。
ワードの単語の切り分けは「WORD VBA」の.words
ワードの単語の切り分けは、
word VBAの.wordsという機能になります。
本来は、ワードを切り分けて、単語数をカウントする、
切り分けたワードがどこに出現するか確認する。
などのために使用される関数ですが、
今回はこの関数を使ってプログラムを組んでいこうと思います。
プログラム紹介
では、さっそくプログラムを紹介していきます。
プログラムの出力結果
まずは、プログラムの出力結果です。
このプログラムを使用すると、
①分かち書きしたい文章を入力。
②分かち書きした結果を表示
③単語の頻度を計算。
できます。
(クリックで拡大)

例として、清水翔太さんの歌詞を分かち書きしてみました。
結果を見てみると、君、僕が多いようです。
好き、愛してる、などなど恋愛の曲ばっかりをとってきてしまったようですね。笑

プログラムの説明
今回のプログラムは、エクセルのVBAで書いています。
ExcelVBAから
①ワードを立ち上げて、
②セルの内容を転記
③ワードで分かち書き
④セルに書き込み
②~④を繰り返す。
⑤ワードを閉じる。
⑥頻度分析
という順番で行っています
下記ボタンからダウンロードできますので、
一度お試しください。
プログラム紹介
下記が、今回使用したプログラムになります。
ダブルクリックするとコピーできますので、
ぜひ使ってみて下さい。
CELLS(1,2)~CELLS(1,11)までの文章を変換していきます。
' アクティブセルの文字列を、 ' Word の機能を使用して、単語に分解 Sub WAKACHIGAKI() Dim wd As Object Dim text As String Dim i As Double 'Wordオブジェクトを取得 Set wd = CreateObject("Word.Application") 'Wordを見えるようにする wd.Visible = True Z = 2 'Wordで新規文書を作成できる状態にする Set doc = wd.Documents.Add For J = 1 To 10 moji = Cells(1, J + 1) ' Word のドキュメントに、アクティブセルのテキストを書きこむ wd.Selection.text = moji For i = 1 To wd.Selection.Words.Count Cells(i + 1, J + 1) = wd.Selection.Words(i).text Cells(Z, 12) = wd.Selection.Words(i).text Cells(Z, 13) = wd.Selection.Words(i).text Z = Z + 1 If i Mod 20 = 0 Then Application.StatusBar = "処理中... 文章" & J & "/10 単語" & i & "/" & wd.Selection.Words.Count End If Next i doc.Content.Delete Next J ' Word は保存せず終了 wd.Quit False Application.StatusBar = False For L = 1 To Z If Cells(L, 13) Like "[あ-ん]" Then Cells(L, 13).ClearContents End If Next ActiveSheet.Range("$M$2:$M$10000").RemoveDuplicates Columns:=1, Header:=xlNo Cells(2, 14) = "=SUMPRODUCT((M2=$L$2:$L$" & Z & ")*1)" Cells(2, 14).Copy Range(Cells(2, 14), Cells(Z, 14)).PasteSpecial Range(Cells(2, 13), Cells(Z, 14)).Sort Key1:=Cells(2, 14), order1:=xlDescending End Sub
ポイント
ポイントは、
・words(i).textで分かち書きした単語を書き出す。
・If Cells(L, 13) Like "[あ-ん]" Then で「あ~ん」一文字の時を消す。
・ActiveSheet.Range("$M$2:$M$10000").RemoveDuplicates Columns:=1, Header:=xlNo
で重複した単語の削除
くらいでしょうか?
また分からないことありましたら、コメントに書き込んでいただければ説明します!
まとめ
Excelを使って、ワードを立ち上げて作業することって、
正直そこまでないかと思うのですが、
分かち書きは非常に便利な機能になっています。
ぜひ、一度使っていただけたらと思います!!!
コメント欄