Python機械学習アルゴリズム学習備忘録。今回は自然言語処理について。
内容は、Udemy の「【世界で74万人が受講】基礎から理解し、Pythonで実装!機械学習26のアルゴリズムを理論と実践を通じてマスターしよう」で学んだ内容を自分用備忘録としてまとめたものです。
参考:みんなのAI講座 ゼロからPythonで学ぶ人工知能と機械学習
自然言語処理とは
そもそも自然言語処理とは。
自然言語処理(しぜんげんごしょり、英語: natural language processing、略称:NLP)は、人間が日常的に使っている自然言語をコンピュータに処理させる一連の技術であり、人工知能と言語学の一分野である。
https://ja.wikipedia.org/wiki/%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86
自然言語処理自体は、昔からある機械学習の分野の一つで、古くからあるアルゴリズムも多く存在する。
ただ、最近では、昔から存在する自然言語処理の分野とDeep Learning(深層学習)の分野が発展したことで、より複雑な処理を用いて高い精度で処理を行えるようになってきている。
目次に戻る自然言語処理の種類について
NLP : Natural Language Processing (自然言語処理。Deep Learning等が発展する前からある理論や考え方の分野)
DL : Deep Learning (深層学習。複雑な演算により、人間が直感的に見つけられないような特徴や法則を機械に導き出させる手法)
⇛この2つの分野をかけ合わせた分野:Deep Natural Language Processing
1. If/Else Rules (Chatbot)
自然言語処理の種類の1つとして、If/Else Rulesと呼ばれるものがある。
イメージとしては、銀行や携帯キャリアなどのwebサイトにアクセスした際に画面の下の方に出てくるようなChatbot(チャットボット)サービスのようなものがある。(バックに実際のオペレーターがいる場合は別。)
事前に用意された質問文を投げかけ、利用者の回答に応じて、条件分岐し、回答を返す仕組み。
例:携帯キャリアの場合
お問い合わせ内容は、なんですか。
1. 料金について
2. 機種変更について
3. その他
1. 料金について
1. 料金について、ですね。
料金についてどんなことが知りたいですか。
1. 料金プランの変更
2. 料金プランの確認
3. その他
みたいな感じで、選択肢を選ぶと次の選択肢が現れ、会話が続いていく、というイメージですね。
2. 音声認識
次に、音声認識。これも言語処理の分野の一つ。
音声認識の場合は、言語の音声を物理的な音の波として認識し、その波形のパターン・特徴を分析・解析することで言葉を認識していく方法。これも昔からある言語処理の分野の一つ。
3. Bags-Of-Words model (分類)
次に、Bags-Of-Words modelについて。
これは、機械学習とDeep Learningの間のような内容。
言語を定量的なデータとして解析し、その特徴量やパターンから、ある言葉が出たらある言葉を返す、といったモデルを作っていく。今回実装していくのはこの手法。
言語の前処理の部分以外は基本的に機械学習の分類と同じなので、ロジスティック回帰やナイーブベイズなどの機械学習における分類のアルゴリズムの中から、一番もっともらしい結果を返すアルゴリズムを用いていくと良い。
分類のアルゴリズムについても今回受講しているUdemyの講義の中で解説されているので、別途備忘録を作成する予定。
4. CNN for Text Recognition (分類)
最後にCNN (Convolutional Neural Network、畳み込みニューラルネットワーク)を用いた手法。CNNについてもまた別途備忘録を作成予定だが、基本的に深層学習(ディープラーニング)の分野。ディープラーニングを用いた複雑な演算により、言語からパターンを抽出していく。
Bags-Of-Wordsの直感的な理解
例えば、Yes/No Questionがあるとして、それに対してある人がどう答えるかを予測するモデルを作ることを考える。
言語は英語で考える。
このとき、例えば英単語として20,000種類の単語があるとする。この20,000種類の単語に対してすべてを定量データであるベクトルに変換していく。
そのベクトル化した20,000種類のデータに対して、課題となる文章がどんな値を含んでいるか、で文章を分類するモデルになる。
他にも、レストランのレビューコメントとそのレストランを気に入ったかどうかの結果を用いて、どんな単語が入っていると好意的なレビューか、というようなレビューの感情分析などを行うことができるようになる。
なんとなくまだわかりにくいような気がするので、Qiitaなどで補足するといいかもしれない…。
参考:テキスト処理総まとめ〜Bag-of-Words, MeCab, CaboCha, TF-IDF, Word2Vec, Doc2Vec〜
Pythonによる実装 1 -ライブラリのインポート-
ここからPythonによるBags-Of-Wordsの実装を行っていく。まずはいつもどおりライブラリのインポートから。なお、今回は英語を対象言語としていく。日本語は、ひらがな、カタカナ、漢字と文字が3種類あったり、言葉どうしのつなぎが複雑だったりと、世界的に見ても複雑な言語とされており、処理が複雑化する。今回はアルゴリズムの大まかな理解を目的とし、英語を対象言語とする。
import numpy as np
import matplotlib,pyplot as plt
import pandas as pd
import re # pythonで正規表現を使うためのライブラリ
Pythonによる実装 2 -データセットのインポート-
次に分析対象の文章が入っているデータセットをインポートしていく。
今回はtsv形式のファイルを使用していく。tsvのtは、Tab(タブ)のt。
csvファイルがコンマで区切られているのに対して、tsvはタブで区切られている形式のファイルを指す。
csv形式だと、データの区切りとしてのコンマと、英文の中に出てくるコンマとの区別が付きづらく、処理が複雑になるため、今回はtsv形式としている。
そのため、引数delimiterを’\t’としている。また、もう一つの引数quoting = 3となっているのは、例えば”” (ダブルクオーテーション)のようなPythonにおいて特殊な意味を持つ記号などが文章に含まれている場合、それをそういった特殊記号としてではなく、単純に文字列として認識させるために設定している。
dataset = pd.read_csv('ファイル名.tsv', delimiter = '\t', quoting = 3)
Pythonによる実装 3 -文章のクリーニング-
次に処理対象の文章のクリーニングを行っていく。先程importとしたモジュールやライブラリを使って、対象とする文章から処理結果に直接影響を与えないような不要な部分を削除していく。
import nltk # 言語処理に使用するライブラリ
nltk.download('stopwords')
from nltk.corpus import stopwords # stopwordsとは、英語のinやaのような直接的な意味を持たない機能語などのこと
from nltk.stem.porter import PorterStemmer # 言語処理では例えばLike, Likedのような意味的にほぼ同じな動詞の活用形などを統一し、なるべく演算を軽く、シンプルにしていく必要がある。
corpus = [] # 前処理を施した文章を格納していくリスト
for i in range(0, 1000): # データセットの行の数だけ処理を繰り返す内容。今回は1000行あると仮定。
review = re.sub('[^a-zA-Z]', ' ', dataset['項目名'][i])
# re.sub() : 正規表現で文字情報の置き換えを行う。"^〇〇"の形で、〇〇以外、という意味になる。
# 今回は、[^a-zA-Z]で、アルファベット以外の文字を、' ' (スペース)に置き換えている。
review = review.lower() # 大文字を小文字に変える
review = review.split() # 単語ごとに区切る
ps = PorterStemmer()
review = [ps.stem(word) for word in review if not word in set(stopwords.words('english'))]
# stopwords.words('english')で英語での機能語
# stopwordsが変数reviewの中に入っていなければ、変数wordに格納する。
# 最後に、ps.stem(word)で不要な機能語が入っていない単語をPorterStemmer()に入れ、動詞の活用形の統一をしていく。
review = ' '.join(review) # 処理が完了した単語どうしを一つの文章としてくっつける。
corpus.append(review)
Pythonによる実装 4 -Bags Of Wordsモデルの作成-
対象の文章のクリーニングが完了したら、いよいよBags Of Wordsモデルを作成していく。
from sklearn.feature_extraction.text import CountVectorizer # sklearnの特徴抽出用モジュールの中で文字情報の定量化に使うもの
cv = CountVectorizer(max_features=1500)
# max_features : あまり出てこない単語や重要度の低い単語が入っていることを考慮し、特徴量の最大値を制限し、分類精度向上を図るもの。1,500という数字は感覚的なもの。
X = cv.fit_transform(corpus).toarray() # fit_transformで演算し、toarray()で2D-arrayに変換
y = dataset.iloc[:, 1].values
Pythonによる実装 5 – データセットの分割 (訓練用とテスト用)-
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = 0)
# データセットを訓練用80%, テスト用20%の割合で分割していく。
Pythonによる実装 6 -分類モデルを使った訓練用データの学習-
分類のアルゴリズムを使って、訓練用データを学習していく。
分類のアルゴリズムは、いくつかあり、対象となるデータや得たい結果などに応じてもっともらしいものを選択していく。
個々の分類アルゴリズムについては別途備忘録を書こうかなあと思っているので詳細は割愛。
フィーチャースケーリング
フィーチャースケーリングとは何か:【機械学習】脳死で標準化したい!(StandardScaler)
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
ナイーブベイズモデル
from sklearn.naive_bayes import GaussianNB
classifier = GaussianNB()
classifier.fit(X_train, y_train)
決定木
from sklearn.tree import DecisionTreeClassifier
classifier = DecisionTreeClassifier(criterion = 'entropy', random_state = 0)
classifier.fit(X_train, y_train)
K近傍法
from sklearn.neighbors import KNeighborsClassifier
classifier = KNeighborsClassifier(n_neighbors = 5, metric = 'minkowski', p = 2)
classifier.fit(X_train, y_train
カーネルサポートベクトルマシン
from sklearn.svm import SVC
classifier = SVC(kernel = 'rbf', random_state = 0)
classifier.fit(X_train, y_train)
ロジスティック回帰
from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression(random_state = 0)
classifier.fit(X_train, y_train)
ランダムフォレスト
from sklearn.ensemble import RandomForestClassifier
classifier = RandomForestClassifier(n_estimators = 10, criterion = 'entropy', random_state = 0)
classifier.fit(X_train, y_train)
サポートベクトルマシン
from sklearn.svm import SVC
classifier = SVC(kernel = 'linear', random_state = 0)
classifier.fit(X_train, y_train)
Pythonによる実装 7 -テストデータによる結果の予測-
上記どれかの分類アルゴリズムを使って訓練用データの学習をした後、その精度や汎用性を確認するために、テスト用データで結果を予測していく。
y_pred = classifier.predict(X_test)
Pythonによる実装8 -混同行列の作成とモデルの評価-
混同行列の作成と、正解率(accuracy)、適合率(precision)、再現率(recall)、f1 scoreを算出し、モデルの評価を行っていく。
- 正解率 (accuracy):全予測に対する正答率 (全予測結果に対してpositiveとnegativeを正しく予測した割合)
- 適合率 (precision) : positiveと予測したデータのうち、実際にpositiveであるものの割合
- 再現率 (recall) : 実際にpositiveであるもののうち、positiveと予測されたものの割合
- f1 score : 適合率と再現率の調和平均
参考:【入門者向け】機械学習の分類問題評価指標解説(正解率・適合率・再現率など)
コメント