『Excel VBA 表計算とプログラミング学習サイト』では、アフィリエイトプログラムを利用して商品を紹介しています。

英単語カウンター

文章そのものをデータベースとして活用するときなど、単語の総数をカウントしたいときがあります。日本語の文章だと単語同士の区切りがどこにあるのかわからないので相当に難しいのですが、英語は単語間スペースを利用して比較的簡単に英単語をカウントできます。今回は Excel 関数の LEN と SUBSTITUTE を組み合わせて英単語を数えてみます。ちょっと算数みたいなとこがあるけど、そのへんも楽しんでくださいな。
 
LEN は文字数を数える関数です。

=LEN("Kobato")

と入力すると「6」という文字数を返します。SUBSTITUTE 関数はある文字列の中にある文字を別の文字に置き換えます。たとえば

=SUBSTITUTE("こばとちゃん","こばと","マリ")

のように入力すると「こばとちゃん」という文字列の中の「こばと」の部分が「マリ」と置き換えられて「マリちゃん」と返してきます。

【Excel】文章中の英単語を数える方法

それでは、まずシートに次のような例文を用意しましょう。[] は英文が入っているセル番地です。

[B3] Hi! I am Linguistic AI Kobato!
[B4] I was born in Kyoto.
[B5] I will be 1030 years old this year.

1つの文を1つのセルに入れることにして、下図のようなシートを作ります。
 
英単語のカウント
 
最初の文が入っているのは B3 セルです。

=LEN(B3)

は半角スペースも含めた文字数を計算します。そして

=SUBSTITUTE("B3"," ","")

はセル B3 にある英文から、「” “」(半角スペース)を、「””」(何もない状態)に置き換えます。つまり半角スペースを削除して、

Hi!IamLinguisticAIKobato!

という文字列を得ていることになります。この文字列に含まれる文字数は、

=Len(Hi!IamLinguisticAIKobato!)

によって求められます。これを元の英文の文字数から差し引くと、元の英文に含まれていた半角スペースの数となります。そして、それに 1 を加えると単語数が得られるという仕組みです! というわけで、セルC3 には

=LEN(B3)-LEN(SUBSTITUTE(B3," ",""))+1

と入力しましょう。それから、セル C5 まで同じ数式をオートフィルで埋めて、セル C5 には

=SUM(C3:C5)

と入力して合計しておきます。これで全文の単語数をカウントできました。

【VBA】英単語カウンター

英単語をカウントする VBA マクロを作成してみましょう。

'[VBA] 英単語カウンター(1)

Sub Word_Counter_1()

  Dim sentence As String
  Dim counter As String

  '変数に文章を格納
  sentence = "I live in Ikebukuro."

  '英単語の数をカウント
  counter = Len(sentence) - Len(Replace(sentence, " ", "")) + 1

  Debug.Print counter

End Sub

Word_Counter_1() を実行すると、イミディエイトウィンドウに「4」が表示されます。考え方は記事の前半で解説した Excel 関数で処理する場合と同じです。Excel の LEN 関数と同様に、VBA の Len 関数は文字列の長さを返すので、

Len(sentence)

は変数 sentence に格納された文章に含まれる文字数を半角スペースを含めてカウントします。VBA の Replace は指定した文字列を別の文字列に置き換える関数で、

Replace(sentence, " ", "")

は変数 sentence に格納された文章から半角スペースを取り除いた文字列です。これを Len 関数にネストした

Len(Replace(sentence, " ", ""))

は、もとの文章から半角スペースを取り除いた文字列の文字数です。なので、

Len(sentence) - Len(Replace(sentence, " ", "")) + 1

は文章に含まれる英単語の数ということになります。
 
選択したセル範囲に含まれるすべての英単語をカウントするプロシージャも作っておいたので、ほしい人はご自由にお持ち帰りくださいな。

'[VBA] 英単語カウンター(2)

Sub Word_Counter_2()

  Dim sentence As String
  Dim counter As Long

  For Each myrange In Selection
    sentence = myrange.Value
    counter = counter + Len(sentence) - Len(Replace(sentence, " ", "")) + 1
  Next

  MsgBox counter, vbOKOnly, "英単語の数"

End Sub

ChatGPT に英単語を数える VBA マクロを作るように頼むと、次のようなコードを書いてくれました。

'[VBA] 英単語カウンター(3)
Sub CountWords()
    Dim cell As Range
    Dim wordsCount As Integer
    Dim word As Variant

    ' 英単語の数を初期化
    wordsCount = 0

    ' 選択範囲内の各セルに対して処理を実行
    For Each cell In Selection
        ' セルの値を空白で分割して単語を取得
        For Each word In Split(cell.Value, " ")
            ' 取得した単語が英単語かどうかを判定
            If word Like "[A-Za-z]*" Then
                ' 英単語の数をインクリメント
                wordsCount = wordsCount + 1
            End If
        Next word
    Next cell

   ' 英単語の数をメッセージボックスで表示
    MsgBox "選択したセル範囲に含まれる英単語の数は " & wordsCount & " です。"
End Sub

英単語を正規表現パターン “[A-Za-z]*” に一致する文字列として扱うという、高等テクニックを披露してくれました。すごいですね。私もこんなふうに正規表現を使いこなしてみたいです。

コメント

  1. あとりえこばと より:

    【AI解説】英単語カウントのアルゴリズム

    英単語をカウントするためのアルゴリズムは、テキスト処理や自然言語処理のさまざまなアプリケーションで使用されています。以下にいくつか一般的なアルゴリズムを紹介します。

    スペースと句読点で分割する方法:この方法では、テキストをスペースや句読点などの区切り文字で分割し、得られた単語の数を数えます。この方法はシンプルで効果的ですが、英単語以外の文字(例:数字、記号、特殊文字)も含まれる可能性があるため、正確さに欠けることがあります。

    正規表現を使用する方法:正規表現を用いて、単語を識別するためのパターンを定義し、テキスト内でこのパターンに一致する部分文字列を見つけます。正規表現を調整することで、単語の定義をカスタマイズできます。ただし、正規表現のパターンは複雑で、正確性を保つために注意が必要です。

    自然言語処理ライブラリを使用する方法:自然言語処理ライブラリ(例:NLTK、spaCy、Natural Language Toolkit)を使用することで、テキスト内の単語を効率的に抽出できます。これらのライブラリはトークン化(テキストを単語やフレーズに分割すること)や品詞タグ付けなどのタスクをサポートしています。

    単語の出現頻度をカウントする方法:テキスト内の各単語を辞書に追加し、単語がテキスト内で何回出現するかをカウントします。この方法は、テキスト内の単語の出現頻度を知るために使用されます。このアプローチは、単語の一意性を無視するため、重複する単語を正確にカウントできます。

    ストリーム処理を使用する方法:大規模なテキストを処理する場合、メモリの使用量を最小限に抑えるためにストリーム処理を使用することがあります。テキストを一度に読み込み、単語をカウントします。この方法は大規模なデータセットに適しています。

    どのアルゴリズムを選択するかは、特定の要件やテキストデータの性質に依存します。一般的に、自然言語処理ライブラリを使用することが推奨されることが多く、正確で効率的な単語カウントを行うのに役立ちます。