機械学習による自然言語処理
本章の構成
- 実装の流れ
- データの収集
- クリーニング処理
- 単語の正規化
- 形態素解析
- 基本形への変換
- ストップワード除去
- 単語の数値化
- モデルの学習
- オープンデータセットについて
実装の流れ
早速実装といきたいところですが、まず機械学習による自然言語処理(以下:自然言語処理)の流れを把握しておきましょう。前の章であつかった基礎技術について、文章から特徴を抽出するために様々な操作が必要となります。
自然言語の前処理は特に複雑であり、また重要なものです。はじめに地図を頭に入れ、それぞれの意味合いを抑えておくと理解が早くなります。わからなくなったらまたここに戻って確認しましょう。
以下が自然言語処理の流れです。
データの収集
- 解決したいタスクに応じてデータを収集する
クリーニング処理
- HTMLのタグなど意味を持たないノイズを削除する
単語の正規化
- 半角や全角、小文字大文字などを統一する
形態素解析(単語分割)
- 文章を単語ごと分割する
基本形への変換
- 語幹(活用しない部分)への統一を行う
- 例:学ん(だ)→学ぶ
- 昨今の実装では基本形へ変換しない場合もある
ストップワード除去
- 出現回数の多すぎる単語など、役に立たない単語を除去する
- 昨今の実装では除去しない場合もある
単語の数値化
- 機械学習で扱えるよう文字列から数値へ変換を行う
モデルの学習
- タスクに合わせ、古典的な機械学習~ニューラルネットワーク選択する
それでは、この流れのうち前処理にあたるものを把握しておきましょう。
クリーニング処理
オープンデータ、Web の情報を直接収集すると html
タグやメールのヘッダなどが付与されている事が多くあります。これは本質的なデータではないため、多くの場合ノイズとして働きます。これを取り除く行為がクリーニング処理です。
この実装には主に
- Beautiful Soup
- 標準ライブラリ re モジュール
を使用します。
text = '<html>Deep Learningにはマシンリソースが必要です。</html>'
from bs4 import BeautifulSoup
soup = BeautifulSoup(text, 'html.parser')
text = soup.get_text()
text
単語の正規化
言語には表記ゆれがあります。以下に具体例のリストを示します。
- 送り仮名によるもの
- 「行う」と「行なう」
- 「受付」と「受け付け」
- 文字の種類
- 「りんご」と「リンゴ」
- 「犬」と「いぬ」と「イヌ」
- 大文字と小文字
- Apple と apple
本質的には同じものですが、機械学習モデルにはこれが同一のものであると判断できません。したがって、私達の側で統一の処理を行います。
text = text.lower()
text
形態素解析
文章データは単語ごとに処理をすることにより、多くの情報を入手できます。しかしながら、日本語は句読点以外に文章を区切りを明らかにするものがありません。
このために必要となる処理が形態素解析による単語の分かち書きです。
実装に使用するツールとしては
- MeCab
- Janome
- JUMAN++
などが存在します。
import MeCab
mecab = MeCab.Tagger('-Owakati')
text = mecab.parse(text)
ret = text.strip().split()
ret
基本形への変換
日本語の用言(動詞、形容詞、形容動詞)には活用が存在します。例として「歩く」の場合、「歩く」、「歩き」、「歩け」などです。
この活用形は場合によっては複雑性が増してしまいうため、統一させることにより単純化を目指します。
しかしながら、語幹への変形を行うということは活用の情報を失うということです。したがって会話ボット等のタスクではこの操作は行いません。
実装に使用するツールとしては
- MeCab
などが存在します。
ストップワードの除去
ストップワードとは文章内であまり意味を持たない単語のことです。「てにをは」などの助詞は出現数が多すぎるため、例えば文章の分類を行う際の有用な特徴にはなり得ません。このようにタスクに関係のない単語を取り除く処理をストップワードの除去といいます。
実装方法としては
- ストップワードをまとめた辞書との一致検索
- 出現頻度による削除
が存在します。
# 空のリストを用意
word_list = []
# 辞書の用意
stopword = ['に', 'は', 'が', 'です', '。']
# 辞書に無いものをリストに追加
for word in ret :
if word not in stopword:
word_list.append(word)
word_list
実装の都度この図を用いて説明しますので、今全体図を暗記する必要はありません。ただ、この流れを知っていると理解度が大きく変わるため、実装する際は「今自分がどこにいるのか」逐一確認してください。
オープンデータセットについて
最後にデータの収集先を抑えておきましょう。タスクがきまっており、手元にデータがあることがベストですが、そういった状況はあまり多くありません。 したがって、多くの場合オープンデータセットを利用する、もしくはなんらかの方法でデータを収集するところから始まります。はじめに、本節ではオープンデータセットに焦点を置き代表的なものを紹介します。
オープンデータセットとはある団体が保有しており、自由に活用できるよう公開しているデータのことです。企業だけではなく、最近だと政府や自治体も積極的にデータの公開を行っています。個人でのデータ収集には限界があるため大変ありがたい取り組みです。
以下に代表的なデータセットをご紹介します。
日本政府や自治体
https://www.data.go.jp/
教育機関
- 東北大学 乾・鈴木研究室 Open Resources
- 首都大学東京 自然言語処理研究室(小町研)
- 京都大学 黒橋・河原・村脇研究室 自然言語処理のためのリソース
- Graham Neubig 日本語対訳データ
民間、企業
- 青空文庫
- livedoorニュースコーパス
- Amazonレビューデータセット
Kaggle Dataset
https://www.kaggle.com/datasets
オープンデータについていくつか使い方を考えてみます。
機械翻訳機を作りたいとなれば「日本語対訳データ」が使えそうです。入力変数を日本語、目的変数を英語にすればよいわけですね。小説のレコメンドエンジンが作りたいとなれば「青空文庫」が使えるでしょう。こちらは、著作権切れになった小説家の文章についてフリーでまとめられているサイトです。小説のデータを集めること自体が私達にとっては大変であるため、うってつけのデータといえるのではないでしょうか。
このように、データが手元にない場合でもオープンデータセットを用いればすぐに実装へと移ることが可能です。一会社員として企業のデータにアクセスすることはなかなかに大変な作業ですが、その際に、オープンデータを用いてプロトタイプを作れば説得材料を作ることができます。
紹介したデータセット以外にも沢山の種類がありますので、是非皆さんのタスクに応じてお調べになってください。