Stemming and Lemmatization
英語の勉強として,翻訳記事を書いていきます.研究しろという話だけどもね.
はい,英語の形態素は" "(スペース)区切りで簡単だよって言いますね.
でも,日本語の形態素解析器 MeCab の辞書に「原形」というカラム名があるように
英語にも「原形」があり,原形に変換する手法があります.
MeCab: Yet Another Part-of-Speech and Morphological Analyzer
これらの技術に関して,まず stanford のページを日本語訳していきます.
そして,英語の stemming および lemmatization には
nltk と stanfordnlp どちらが良いのか見ていきたいなと思います(主題).
Stemming and lemmatization の日本語訳(TOEICは650しかないです)
文法的な理由によって,文章中の単語は organize, organizes, organizing のように様々な形(活用形)で用いられるはずです.
加えて,democracy, democratic, democratization のように類似した意味を持ち派生的に関連した単語の系統(派生語)があります.
多くの場合,これらの単語のうち1つ(検索語)を検索して,文章がその検索語と同じ系統の単語を持つかどうかを判定することは役に立つように思えます.
stemming と lemmatization の両方の目的は活用形や(時々ではあるが)派生語を減らし原形に戻すことです.
例えば,
am, are, is be
car, cars, car's, cars' car
であり,文章に適用すると,
the boy's cars are different colors
the boy car be differ color
となります(当たり前なんだけど,be なんだとは思いました...すいません.).
しかしながら,この stemming と lemmatization にはちょっと違いがあります.
Stemming は通常,ほとんどの場面で正しくなることを期待して単語の終端を切り落とすという粗くヒューリスティックな処理を指す(基本的に,派生的な接辞の除去も含む).
Lemmatization は通常,語彙や単語の形態素解析を利用して適切に操作することを指し,一般的に活用系の末尾のみの除去や基本形や辞書に存在する単語 lemma として返すことである.
例えば "saw" が与えれた場合は,stemming では "s" だけを返すかもしれないが,lemmatizeation では品詞に応じて see か saw が返されることが期待される.この2つの違いは stemming は派生語を崩壊させやすく,lemmatization は単語が持つ活用形を壊しやすいことだろう.これらに対する言語処理は索引処理(形態素解析器?構文解析器?)などの追加プラグインとして提供されることが多く,商用利用でもオープンソースでも見られる.
最も頻繁に見られる英語の stemming アルゴリズムとしては,経験的に早いPorter's アルゴリズム(Porter, 1980)がある.全体のアルゴリズムは長すぎて載せることができないが,一般的な例を示す.Porter's アルゴリズムは単語の削減を5段階に分け,それぞれを順に適用した結果を返す.それぞれの段階では,接辞が最も長くなるルールを適用するなどの方法が用いられる.
第一段階では,次のようである.
SSES ⇒ SS Ex. caresses ⇒ caress
IES ⇒ I Ex. ponies ⇒ poni
SS ⇒ SS Ex. caress ⇒ caress
S ⇒ Ex. cats ⇒ cat
残りのルールの多くは助数詞の概念を用いている.
助数詞は単語が十分に長いかを見るために音節の数を大まかに調べる.助数詞は,ルールに合致した語幹の一部を見つけることよりもルールに合致した接尾辞を見つけるのに向いている.
例えば, 次のルールは replacement を replac にするが,cement は c にはならない.
(m > 1) EMENT ⇒
Porter Stemmer の公式サイトは Porter Stemming Algorithm で
その他にも one-pass Lovins stemmer (http://www.cs.waikato.ac.nz/~eibe/stemmers/ ) や Paice/Husk stemmer (https://www.scientificpsychic.com/paice/paice.html) がある.
上の図はこれらの手法の違いを示したものである.
(かなり違いますね,analysis can reveal features のところとかわかりやすい)
Stemming による処理は言語固有であるが,lemmatization と比べると必要とする情報は少なくて済む.Lemmatization では語彙の網羅や優れた形態素解析が必要とされるからだ.また,特定のドメインにおいては特定の stemming ルールが必要かもしれない.Stemming では厳密な 結果ではなく,等価なクラスを形成するかが問題である.
各単語の見出し語を正確に見つけるために full (全体?)に形態素解析を施す自然言語処理のツールとしては,stemmer よりも lemmatizer のほうが良いかもしれない.
全体に形態素解析を施すことは検索においてちょっとした利点がある.しかし,これ以上のことを述べることは難しい.なぜなら,正規化の形では英語の情報検索全体のパフォーマンスにほとんど影響がないからだ.クエリの面では有効だが,同じくらい他の点で問題がある.
うまくいかない例としては,次の単語全てに Porter stemmer を適用すると,すべて oper になる.
operate operating operates operation operative operatives operational
しかし,operate は一般的な動詞であり,operational and research のような価値のある情報が失われる.
このような場合において,lemmatizer を使用しても特定の場合に登場する特定の活用形に対応できないため問題を完全に解決することはできないでしょう.
例えば,operate and system が登場する文章は operating and system というクエリと一致しません.
単語の正規化によって得られるより良い価値は言語形態論の正式な問題よりも単語使用時の実用的な問題に依存しています.
このことはスペイン語やドイツ語のような形態論がさらに多い言語によって異なります.European CLEF (おそらく学会名)では,stemmer を使用する方がメリットが大きいとしきりに言われている.
意外だったんですけど,言語処理のツールとしては lemmatization の方が良いかもくらいのことは触れているんですね.後半で勿論タスクにもよるけど,とも言っていますが.
Is it advisable to choose lemmatization over stemming in NLP? - Quora とかでも話されていて,まあそうなんだろうなあという感じです.
自分は stemming は欲しい情報がかなり削られているように感じるので,lemmatization を使用することが多いです.
## 本当はここから,nltk, stanfordnlp, spaCy の違いを書く予定でした
コードと結果見ながらやっていく予定でしたが,2019/09 現在であまり時間が割けてません.3ヶ月下書きのまま放置してしまっていたので,とりあえず公開しておきます.続き書きたいです。。。