こちらの記事で、ワード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を使って、ワードを立ち上げて作業することって、
正直そこまでないかと思うのですが、
分かち書きは非常に便利な機能になっています。
ぜひ、一度使っていただけたらと思います!!!
コメント欄
始めまして。
エクセルVBAで分かち書きのプログラムについてご質問です。
こちらのプログラムでは、B1~K1のデータの頻度分析が可能となっておりますが、、
検索範囲をL列、M列まで拡張させる場合は、どのようにプログラムを変更すれば良いでしょうか?
ご教授いただきたくお願いいたします。
ご連絡ありがとうございます!
返信が遅れてしまい、申し訳ございません。
単純な分かち書きだけなら、
For J = 1 To 10
⇒
For J = 1 To 12
にすることで可能になります。
また、単語の頻度を計算するとなると、
そこも変える必要があるので、下記の通りすべて右に2行ずらす必要があります。
変更前 ⇒ 変更後
Cells(Z, 12) ⇒ Cells(Z, 12+2)
Cells(Z, 13) ⇒ Cells(Z, 13+2)
Cells(Z, 14) ⇒ Cells(Z, 14+2)
変更前 ⇒ 変更後
"$M$2:$M$10000" ⇒ "$O$2:$O$10000"
"=SUMPRODUCT((M2=$L$2:$L$" & Z & ")*1)" ⇒ "=SUMPRODUCT((O2=$N$2:$N$" & Z & ")*1)"
はじめました。
とても役立ちそうです
是非使いたいと思い、
使用させて頂いたのですが
Cells(i + 1, J + 1) = wd.Selection.Words(i)
ここの箇所でエラーが出てしまいまして、
なにか解決策はありますでしょうか。
すみません、返信遅くなりました。
どのようなエラーが出たか教えていただくこと可能でしょうか?
お手数おかけいたしますが、よろしくお願い致します。
ana様と同様のエラーが出ております。
エラーコードは1004です。
J = 1 To 1000までとしており、それぞれ+990を打ち込んでおります。
該当エラーヶ所の次の行のZの値が7となっている為、
Zの値の計算関連でエラーが出ているのかと思うのですが、
解決が出来ていない状況です。
ご確認頂けますと幸いです。よろしくお願い致します。
ご連絡ありがとうございます。
wd.Selection.Words(i).text
が、エラーとなると、
ワードでその文章がきちんと区分けできていない可能性ありです。
もしよろしければ、該当する文章を教えていただけると幸いです。
※blueinfinity4ever@gmail.comまでご連絡いただければと思います。
迅速にご確認頂きありがとうございます。
頂いた内容を基に、該当箇所の確認を行ったところ、
「=」(半角)が複数続いている or 単体の場合エラーが出ている様でした。
その為、全体置換で「=」(半角)→「=」(全角)に置き換えたところ、エラー無く無事進めることが出来る様になりました。
メールでのご連絡は業務上の扱いとなる為、
差し上げることが出来ず申し訳ございませんが、
お礼と備忘と併せてこちらにご記載をさせて頂きます。
ありがとうございます。
問題が解決したようでよかったです。
また、問題点をご教授いただきありがとうございます!
いえいえ、是非、業務にお役立ていただければと思います!
完璧に趣味でやっているだけですけど、また何かあればご連絡いただければ対応させていただきます!
素晴らしい!
仕事で使います。こちらはExcelからワードでファイルを開くような感じだと思うのですが、この分割をエクセル内だけで行いたい時はどうすれば良いでしょうか?VBAが全くわからず、苦戦しています。よろしくお願いいたします。
お世話になっております。
本件、ワードの機能で「単語をくぎる」機能があるので、
ワードを用いて実践しています。
ワードを使わない場合は難しいかと思います。
お役に立てず申し訳ございません。。