こんにちは、小澤です。
前回までは、スクレイピングについて取り上げました。Webページから必要な情報を取得し、CSVやExcelに保存し、定期実行や分析につなげるところまで紹介してきました。スクレイピングについてはここで一区切りとし、今回からは自然言語処理に入ります。
自然言語処理という言葉を聞くと、文章を理解するAIやチャットボットのような、大きな仕組みを想像するかもしれません。もちろん、そのような技術も自然言語処理に含まれます。ただし、最初から難しい仕組みを作るわけではありません。文章を単語に分け、出現回数を数え、コンピュータが扱える数値に変換するところから始めます。
今回からの連載では、最終的に文章が肯定的なのか、否定的なのかを判定する極性判定をひとつのゴールにします。その準備として、形態素解析、Bag of Words、TF-IDFという考え方を順番に見ていきます。今回は、その全体の流れと、Pythonで自然言語処理を始めるための準備を紹介します。
自然言語処理で何をするのか
これまでの連載では、価格、日付、カテゴリ、URLなどをデータとして扱ってきました。これらは列に分けやすく、件数を数えたり平均を計算したりできます。一方、文章は長さも内容もばらばらです。同じことを説明していても、書き方が違うことがあります。
たとえば、商品の感想として「使いやすいです」「操作が簡単でした」「迷わず使えました」という文章があったとします。表現は違いますが、いずれも使いやすさについて書かれています。また、「使いにくいです」「操作が分かりません」という文章であれば、否定的な評価が含まれていると考えられます。
人が読めば内容や評価をある程度判断できますが、数百件、数千件になると、一件ずつ読むのは不可能に近くなります。そこで、文章をいくつかの処理に分け、Pythonで確認や集計を行います。アンケートの自由記述を整理する、問い合わせを内容ごとに分ける、口コミの評価傾向を見る、といった場面が自然言語処理の活用例です。
今回からの連載のゴール
この連載では、文章を入力すると、肯定的な内容か否定的な内容かを判定するところを目指します。たとえば、「配送が早くて助かりました」は肯定的、「説明が分かりにくかったです」は否定的、といった分類です。このように肯定と否定を分ける処理を極性判定と呼び、感情分析の一つとして扱われます。
もちろん、文章の評価は単純ではありません。「安いけれど壊れやすい」のように、肯定と否定が同じ文章に含まれることもあります。皮肉や前後の文脈まで正確に読み取るのは簡単ではありません。まずは、肯定と否定が比較的分かりやすい短い文章を使い、基本的な流れを確認します。
極性判定までには、いくつかの準備が必要です。日本語の文章を単語に分けること、必要な単語を選ぶこと、単語の情報を数値に変えること、その数値を使って機械学習を行うことです。いきなり判定処理を書くのではなく、一つずつ確認していきます。
日本語を単語に分ける形態素解析
最初に必要になるのが形態素解析です。形態素解析は、文章を意味を持つ小さな単位に分け、品詞などの情報を調べる処理です。たとえば、「今日は天気がよい」という文章を、「今日」「は」「天気」「が」「よい」のように分けます。
英語は単語の間に空白がありますが、日本語は単語の間に空白がありません。そのため、split()で空白を区切りにしても、期待した単語には分かれません。辞書や文法の情報を使って、どこまでが一つの単語なのかを判断する必要があります。
形態素解析をすると、表面に書かれた単語だけでなく、品詞や基本形も確認できます。「使いやすかった」をそのまま一つの文字列として数えるのではなく、「使う」や「やすい」のような情報として扱えるようになります。後で単語の出現回数を数えるときにも、この処理が土台になります。
単語を数値に変える
文章を単語に分けただけでは、まだ機械学習にそのまま渡すことはできません。機械学習では、基本的に数値としてデータを扱います。そこで、どの単語が何回出てきたかを数え、文章を数値の並びに変換します。
代表的な方法がBag of Wordsです。文章の中に単語が何回出てきたかを数える方法で、単語の順番は考えません。「商品」「便利」「使う」といった単語ごとに列を作り、文章ごとの出現回数を記録するイメージです。仕組みが分かりやすく、自然言語処理の入口としてよく使われます。
もうひとつがTF-IDFです。ある文章にはよく出る一方で、ほかの多くの文章にはあまり出ない単語を重く見る方法です。どの文章にも出てくる一般的な単語より、その文章の特徴を表す単語を見つけやすくなります。形態素解析、Bag of Words、TF-IDFを順番に確認すると、文章がどのように機械学習用のデータへ変わるのかが見えてきます。
自然言語処理で使うライブラリ
Pythonには、自然言語処理に使えるライブラリがいくつかあります。日本語を単語に分ける形態素解析では、MeCab、Janome、SudachiPyなどが知られています。また、文章の数値化やトピック分析ではGensim、言語処理の学習や実験ではNLTKなども使われます。
どれを選ぶかは目的や実行環境によって変わります。MeCabは広く使われていますが、本体や辞書の準備が必要になります。SudachiPyは分割単位を選べるなど、日本語を扱うための機能があります。今回は、初学者がPythonから試しやすいJanomeを使います。JanomeはPythonで書かれており、辞書を含んでいるため、比較的簡単に始められます。
ライブラリは一つ覚えれば終わりというものではありません。同じ文章でも、使う辞書や分割方法によって結果が変わることがあります。まずはJanomeで処理の流れを理解し、必要になったところでほかの選択肢を比較するとよいでしょう。
Janomeをインストールする
Janomeは、次のコマンドでインストールできます。仮想環境を使っている場合は、その環境を有効にしてから実行します。
pip install janome
インストールできたら、Tokenizerを読み込み、短い文章を形態素解析してみます。
from janome.tokenizer import Tokenizer
tokenizer = Tokenizer()
text = "商品がすぐに届き、使いやすかったです。"
for token in tokenizer.tokenize(text):
print(token.surface, token.part_of_speech)
token.surfaceは文章に書かれている形、token.part_of_speechは品詞の情報です。実行すると、文章が複数の単位に分かれ、それぞれが名詞、助詞、動詞、形容詞などとして表示されます。最初は結果を眺めて、Pythonがどのように文章を分けたのかを確認するだけで十分です。
実務での注意点
形態素解析の結果は、常に人の感覚と一致するわけではありません。商品名、会社名、地名、業界用語などが、想定と違う単位に分かれることがあります。分析前に数件を表示し、どのように分割されているかを確認することが大切です。必要に応じてユーザー辞書や別の解析器も検討します。
文章データには、氏名、メールアドレス、電話番号などの個人情報が含まれる場合があります。分析に必要がなければ削除や置き換えを行い、元データと処理後のデータを分けて保存します。Webページの文章を利用する場合は、利用規約、著作権、利用範囲も確認します。取得できることと、自由に再利用できることは同じではありません。
今回のまとめ
今回は、自然言語処理の全体像と、Pythonで利用できる主なライブラリを紹介しました。文章を分析するには、形態素解析で単語に分け、Bag of WordsやTF-IDFを使って数値に変換する必要があります。その最初の段階としてJanomeをインストールし、短い文章を形態素解析しました。実行結果から、文章が単語に分けられ、それぞれに品詞の情報が付くことを確認できました。
次回は、Janomeによる形態素解析をもう少し詳しく見ていきます。文章から名詞や形容詞を取り出す方法、基本形を使って表記をそろえる方法、分析に使わない助詞や記号を除く考え方を紹介します。その後、単語の出現回数を数え、Bag of WordsやTF-IDFにつなげていきます。次回もお楽しみに。
