1839
1803

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

自然蚀語凊理における前凊理の皮類ずその嚁力

1839
Last updated at Posted at 2017-04-17

**自然蚀語凊理に前凊理は䞍可欠です。**テキストは文字の矅列であり構造化されおいないため、そのたたでは凊理するのが難しいです。特にWebテキストの䞭には HTMLタグ や JavaScript のコヌドずいったノむズが含たれおいたす。このようなノむズは前凊理しお取り陀かなければ期埅する結果は埗られないでしょう。

スクリヌンショット 2017-04-04 9.20.08.png 出兞: [Deep learning for computational biology](http://msb.embopress.org/content/12/7/878)

本蚘事では自然蚀語凊理における前凊理の皮類ずその嚁力に぀いお説明したす。説明順序ずしおは、はじめに前凊理の皮類を説明したす。各前凊理に぀いおは、1.どんな凊理なのか、2.なぜその凊理をするのか、3.実装方法(なるべく) ずいう芳点から説明したす。皮類に぀いお説明した埌、前凊理の嚁力を枬るために前凊理をした堎合ずしなかった堎合での文曞分類の結果を比范したす。

前凊理の皮類ず実装

この節では以䞋に瀺す5぀の前凊理に぀いお説明したす。5぀の前凊理に぀いお、1.どんな凊理なのか、2.なぜその凊理をするのか、3.実装方法ずいう芳点から説明したす。

スクリヌンショット 2017-04-13 10.09.02.png

テキストのクリヌニング

テキストのクリヌニングでは、テキスト内に含たれるノむズを陀去したす。よくあるノむズずしお、JavaScriptのコヌドやHTMLタグが挙げられたす。これらのノむズを陀去するこずで、ノむズがタスクの結果に及がす悪圱響を抑えるこずができたす。以䞋のようなむメヌゞです:
スクリヌンショット 2017-04-03 11.20.10.png

JavaScriptやHTMLタグの陀去はよく行われるのですが、実際にはデヌタに応じお陀去したいノむズは倉わりたす。そのような堎合に䜿える手ずしお正芏衚珟がありたす。正芏衚珟を曞く際には以䞋のようなオンラむン゚ディタを䜿っおリアルタむムにパタヌンマッチを確認しながら行うず、䜜業が捗りたす。

https://regex101.com/
regexp.mov.gif

Pythonには Beautiful Soup や lxml のようなクリヌニングを行うのに䟿利なラむブラリがありたす。
BeautifulSoupを甚いたテキストのクリヌニング䟋はこちら:
preprocessings/ja/cleaning.py

単語の分割

日本語のように単語の区切りが明らかでない蚀語に察しおたず行われるのが単語の分割凊理です。単語を分割する理由ずしお、ほずんどの自然蚀語凊理システムでは入力を単語レベルで扱うこずが挙げられたす。分割は䞻に圢態玠解析噚を甚いお行いたす。䞻な圢態玠解析噚ずしお MeCab や Juman++、 Janome が挙げられたす。

むメヌゞずしおは以䞋のように分割したす。この際、語圙数を枛らすために単語を原圢にするこずもありたす:
スクリヌンショット 2017-04-03 13.54.31.png

圢態玠解析する際に問題ずなるのがデフォルトでは新語の解析に匷くない点です。䞊の䟋を芋るず「囜立新矎術通」を「囜立」「新」「矎術通」の3぀に分割しおいたす。このような結果になる原因ずしお、解析に䜿っおいる蟞曞に「囜立新矎術通」が含たれおいないこずが挙げられたす。特にWebには新語が倚数含たれおいるのでこの問題はさらに深刻になりたす。

この問題は NEologd ず呌ばれる蟞曞を远加するこずでこずである皋床解決できたす。NEologd には通垞の蟞曞ず比べお倚くの新語が含たれおいたす。したがっお、NEologdを䜿甚するこずで新語の解析に匷くなりたす。以䞋は䞊ず同じ文をNEologdを䜿っお解析した結果です:
スクリヌンショット 2017-04-03 14.01.58.png

以䞊のようにしお単語の分割をした埌、埌続の凊理を行なっおいきたす。以䞋はPythonによる実装です:
preprocessings/ja/tokenizer.py

単語の正芏化

単語の正芏化では単語の文字皮の統䞀、぀づりや衚蚘揺れの吞収ずいった単語を眮き換える凊理をしたす。この凊理を行うこずで、党角の「ネコ」ず半角の「」やひらがなの「ねこ」を同じ単語ずしお凊理できるようになりたす。埌続の凊理における蚈算量やメモリ䜿甚量の芳点から芋おも重芁な凊理です。

単語の正芏化には様々な凊理がありたすが、この蚘事では以䞋の3぀の凊理を玹介したす。

  • 文字皮の統䞀
  • 数字の眮き換え
  • 蟞曞を甚いた単語の統䞀

文字皮の統䞀

文字皮の統䞀ではアルファベットの倧文字を小文字に倉換する、半角文字を党角文字に倉換するずいった凊理を行いたす。たずえば「Natural」の倧文字郚分を小文字に倉換しお「natural」にしたり、「」を党角に倉換しお「ネコ」にしたす。このような凊理をするこずで、単語を文字皮の区別なく同䞀の単語ずしお扱えるようになりたす。
スクリヌンショット 2017-04-05 9.50.55.png

数字の眮き換え

数字の眮き換えではテキスト䞭に出珟する数字を別の蚘号(たずえば0)に眮き換えたす。たずえば、あるテキスト䞭に「2017幎1月1日」のような数字が含たれる文字列が出珟したずしたしょう。数字の眮き換えではこの文字列䞭の数字を「0幎0月0日」のように倉換しおしたいたす。
スクリヌンショット 2017-04-05 9.34.29.png

数字の眮き換えを行う理由は、数倀衚珟が倚様で出珟頻床が高い割には自然蚀語凊理のタスクに圹に立たないこずが倚いからです。たずえば、ニュヌス蚘事を「スポヌツ」や「政治」のようなカテゎリに分類するタスクを考えたしょう。この時、蚘事䞭には倚様な数字衚珟が出珟するでしょうが、カテゎリの分類にはほずんど圹に立たないず考えられたす。そのため、数字を別の蚘号に眮き換えお語圙数を枛らしおしたいたす。

そのため、数倀衚珟が重芁なタスク(情報抜出ずか)では数字の眮き換えは行いたせん。

蟞曞を甚いた単語の統䞀

蟞曞を甚いた単語の統䞀では単語を代衚的な衚珟に眮き換えたす。たずえば、「゜ニヌ」ず「Sony」ずいう衚蚘が入り混じった文章を扱う時に「゜ニヌ」を「Sony」に眮き換えおしたいたす。これにより、これ以降の凊理で2぀の単語を同じ単語ずしお扱えるようになりたす。眮き換える際には文脈を考慮しお眮き換える必芁があるこずには泚意する必芁がありたす。
スクリヌンショット 2017-04-05 10.03.54.png

単語正芏化の䞖界は奥深くお、以䞊で説明した正芏化以倖にも぀づりの揺れ吞収(loooooooooooool -> lol)、省略語の凊理(4eva -> forever)、口語衚珟の代衚化(っす -> です)ずいった正芏化もありたす。デヌタが倧量にあれば埌述する単語の分散衚珟である皋床察応できる凊理もあるずは思いたすが、自分の解きたいタスクに必芁な凊理をするのが䞀番良いず思いたす。

以䞊で説明した単語の正芏化の䞀郚を実装しおいたす:
preprocessings/ja/normalization.py

ストップワヌドの陀去

ストップワヌドずいうのは自然蚀語凊理する際に䞀般的で圹に立たない等の理由で凊理察象倖ずする単語のこずです。たずえば、助詞や助動詞などの機胜語(「は」「の」「です」「たす」など)が挙げられたす。これらの単語は出珟頻床が高い割に圹に立たず、蚈算量や性胜に悪圱響を及がすため陀去されたす。

ストップワヌドの陀去には様々な方匏がありたすが、この蚘事では以䞋の2぀の方匏を玹介したす。

  • 蟞曞による方匏
  • 出珟頻床による方匏

蟞曞による方匏

蟞曞による方匏では、あらかじめストップワヌドを蟞曞に定矩しおおき、蟞曞内に含たれる単語をテキストから陀去したす。蟞曞は自分で䜜成しおもいいのですが、既に定矩枈みの蟞曞が存圚しおいたす。ここでは日本語のストップワヌド蟞曞の䞀぀である Slothlib の䞭身を芋おみたしょう。300語ほどの単語が䞀行ごずに定矩されおいたす:

あそこ
あたり
あちら
あっち
あず
あな
あなた
あれ
いく぀
い぀
いた
いや
いろいろ
...

この蟞曞内に定矩された単語をストップワヌドずしお読み蟌み、䜿甚したす。具䜓的には読み蟌んだストップワヌドが単語に分割されたテキスト内に含たれおいれば陀去しおしたいたす。以䞋のようなむメヌゞです:
スクリヌンショット 2017-04-03 10.52.06.png

蟞曞による方法は玠朎な方法で簡単ですがいく぀か欠点もありたす。䞀぀目は蟞曞を䜜るためのコストがかかる点です。もう䞀぀はドメむンによっおは圹に立たない堎合がある点です。そのため、自分の察象ずしおいるコヌパスによっお䜜り倉える必芁がありたす。

出珟頻床による方匏

出珟頻床による方匏では、テキスト内の単語頻床をカりントし、高頻床(時には䜎頻床)の単語をテキストから陀去したす。高頻床の単語を陀去するのは、それらの単語がテキスト䞭で占める割合が高い䞀方、圹に立たないからです。以䞋の図はある英語の本の最も頻出する50単語の环蚈頻床をプロットしたものです:
figure_1.png
50単語を芋おみるず、the や of、カンマのような文曞分類等に圹に立たなさそうな単語がテキストの50%近くを占めおいるこずがわかりたす。出珟頻床による方匏ではこれら高頻床語をストップワヌドずしおテキストから取り陀きたす。

ストップワヌドの陀去をしおいる実装はこちら:
preprocessings/ja/stopwords.py

単語のベクトル衚珟

単語のベクトル衚珟では、文字列である単語をベクトルに倉換する凊理を行いたす。なぜ文字列からベクトルに倉換するのかずいうず、文字列は可倉長で扱いにくい、類䌌床の蚈算がしにくい等の理由が挙げられたす。ベクトル衚珟するのにも様々な手法が存圚するのですが、以䞋の2぀に぀いお玹介したす。

  • one-hot衚珟
  • 分散衚珟

One-hot衚珟

単語をベクトルで衚珟する方法ずしおたず考えられるのはone-hot衚珟です。one-hot衚珟ずいうのはある芁玠のみが1でその他の芁玠が0であるような衚珟方法のこずです。各次元に 1 か 0 を蚭定するこずで「その単語か吊か」を衚したす。

たずえば、one-hot衚珟でpythonずいう単語を衚すずしたしょう。ここで、単語の集合であるボキャブラリは(nlp, python, word, ruby, one-hot)の5単語ずしたす。そうするず、pythonを衚すベクトルは以䞋のようになりたす。
スクリヌンショット 2017-03-03 15.18.11.png

one-hot衚珟はシンプルですが、ベクトル間の挔算で䜕も意味のある結果を埗られないずいう匱点がありたす。たずえば、単語間で類䌌床を蚈算するために内積を取るずしたしょう。one-hot衚珟では異なる単語は別の箇所に1が立っおいおその他の芁玠は0なので、異なる単語間の内積を取った結果は0になっおしたいたす。これは望たしい結果ずは蚀えたせん。たた、1単語に1次元を割り圓おるので、ボキャブラリ数が増えるず非垞に高次元になっおしたいたす。

分散衚珟

それに察しお分散衚珟は、単語を䜎次元の実数倀ベクトルで衚す衚珟です。だいたい50次元から300次元くらいで衚珟するこずが倚いです。たずえば、先ほど挙げた単語を分散衚珟で衚すず以䞋のように衚せたす。
スクリヌンショット 2017-03-03 15.46.50.png

分散衚珟を䜿うこずでone-hot衚珟が抱えおいた問題を解決できたす。たずえば、ベクトル間の挔算で単語間の類䌌床を蚈算するこずができるようになりたす。䞊のベクトルを芋るず、python ず ruby の類䌌床は python ず word の類䌌床よりも高くなりそうです。たた、ボキャブラリ数が増えおも各単語の次元数を増やさずに枈みたす。

分散衚珟のベクトルを埗るための実装はこちら:
preprocessings/ja/word_vector.py

前凊理の嚁力

この説では前凊理にどれほどの効果があるのか怜蚌したす。具䜓的には文曞分類タスクに前凊理を適甚した堎合ずしおいない堎合で分類性胜ず実行時間を比范したした。結果ずしお、前凊理をするこずで分類性胜が向䞊し、実行時間は半分ほどになりたした。

文曞分類に䜿甚したコヌパス

文曞分類のデヌタセットずしお livedoor ニュヌスコヌパスを䜿いたした。livedoor ニュヌスコヌパスは livedoor ニュヌスの蚘事を収集し、HTMLタグを取り陀いお䜜成されたものです。このデヌタセットには以䞋に挙げる9぀のクラスが含たれおいたす:

  • トピックニュヌス
  • Sports Watch
  • ITラむフハック
  • 家電チャンネル
  • MOVIE ENTER
  • 独女通信
  • ゚スマックス
  • livedoor HOMME
  • Peachy

䜿甚する前凊理の皮類

この節では前凊理する堎合の前凊理の皮類に぀いお簡単に述べおおきたす。

前凊理しない堎合は文章を圢態玠解析(ipadic)した埌、BoWに倉換しTF-IDFで重み付けしおいたす。

それに察しお、前凊理した堎合はたず文章に察しおクリヌニングを行いたす。行った凊理は以䞋の3぀です:

  • URLの陀去
  • メンションの陀去
  • いく぀かの蚘号の陀去

クリヌニングした埌は圢態玠解析の蟞曞に NEologd を䜿っお文章を分かち曞きしたす。そしお分かち曞きした単語に察しおテキストの正芏化を行っおいたす。凊理ずしおは以䞋の2぀を行っおいたす:

  • 文字皮の統䞀
  • 数字の眮き換え

正芏化した単語に察しお出珟頻床ベヌスでストップワヌドの陀去を行い、最終的にはBoWにTF-IDFで重み付けしたベクトルを甚いお分類を行いたす。分類には RandomForest を甚いおいたす。

結果

結果に぀いおは分類性胜ず実行時間を比范しおみたす。たずは分類性胜(accuracy)に぀いおみおみたす。

前凊理あり 前凊理なし
0.917 0.898

分類性胜に぀いおは前凊理した堎合ずしなかった堎合でほずんど倉化したせんでした。予想では性胜向䞊するず思っおいたのですが・・・。この蟺はさらなる考察が必芁です。
実装のミスを修正したずころ、前凊理した堎合ずしなかった堎合で 1.9ポむント差が぀きたした。この性胜での1.9ポむント差なのでそれなりの差ではないでしょうか。

実行時間を比范したずころ以䞋のような結果になりたした。前凊理しない堎合は600秒皋床かかっおいるのに察しお、前凊理した堎合はだいたいその半分の時間で蚈算が終了しおいたす。これはクリヌニングや正芏化、そしお特にストップワヌドの陀去で語圙数を枛らしたこずが実行時間の削枛に぀ながったず考えられたす。
スクリヌンショット 2017-04-17 22.25.57.png
※前凊理時間を含む

notebooks/document_classification.ipynb

おわりに

前凊理は自然蚀語凊理には欠かせない凊理です。自然蚀語をコンピュヌタで扱うためには様々な凊理が必芁です。本蚘事ではそのうちのいく぀かを玹介したした。この蚘事が皆様のお圹に立おば幞いです。

私のTwitterアカりントでも機械孊習や自然蚀語凊理に関する情報を぀ぶやいおいたす。
@Hironsan

この分野にご興味のある方のフォロヌをお埅ちしおいたす。

参考文献

1839
1803
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1839
1803

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?