Pythonで自然言語処理を行おうと思っても、どのような手順で行うのか分からない方もいると思います。
この記事では、Pythonで自然言語処理を実装する方法や、学んでおきたい知識について詳しく解説します。
Pythonでできること
Pythonとは1991年にオランダ人のグイド・ヴァンロッサムというプログラマーによって開発され、オープンソースで運営されているプログラミング言語です。
その用途は様々で、組み込み開発や、Webアプリケーション、デスクトップアプリケーション、さらには人工知能開発、ビッグデータ解析などと多岐に渡ります。
機械学習の開発ができる
Pythonは、人工知能を搭載したソフトウェア、とりわけ機械学習を用いたソフトウェアの開発の分野で広く活用されています。コードが簡潔であるだけでなく、初めて機械学習を学ぶ人にとっても習得しやすい言語であるため、機械学習を学ぶ際には基本のプログラミング言語といえます。
さらに、Pythonは統計処理や数値計算を得意とするプログラミング言語です。こうした特性もPythonが機械学習やディープラーニング、さらにはデータ解析の処理によく用いられる理由の1つです。具体的にはTensorFlow(テンソルフロー)という機械学習ライブラリがディープラーニング・ニューラルネットワークの分野で活用されています。
ゲーム・アプリケーションの開発ができる
Pythonを使うとゲーム、組み込みアプリケーション、デスクトップアプリケーションなど様々な分野のプログラムを作ることができます。Pythonは数多くのライブラリをそろえているのであらゆる分野で幅広い開発が行われているのです。
Pythonで自然言語処理(NLP)をする方法
続いて、Pythonで自然言語処理をする方法について解説します。具体的には、自然言語処理を行う上で使うライブラリを紹介します。ライブラリは次の4種類です。
・機械学習ライブラリ
・Mecab
・GiNZA
・NLTK
これらのPythonライブラリを使いこなすことで、比較的簡単に自然言語処理ができます。1つ1つのライブラリの詳細について解説していきます。
機械学習ライブラリ
まず覚えるべきは機械学習ライブラリです。Pythonには多くの機械学習ライブラリがあり、これらを使いこなすことで効率的に機械学習を行えるようになります。
たとえばNumpyというライブラリがあります。これは高度な計算を素早く行えるものです。他にも、Pandasというデータの加工や可視化が行えるライブラリがあります。
こういったライブラリは自然言語処理を行う上でもお世話になるでしょう。ライブラリの使い方を解説した書籍も多く販売されているので、買ってみることをおすすめします。
Mecab
Mecabは形態素解析を行うためのライブラリです。日本語の形態素解析を行えるライブラリといえばこれでしょう。MecabはPythonだけでなくC++やJavaでも扱うことができます。
Mecabを用いることで、文章を最小単位に分割することができます。また、様々な辞書を用いることができます。
GiNZA
GiNZAは、無料で使える日本語の自然言語処理ライブラリです。形態素解析などの他に、係り受け解析が可能です。単語同士の関係性を明らかにすることができます。
十分な処理速度と解析精度を実現しており、おすすめのライブラリです。
NLTK
NLTKは英語用の自然言語ライブラリです。英語のテキスト構文解説や品詞タグ付け、意味解析などをこれ1つで行えます。
英語の自然言語処理を行うなら、おすすめのライブラリです。
Pythonで自然言語処理(NLP)に関わる手法を実装
ここからは、Pythonで自然言語処理に関わる実装方法を解説していきます。
実装する前の前処理
まずは、細かな前処理が必要になります。
正規化
日本語には「2」と「2」、「ネコ」と「ネコ」など半角文字と全角文字があります。これらが混ざっていると、同じ意味なのに違う単語IDに振り分けられてしまうことが起こります。
それを防ぐために単語辞書を作るのと同時に、または分かち書きする前に正規化しましょう。
上のPyPiリンクのライブラリは、半角や全角文字を統一してくれる。便利な機能をもっています。
絵文字
絵文字も除去する必要がある場合があります。
上のPyPiリンクのライブラリは、絵文字を取り扱えるようにしてくれる便利な機能をもっています。
Stop Word
Stop Wordとは、全文検索などで一般的すぎて検索の邪魔になる単語をいいます。英語なら「The」や「a」など日本語なら「て」「に」「を」「は」などです。これらを取り除くことで、計算量の節約、学習精度を上げることができます。
ただ、あくまで全文検索、つまり検索エンジンのアルゴリズムからきているので、100%自然言語処理の学習において、正しいとは言い切れません。
なぜなら、「私は今日朝10時に起きた。」こんな文があり、「私に今日を朝10時に起きた。」や「私を今日は朝10時に起きた。」になると不自然な文になります。いろいろな考え方ややり方があると思いますが、とりあえずStop Wordの除去をPythonで実装してみましょう。
品詞ごとに分類
続いて品詞、例えば「名詞」「形容詞」「動詞」に絞って分類してみます。感情分析や、レコメンドシステムを作る際に便利です。
MeCabで形態素解析の実装
まずは適当なスクリプトファイルにコードを書いて形態素解析を出力してみます。
デフォルトの設定では以下のように出力されます。
他にも、オプション機能として4種類程の出力フォーマットを呼び出すことができます。「4種類程」と言った理由は、標準で用意されているオプションの4種類以外にユーザーがフォーマットを自由に定義できるようになっているからです。詳しくはMeCab公式の出力フォーマットをご参照ください。では4種類のオプションをそれぞれ見ていきましょう。
分かち書きオプション
分かち書きとは、文章の単語を空白で区切ることと言われています。では実際に「MeCab.Tagger()」の引数にオプションを追加して実行してみます。
振り仮名オプション
振り仮名オプションを使うと、文字に対しての読み仮名を出力します。
ChaSen(茶筌)オプション
ChaSenとは、茶筌システムとも呼び、奈良先端科学技術大学院大学情報科学研究科自然言語処理学講座(松本研究室)が保持する、形態素解析ソフトウェアの事です。その茶筌の解析器を使用して出力することができます。
各単語の詳細情報を出力する
このオプションは単語に含まれる全情報を出力することができます。
mecab-ipadic-NEologdオプション
このオプションは、MeCab導入時に設定する、「新語」が適用されている辞書を使用する方法です。
MeCabのコマンドオプション「-d/usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd」と同じように「MeCab.Tagger()」の引数にそのまま渡します。
今まで「形態素」と「解析」で分割されていましたが、1つの名詞として「形態素解析」が出力されるようになりました。
文章をベクトル化する(Baf of Words)
それでは文章をベクトル化してプログラムで処理できるかたちに変換してみましょう。ベクトル化する技術には様々な方法がありますが、今回は最も基本的なBag of Wordsという手法をご紹介します。
Baf of Words
下記のような4つ文章がある状態を考えます。
A:私は猫が好きです
B:私は猫が嫌いです
C:私は犬が好きです
D:私は犬が嫌いです
これらの文章をそれぞれ形態素に分解します。
=Pythonコード====
import MeCab
wakati=MeCab.Tagger(“-Owakati”)
sentence_list = [“私は猫が好きです”, “私は猫が嫌いです”, “私は犬が好きです”, “私は犬が嫌いです”]
sentence_wakati_list = [wakati.parse(i).split() for i in sentence_list]
print(sentence_wakati_list)
==============
=出力結果=======
[[‘私’, ‘は’, ‘猫’, ‘が’, ‘好き’, ‘です’],[‘私’, ‘は’, ‘猫’, ‘が’, ‘嫌い’, ‘です’],[‘私’, ‘は’, ‘犬’, ‘が’, ‘好き’, ‘です’],[‘私’, ‘は’, ‘犬’, ‘が’, ‘嫌い’, ‘です’]]
==============
形態素に分解すると下記のようになります。
A:私 / は / 猫 / が / 好き / です
B:私 / は / 猫 / が / 嫌い / です
C:私 / は / 犬 / が / 好き / です
D:私 / は / 犬 / が / 嫌い / です
ここでそれぞれの文章の中身に注目してみると、「私」「は」「猫」「犬」「が」「好き」「嫌い」「です」という8つの形態素で構成されていることがわかります。縦軸に文章、横軸にそれぞれの文の中にどの形態素が含まれているかを「0」又は「1」でフラグ付けしたマトリクスになります。
これが最も簡単なBag of Wordsの形です。Pythonでは下記を実行することでBag of Wordsを作成することができます。
=Pythonコード====
import numpy as np
word_to_index = {}
index_to_word = {}
for s in sentence_wakati_list:
for w in s:
if w not in word_to_index:
new_index = len(word_to_index)
word_to_index[w] = new_index
index_to_word[new_index] = w
corpus = np.zeros((len(sentence_wakati_list), len(word_to_index)))
for i, s in enumerate(sentence_wakati_list):
for w in s:
corpus[i, word_to_index[w]] = 1
==============
Bag of Wordsでできること
Bag of Wordsを作成したことで、文章をベクトルに変換することができました。ベクトルに変換することでプログラム上での処理が可能になります。例えば文章間の類似度を定量的に計算することができます。
A:私は猫が好きです
B:私は猫が嫌いです
C:私は犬が好きです
D:私は犬が嫌いです
再度上記の文章を例に「AとB」の類似度「AとC」の類似度「AとD」の類似度を計算します。類似度の計算にはcos類似度という方法を使用します。
=Pythonコード====
def cos_sim(x, y):
return np.dot(x, y) / (np.sqrt(np.sum(x**2)) * np.sqrt(np.sum(y**2)))
for i, v in enumerate([“B”, “C”, “D”]):
per = cos_sim(corpus[0], corpus[i + 1])
print(v + “:” + f”{per:.2}”)
==============
=出力結果=======
B:0.83
C:0.83
D:0.67
==============
・AとBの類似度:0.83
・AとCの類似度:0.83
・AとDの類似度:0.66
このような結果になりました。文章をみてもわかるように「AとB」「AとC」は異なる単語が1つだけですが、「AとD」は異なる単語が2つ存在しています。従って「AとD」が一番類似度が低いという結果になっています。このように文章をベクトル化することで定量的に文章の類似度を計算することができます。
BERTの実装方法
BERTが実装された背景には、音声認識サービスの普及と検索クエリの多様化が挙げられます。現在、検索時に利用されているデバイスの主流はスマートフォンであると言えるでしょう。
例えば「電気をつけて」と指示した場合に、音声認識サービスが指示を認識して実行してくれます。このような生活における自然言語による指示は複雑化しやすい傾向にあります。そのため、文脈を理解し、複雑化した指示にも対応していけるようなモデルが実装されたと言えます。
BERTの使い方
BERTを活用していく上で、事前学習の内容をしっかりと把握することが重要になってきます。明確に事前学習の内容を把握している場合には、ファインチューニング時の入力シーケンスの形式やどのような学習をさせるのかという判断を下しやすくなります。
BERTを使うことによって、検索したクエリに対してより精度の高い検索結果を得ることが可能なため、ユーザーにとっても大きなメリットがあると言えます。
Pythonを用いて日本語タスクでBERTを実装する際の注意点
Pythonを用いてBERTを実装する際には、BERT自体が巨大なモデルであるという点に注意しなければなりません。BERTは巨大なモデルである為、学習に対して多くの時間を要します。また、事前学習などにおいて、大量のデータが必要とされます。そのため、学習に対して多くの時間が必要な上、大きなメモリ量が必要とされる点など注意が必要です。
一般に配布されているBERTモデルにおいて、精度を上げる目的でパラメータを増やした場合、一定基準を超過すると精度が落ちてしまうといった点にも注意しなければなりません。
また、日本語タスクでBARTを扱う際は、単語分割にも注意が必要です。オリジナルのBARTでは多言語に対応していますが、ほぼ文字単位での単語分割になってしまいます。そのため、形態素解析器を用いるのが一般的です。
Pythonで自然言語処理(NLP)するために何を学ぶべきか?
それでは、Pythonで自然言語処理を行うために、学んでおきたいことがいくつかあります。参考にしてほしい、おすすめサイトや書籍を厳選しご紹介します。
・Progate
・言語処理100本ノック2020
・機械学習・深層学習による自然言語処理入門
・ythonで動かして学ぶ自然言語処理入門
自然言語処理に興味があるなら、こういったサイトや書籍にまずは目を通してみましょう。1つ1つのサイトや書籍について、詳しく解説していきます。
Progate
1つ目はProgateです。ProgateはPythonの文法基礎を習得する上でおすすめのサイトですね。Progateはわかりやすいスライドで学ぶことができます。
スライドにはイラストや図が多く使われており、文字だけでは理解しにくい部分もしっかり分かります。加えて、単元の最後には練習問題もあり、習熟度を確かめながら進めていくことができます。
Python未経験者の方は、まずはこういった学習サイトで勉強するのがおすすめです。
言語処理100本ノック2020
こちらは、自然言語処理の練習問題が100問も集められたサイトです。昔からあるサイトですが、2020年にリニューアルされて問題が新しくなりました。
データ分析や自然言語処理のスキルを楽しんで身につけることができます。全体的に良問が多く、企業の研修などでも使われることがあるようです。
100問も問題を解けば、相当なスキルが身につきます。最初の方の問題は比較的簡単で、初心者でも解くことが可能です。Pythonの基礎が身についたら、こちらにチャレンジしてみるのが良いでしょう。
機械学習・深層学習による自然言語処理入門
日本語のデータで自然言語処理が学べる一冊です。機械学習の基礎的なところから詳しく解説されています。
自然言語処理に必要な前処理、特徴抽出、学習方法など、全体的にまんべんなく解説されておりおすすめです。
Pythonで動かして学ぶ自然言語処理入門
こちらはPythonでの自然言語処理が学べる一冊です。Pythonライブラリを利用して、どのように自然言語処理を組み込んだアプリケーションを作るか解説されています。
ythonでの自然言語処理を習得するなら、手元においておきたい一冊です。
まとめ
この記事では、Pythonでの自然言語処理について解説しました。自然言語処理を行ううえで必要なスキルや準備を理解していただけたと思います。
自然言語処理は、Pythonなどの知識も必要なので基礎部分を学習する必要があります。Pythonをある程度学んだ方は、自然言語処理についても学び、実際に実装できるまでにレベルをあげてみてはいかがでしょう。