テクノロジー

【自然言語処理初心者必見】Bag of Words(BoW)の実装方法を解説

自然言語処理初心者必見】Bag of Words(BoW)の実装方法を解説

現在ではネット上の翻訳サービスなど多くの場所で自然言語処理が利用されていますよね。そのため、有用なこちらの技術を身につけたいという人も増えているのではないでしょうか。その自然言語処理に用いられているのが、Bag of Wordsです。

ちなみにBag of Words(BoW)とは自然言語処理の形態素解析で用いられる手法のこと。簡単に説明していくと文章を単語に分けた後にそれをベクトルに変換することで、機械学習を利用した自然言語処理が可能になります。

以下ではこのBag of Wordsの基本やBag of Wordsはどんな場面で活躍するのかや、Bag of Wordsを実装するための準備やBag of Wordsを実装する方法を具体的に説明してきましょう。最後にはBag of Wordsを実装する際の注意点やさらにおすすめしたことについてお伝えします。自然言語処理について興味があるのなら、ぜひ以下の内容を読んでみてください。

それでは今回は、自然言語処理で利用されているBag of Words(BoW)の実装方法を解説します。

Bag of Wordsとは

Bag of Wordsのイメージ

それでは、Bag of Wordsがどのようなものであるのかについて簡単に説明しましょう。こちらは以下のようなものです。

  • 自然言語処理の形態素解析で用いられる手法
  • 文章中の単語をベクトルで表現していく

まず、1にあるようにBag of Wordsとは自然言語処理の形態素解析で用いられる手法のことです。ちなみに自然言語処理とは人間が使っている言葉を機械に理解させる技術で、近年ではスマートスピーカーなどでも利用されています。今では私たちの生活で当たり前になりつつあるでしょう。

そして、この自然言語処理の過程で最初に行われるのが形態素解析。こちらは文章を形態素という最小のものに分解していく処理などを行うもので、例えば「白い犬がいる」という文章は以下のように処理されます。

白い 犬 が いる

このように形態素に分けられたら適切な品詞を当てはめたり、活用を考える作業を行うことで、文章をデータの集まりへと変換していくことができます。ただし、この形態素解析を実行しただけでは数値データを得られないので、機械に分析をさせることができません。

そこで形態素解析の後に利用されるのがBag of Wordsという手法です。こちらは文書から得られたデータを入力することで、数値化されたデータが出力されるため、機械でも理解が可能になります。

つまり、このBag of Wordsとは形態素解析から得られる文章データを、機械に理解できるように処理する目的で行われるものなのです。それでは、こちらが具体的にどのようなものであるかというと、2にあるように文章中の単語をベクトルで表現します。

わかりやすくしていくと形態素に番号を割り振って、それを数値化する作業を行うのがBag of Words。詳しくは以下をみてください。

・形態素に番号を割り振る
白い:0 犬:1 が:2 いる:3
・ベクトルを使って数値化する
白い[1,0,0,0] 犬[0,1,0,0] が[0,0,1,0] いる[0,0,0,1]
・Bag of Words(仮に「白い犬」という文章でやった場合)
Bag of Words[1,1,0,0] :やっていることはベクトルの足し算

これによって言語で記された文章が数値データへと変換できます。以上をまとめると形態素解析によって文章を形態素へと変換し、これをBag of Wordsで数値化することで機械学習の自然言語処理が行えるようになるのです。

これがBag of Wordsという手法になります。これを踏まえて以下ではBag of Wordsはどんな場面で活躍するのかを説明してきましょう。

Bag of Wordsはどんな場面で活躍するのか

場面のイメージ

Bag of Wordsは以下のような場面で活躍します。

  1. 自然言語処理の機械学習で役立つ
  2. テキストマイニングを行う際に活躍できる

まず、1にあるようにBag of Wordsは自然言語処理の機械学習で役立つものです。というのも機械学習を行っていく際には、機械が理解できるようにデータを変換していく必要があります。より具体的には数値で表現する必要があるので、それができるBag of Wordsを利用すれば簡単に文章を数値化可能なのです。

また、2にあるようにテキストマイニングを行う際に活躍できます。なお、テキストマイニングとは自然言語処理を利用して、文章からデータをマイニングする技術のことですが、Bag of Wordsでは文章中にどの程度の形態素が出てきたのかをカウント可能です。

そして、その結果から類似度などを判定することができるので、文章間の類似度判定などを行いたいときには、Bag of Wordsを利用すればそれが比較的簡単に行えます。以上が簡単なBag of Wordsがどんな場面で活躍するのかについてです。

それでは、次の章から実際にみなさんの手でBag of Wordsを実装する方法を説明してきましょう。

Bag of Wordsを実装するための準備

準備のイメージ

それでは、Bag of Wordsを実装するための準備について説明を行っていきます。ちなみにBag of Wordsを実装するにはプログラミング言語「Python」を利用するのがよいでしょう。こちらであれば無料で実装が行え、文法なども他の言語と比べて簡単なのでおすすめです。

以下ではこちらでBag of Wordsを実装するための準備をお伝えしてきます。

  1. Pythonの環境構築を行っておく
  2. 任意の文章を分かち書きしておく

まず、1にあるようにPythonの環境構築を行っていきましょう。なお、環境構築とは利用する端末でPythonが使用できる環境を用意すること。こちらについてはPython公式から導入する方法や、anacondaなどのパッケージで導入する方法がありますが、みなさんにとってわかりやすい方法で導入してください。

ちなみにCUI(コマンドプロンプトのようなコマンドラインで入力を行っていく方法)でやりたい場合には公式、GUI(スマホやPCのような通常の操作)でやりたい場合にはパッケージでの導入がおすすめです。(こちらの説明がわからない初心者には、後者のパッケージの方を選ぶのがよいでしょう。)

次に、2にあるように任意の文章を複数用意して、分かち書きしておいてください。ちなみに分かち書きとは文章を単語などで区切っておくことです。例えば、「私はそばが好きです。」という文章なら「私 は そば が 好き です 。」という風に表記します。

今回はこのような文章を複数用意して今のような分かち書きを行ってください。以上の準備が用意できたなら、次の章で実際に実装してみましょう。

Bag of Wordsを実装する方法

実装するイメージ

それでは、Bag of Wordsを実際に実装してみましょう。前提として前の章で説明したことについては必ずやっておいてください。また、以下では次の文章を使って実装していきます。

  • 私 は そば が 好き です 。
  • 私 は 刺身 が 好き です 。
  • 私 は そば が 嫌い です 。

これらを踏まえて以下の説明に沿って実装していきましょう。

  1. Pythonを起動する
  2. 適切なコードを入力してBag of Wordsを実装する
  3. 結果を出力する

まず、1にあるように使用している端末からPythonを起動してください。こちらはコマンドプロンプトなど、みなさんが利用可能なプログラミングしやすい方法で起動しましょう。

次に、起動が完了したら2にあるように適切なコードを入力してBag of Wordsを実装してください。具体的には以下となります。

・任意の分かち書きされた文章を入力する
morphemes = [‘私 は そば が 好き です 。’,
‘私 は 刺身 が 好き です 。’,
‘私 は そば が 嫌い です 。’]

まずは上のように準備した文章を入力しましょう。終わったら以下のように数値変換、Bag of Wordsの作成を行ってください。

数値変換を行う
word2id = {}
for line in morphemes:
for word in line.split():
if word in word2id:
continue
word2id[word] = len(word2id)

こちらは分かち書きされた文章に数値を当てはめていく作業になります。ようは「word2id」に単語と数字を割り振っていくということです。

具体的には「私」という単語ならword2idには{私:0} のように割り振られます。次に以下のように記述してみましょう。

Bag of Wordsの作成
bow_set = [] for line in morphemes:
bow = [0] * len(word2id)
for word in line.split():
try:
bow[word2id[word]] += 1
except:
pass
bow_set.append(bow)
print(*bow_set, sep=”\n”)

こちらは上の数値変換に対してのBag of Wordsを作成していきます。具体的には配列「bow_set」を利用して、要素の集まりである「word2id」に対応するベクトルを作成し、それを足し合わせて文章をベクトル表現する。

{私:0}→[1, 0, 0, 0, 0, 0, 0, 0, 0] 「私 は そば が 好き です 。」→{私:0}+{は:1}+…{。:6}→[1, 1, 1, 1, 1, 1, 1, 0, 0]

最後にそれぞれの文章ベクトルを段落に分けて、みやすく表示させるように記述しています。以上で実装は完了です。

後は3にあるように結果を出力すれば、それぞれの単語がどれくらい出現していたのが、文章ごとに表示されているはずです。なお、今回の場合には以下のようになります。

“””
[1, 1, 1, 1, 1, 1, 1, 0, 0] [1, 1, 0, 1, 1, 1, 1, 1, 0] [1, 1, 1, 1, 0, 1, 1, 0, 1] “””

これでPythonを利用してBag of Wordsが実装できました。ちなみに今回は一番簡単な方法でBag of Wordsの実装を行いましたが、他にもPythonのライブラリを利用して行う方法もあります。

よろしければみなさんで調べてやってみてください。次の章ではこれまで説明を行ってきたBag of Wordsを実装する際の注意点を説明していきましょう。

Bag of Wordsを実装する際の注意点

注意点のイメージ

Bag of Wordsを実装する際には以下の点に注意しましょう。

Bag of Wordsは文章を解釈するという点では劣っている

説明したようにこちらの手法では単語がどの程度出現していたり、文章ごとに類似度を比較することができます。しかし、形態素ごとにみていく関係上、文章を解釈するという点では劣っているという問題点があるのです。

具体的には「犬が人を噛んだ」のような文章をBag of Wordsしてみるとわかりやすいです。実はこちらまったく意味の異なる「人が犬を噛んだ」という文章と同じ結果が出てしまいます。これは使っている単語が同じであるからです。

このように文章としては意味が異なるにもかかわらず、Bag of Wordsでは同じと判断されるため文章の解釈には向いていません。なお、こちらを改良した「Bag-of-n-Grams」という手法で処理を行うと、単語を重複してカウントできるので文章の意味をある程度残すことができます。興味があればどのような手法なのか調べてみてください。

さて、今回は自然言語処理で利用されているBag of Words(BoW)の実装方法を解説しました。これまで以下の点を説明してきました。

  • Bag of Wordsとは自然言語処理の形態素解析で用いられる手法
  • Bag of Wordsは自然言語処理の機械学習で役立つ
  • Bag of WordsはPythonの環境構築、任意の文章を準備すればできる
  • 手順はPythonを起動し、適切なコードを入力して結果を出力すればよい
  • Bag of Wordsは文章を解釈するという点では劣っている

これを踏まえてみなさんに以下を提案したいです。

形態素解析や自然言語処理などをより深く学んでみる

今回説明したBag of Wordsはあくまでも自然言語処理における形態素解析の手法の1つです。これ以外にも上で触れたようなBag-of-n-Gramsなどの手法や、自然言語処理を理解するために必要な知識はたくさんあります。

ですから、将来この自然言語処理をキャリアに生かしたいのであれば、より深く学んでみてはどうでしょうか。そうすればもしかするとみなさんの手で、あのGAFAなどが行ったような革新的なサービスを生み出せるかもしれません。

ぜひ、興味があれば今すぐに学び始めてみましょう。

【お知らせ】

当メディア(AIZINE)を運営しているAI(人工知能)/DX(デジタルトランスフォーメーション)開発会社お多福ラボでは「福をふりまく」をミッションに、スピード、提案内容、価格、全てにおいて期待を上回り、徹底的な顧客志向で小規模から大規模ソリューションまで幅広く対応しています。

御社の悩みを強みに変える仕組みづくりのお手伝いを致しますので、ぜひご相談ください。

お多福ラボコーポレートサイトへのバナー

トップへ戻る
タイトルとURLをコピーしました