ステミングは、自然言語処理タスク用に生のテキスト・データを読み取り可能な形式に変換するいくつかのテキスト正規化技術の1つです。
ステミングは、自然言語処理(NLP)におけるテキストの前処理手法の1つです。具体的には、単語の活用形を、いわゆる「語幹」または語根形(言語学では「レンマ」とも呼ばれる)に変換するプロセスです。1これは、テキストデータ・セット内の語形変化を1つの形態学的語彙素に減らす、2つある主要な方法のうちの1つであり、もう1つはレンマティェーションです。このような処理することで、ステミングは機械学習や情報検索システムにおけるテキスト処理の改善を目的としています。
検索機能からディープラーニング(深層学習)モデルにいたるるまで、機械は主として形式に従って言語を処理しており、多くの研究者は、コンピューターは言語の意味を理解できないと主張しています。2後者の主張に関しては議論の余地がありますが、異なる単語を1つの基本単語の形態学的変異形として認識できるよう、機械学習モデルをトレーニングする必要があるのは事実です。例えば、検索エンジンやライブラリー・カタログでは、ユーザーは1つの単語(例えばinvesting)でクエリを送信しますが、語形が変化した単語(invest、investment、investmentsなど)を含む結果が返ってくることを期待します。ステミングは、語形変化した単語を1つの語幹に縮小することで、情報検索システムが形態学的に関連する単語を等しいものとして扱うことを実現します。3
ステミングによって機械学習アルゴリズムの次元が縮小され、概念に従って単語がグループ化されるため、テキストの分類、クラスタリング、インデックス作成など、多くのテキスト・マイニングのタスクの精度が向上します。アルゴリズムの次元数を減らすことで、トピックモデルや単語埋め込みなどの統計的な自然言語処理モデルの正確率と適合率が向上します4ステミングを行うことで、品詞タグ付けのセンチメント分析など、さまざまな自然言語処理タスクを実行する際の正確性が向上します。このように、ステミングは大規模言語モデルの開発において重要な役割を果たします。
ステミングは、テキスト・マイニングパイプラインにおける段階の1つであり、生のテキスト・データを機械処理用に構造化された形式に変換します。ステミングは基本的に単語から接辞を取り除き、原形のみを残します。5これは、単語トークンの末尾から文字を削除することに相当します。ですが、この基本的な共通点を除き、ステミング・アルゴリズムは大きく異なります。
ステミング・アルゴリズムの演算との違いを探るために、シェイクスピアの真夏の夜の夢に登場する「Love looks not with the eyes but with the mind, and therefore is winged Cupid painted blind」という行を処理してみましょう。ステミングする前に、未加工のテキスト・データをトークン化する必要があります。Pythonの自然言語ツールキット(NLTK)の組み込みトークナイザーは、引用符で囲まれたテキストを次のように出力します。
トークン化: ['Love', 'looks', 'not', 'with', 'the', 'eyes', 'but', 'with', 'the', 'mind', ',', 'and', 'therefore', 'is', 'winged', 'Cupid', 'painted', 'blind', '.']
トークン化された出力を複数のステミング・ツールで処理することで、ステミング・アルゴリズムの違いを確認できます。
Lovinsステミング・アルゴリズムは、最初に公開されたステミング・アルゴリズムです。基本的に、高度にパラメーター化された検索と置換機能として機能します。この方法では、29このルールのいずれかによって条件付けされた一般的な接尾辞のリストと、各入力トークンを比較します。リストの接尾辞がトークン内にあり、該当する接尾辞を削除しても関連する接尾辞のいずれの条件にも違反しない場合、アルゴリズムはその接尾辞をトークンから削除します。次に、語幹トークンは別の一連のルールで処理され、ステミング後の語幹によくある誤り(二重文字など)が修正されます(たとえば、hoppingがhoppになり、それから hopになります)。 6
このコードは、Pythonのステミング・ライブラリ 7 を使用して、トークン化されたシェイクスピアの引用をステミングします。
from stemming.lovins import stem from nltk.tokenize import word_tokenize text = "Love looks not with the eyes but with the mind, and therefore is winged Cupid painted blind." words = word_tokenize(text) stemmed_words = [stem(word) for word in words]
コードの出力は次のとおりです。
Stemmed: ['Lov', 'look', 'not', 'with', 'th', 'ey', 'but', 'with', 'th', 'mind', ',', 'and', 'therefor', 'is', 'wing', 'Cupid', 'paint', 'blind', '.']
この出力は、Lovinsステミング・アルゴリズムが動詞と時制を原形に正しく変換(たとえば、paintedがpaintになる)しつつ、複数形を排除(たとえば、eyesがeye になるなど)する方法を示しています。しかし、Lovinsステミング・アルゴリズムは、lov、th、eyなどの多くの不適切なステムも返します。これらの誤った語根は、削除した文字が多すぎるために発生します。機械学習ではよくあることですが、このようなエラーは根底にあるプロセスを解明するのに役立ちます。
Lovinsステミング・アルゴリズムの接尾辞のリストと比較すると、Aloveとtheの双方に適合する最も長い接尾辞は1 文字の-eです。この接尾辞に付けられる唯一の条件は、「ステムに対するが制限ないこと」です。つまり、ステミング・アルゴリズムは、残されるステムの長さに関係なく-eを削除します。す残念ながら、語幹のlovとthのどちらも、二重文字や不規則な複数形といったLovinsステミング・アルゴリズムが不正な形式の単語の識別に使用する特徴を含んでいません。8
このような不正な語根がアルゴリズムをすり抜けると、Lovinsステミング・アルゴリズムは意味的に無関係な単語を同じ語根に短縮します。例えば、the、these、this はすべてthとなります。もちろん、これら3つの単語はすべて指示語のため、文法上機能を共有しています。しかし、thatやthoseなどの他の指示語は thにはなりません。これは、Lovinsステミング・アルゴリズムが生成した語根は単語グループを適切に表していないことを意味します。
Lovinsステミング・アルゴリズムと比較すると、Porterステミング・アルゴリズムは、より数学的なステミング・アルゴリズムを使用します。基本的に、このステミング・アルゴリズムは、あるトークン内のすべての文字を子音(c)または母音(v)に分類し、後続の子音をCとして、後続の母音をVとしてグループ化します。つまり、このステミング・アルゴリズムではすべての単語トークンが子音グループと母音グループの組み合わせとして表現されます。この方法で列挙してから、ステミングアルゴリズムは各単語トークンを一連のルールで処理します。このルールはトークン内の母音・子音グループ数に応じて削除すべき末尾の文字を指定します。9英語の語彙規則は一般性はあるものの絶対的なものではないため、Porterステミング・アルゴリズムの接尾辞除去を決定する体系的な基準ではエラーが返されることがあります。
Python NLTKには、Porterステミング・アルゴリズムの機能が組み込まれています。以下のコードで、トークン化されたシェイクスピアの言葉にPorterステミング・アルゴリズムを適用します。
from nltk.stem import PorterStemmer from nltk.tokenize import word_tokenize porter_stemmer = PorterStemmer() text = "Love looks not with the eyes but with the mind, and therefore is winged Cupid painted blind."words = word_tokenize(text) stemmed_words = [porter_stemmer.stem(word)for word in words]
このコードは以下の結果を返します。
Stemmed: ['love', 'look', 'not', 'with', 'the', 'eye', 'but', 'with', 'the', 'mind', ',', 'and', 'therefor', 'is', 'wing', 'cupid', 'paint', 'blind', '.']
Lovinsステミング・アルゴリズムと同様に、Porterステミング・アルゴリズムは動詞の活用と名詞の複数形を正しく変更します。Lovinsステミング・アルゴリズムにはあった誤った語幹(たとえば loveをlovとするなど)はないものの、Porterステミング・アルゴリズムはthereforeの末尾から-eを誤って削除しています。
Porterステミング・アルゴリズムの子音・母音のグループ化方法を使用すると、thereforeはCVCVCVまたはC(VC)3 Vと表され、指数は子音・母音グループの繰り返しの回数を意味します。
単語が一切ステミングされておらず、かつ指数値が1より大きい場合、末尾から-e(存在する場合)を削除するよう、アルゴリズムの最終段階の1つで宣言しています。Thereforeの指数値は3であり、かつアルゴリズムの他の条件にリストされている接尾辞を含んでいません。10そのため、thereforeはthereforと処理されます。
確かに、これはPorterステミング・アルゴリズムにおける唯一のエラーです。エラーが一つしかないという事実が、おそらくPorterステミング・アルゴリズムが最も広く採用されているステミング・アルゴリズムである理由でしょう。実際、Porterステミング・アルゴリズムは、その後に登場するステミング・アルゴリズムの基礎として使われてきました。
Snowball ステミング・アルゴリズムは、Porterステミング・アルゴリズムが更新されたバージョンです。接尾辞の削除の決定について、より堅牢なルール・セットを適用することを目的としていますが、依然として同様のエラーの多くが発生する傾向にあります。Porterステミング・アルゴリズムと同様に、Python NLTKにはSnowball ステミング・アルゴリズムの機能が組み込まれています。
from nltk.stem.snowball import SnowballStemmer
from nltk.tokenize import word_tokenize
stemmer = SnowballStemmer("english", True)
text = "There is nothing either good or bad but thinking makes it so."
words = word_tokenize(text)
stemmed_words = [stemmer.stem(word) for word in words]
Porterステミング・アルゴリズムと同じく、誤ってthereforeをthereforに短縮したシェイクスピアのテキストを出力します。
Stemmed: ['love', 'look', 'not', 'with', 'the', 'eye', 'but', 'with', 'the', 'mind', ',', 'and', 'therefor', 'is', 'wing', 'cupid', 'paint', 'blind', '.']
Snowballステミング・アルゴリズムは、主に2つの点でPorterステミング・アルゴリズムと異なります。まず、Lovinsステミング・アルゴリズムとPorterステミング・アルゴリズムがステミングできるのは英語のみですが、Snowballステミング・アルゴリズムはオランダ語、ドイツ語、フランス語、さらにはロシア語など、他の多くのローマ文字を使用する言語のテキストをステミングすることができます。第二に、Python NLTKライブラリーを使用して実装すると、Snowballステミング・アルゴリズムはストップワードを無視できます。ストップワードは、前処理中にデータ・セットから削除される、一般化できない単語のコレクションです。Snowballステミング・アルゴリズムの事前に定義されたストップリストには、直接的な概念的定義を持たない、意味的機能よりも文法的機能の役割を果たす単語が含まれています。Snowballステミング・アルゴリズムの英語のストップリストには the、a、beingなどの単語が含まれています。11
Paiceステミング・アルゴリズムとしても知られるLancasterステミング・アルゴリズムは、多くの情報源が英語のステミング・アルゴリズムの中で最も野心的であると表現しています。Lancasterステミング・アルゴリズムには100以上のルールのリストが含まれており、ルールに合致する文字列が存在し、かつ置換する場合は、単語の末尾のどの文字列を他の文字列に置き換えるかを指示します。Lancasterステミング・アルゴリズムは各単語トークンを反復処理し、すべてのルールに照らしてチェックします。トークンの末尾の文字列がルールに記述されたものと一致する場合、アルゴリズムはルールで記述された処理を実施します。そして変換された新しい単語について、改めてすべてのルールでチェックします。Lancasterステミング・アルゴリズムは、あるトークンが変換されることなくすべてのルールをパスするまで、すべてのルールを反復処理します。12
Python NLTKでは使用できませんが、Lancasterステミング・アルゴリズムは、ステミング・ライブラリーで利用できます。13
from stemming.paicehusk import stem from nltk.tokenize import word_tokenize text = "Love looks not with the eyes but with the mind, and therefore is winged Cupid painted blind." words = word_tokenize(text) stemmed_words = [stem(word) for word in words]
コードは、トークン化されたシェイクスピアの一節を次のように出力します。
Stemmed: ['Lov', 'look', 'not', 'with', 'the', 'ey', 'but', 'with', 'the', 'mind', ',', 'and', 'theref', '', 'wing', 'Cupid', 'paint', 'blind', '.']
theref からわかるように、Lancasterステミング・アルゴリズムの反復アプローチは、アルゴリズムの中で最も過激なものです。まず、Lancasterステミング・アルゴリズムはには "e1>" というルールがあります。このルールは、1文字の-eを置換せずに削除します。アルゴリズムはthereforeから-eを削除したすると、変換で新たに作られたthereforに対して各ルールに照らしてチェックします。変換された新しい単語は、「ro2>」というルールに合致します。このルールは、2文字の接尾辞orを置換せずに削除します。その結果得られる語幹therefは、アルゴリズムの他のどのルールにも当てはまらないため、ステミングされた語幹として返されます。Lovinsステミング・アルゴリズムとは異なり、Lancasterステミング・アルゴリズムは不正な形式の単語について考慮しないのです。
多数の英語のステミング・アルゴリズムがあるように、他のローマ文字言語のアルゴリズムがあります。最近では、非ローマ文字言語のステミング・アルゴリズムの開発と評価に目を向ける研究もあります。特にアラビア語は、その複雑な形態やバリエーションのある正書法のため、一筋縄ではいかないこともあります。いくつかの研究では、分類などのタスクとの関連で、さまざまなアラビア語のステミング・アルゴリズムの有効性を比較しています。14 加えて、タミル語15とサンスクリット語16の情報検索の改善において、ステミングの精度について調査が行われています。
ステミングがNLPタスクの精度を向上させる役割を果たしていることを研究が証明していますが、ステミングにはユーザーが注意すべき重要な問題が2つあります。オーバー・ステミングとは、意味的に異なる2つの単語が同じ語幹に変換され、同一のものと見なされることです。アンダー・ステミングとは、意味的に関連する2つの単語が同じ語幹に変換されないことを意味します。17 オーバー・ステミングの例としては、Lancesterステミング・アルゴリズムにおいて、wanderがwandに変換されることが挙げられます。この2つは意味的に異なる英単語です。しかし、Porterステミング・アルゴリズムもLovinsステミング・アルゴリズムも、wanderには一切手を加えません。アンダー・ステミングの例としては、Porterステミング・アルゴリズムにおいて、knavishはknavish、knaveはknaveのままで変換されないことが挙げられます。この2つは意味的に同じ語根を持っています。一方で、Lovinsステミング・アルゴリズムは両方の単語をknavに変換します。
ステミングとレンマティゼーションは似たような用途と目的を持っていますが、重要ないくつかの点で違いがあります。原則的に単語から一般的な接尾辞を取り除いて語根を生成することから、ステミングはよりヒューリスティックであるとしばしば文献で説明されます。一方、レンマティゼーションは、辞書形を決定するためにさまざまな単語についてより詳細な形態解析を行い、接尾辞だけでなく接頭辞も削除します。ステミングはより迅速かつ容易に実装できますが、より繊細に単語を分解するプロセスを踏むことから、ディープラーニングツールの開発者の多くはレンマティゼーションを好む傾向があります。
IBM® watsonx Orchestrateを使用すると、スケーラブルなAIアシスタントとエージェントを簡単に設計し、反復的なタスクを自動化し、複雑なプロセスを簡素化できます。
ライブラリー、サービス、アプリケーションの強力かつ柔軟なポートフォリオにより、人工知能のビジネス価値を促進します。
AIの導入で重要なワークフローと業務を再構築し、エクスペリエンス、リアルタイムの意思決定とビジネス価値を最大化します。
1 Ruslan Mitkov著、Oxford Handbook of Computational Linguistics、第2版、Oxford University Press、2014年。
2 Emily Bender and Alexander Koller, “Climbing towards NLU: On Meaning, Form, and Understanding in the Age of Data,” Proceedings of the 58th Annual Meeting of the Association for Computational Linguistics, 2020 , pp. 5185-5198 , https://aclanthology.org/2020.acl-main.463
3 Steven Bird, Ewan Klein, and Edward Loper, Natural Language Processing with Python, O’Reilley, 2009.
4 Gary Miner, Dursun Delen, John Elder, Andrew Fast, Thomas Hill, and Robert A. Nisbet, Practical Text Mining and Statistical Analysis for Non-Structured Text Data Applications, Academic Press, 2012.
5 Christopher Manning and Hinrich Schütze, Foundations of Statistical Natural Language Processing, MIT Press, 1999.
6 Julie Beth Lovins, "Development of a stemming algorithm," Mechanical Translation and Computational Linguistics, Vol. 11, Nos. 1 and 2, 1968, pp. 22-31, https://aclanthology.org/www.mt-archive.info/MT-1968-Lovins.pdf
7, 13 https://pypi.org/project/stemming/1.0
8 Julie Beth Lovins, "Development of a stemming algorithm," Mechanical Translation and Computational Linguistics, Vol. 11, Nos. 1 and 2, 1968, pp. 22-31, https://aclanthology.org/www.mt-archive.info/MT-1968-Lovins.pdf
9 Martin Porter, "An algorithm for suffix stripping", Program: electronic library and information systems, Vol. 14, No. 3, 1980, pp. 130-137, https://www.emerald.com/insight/content/doi/10.1108/eb046814/full/html
10 Martin Porter, "An algorithm for suffix stripping", Program: electronic library and information systems, Vol. 14, No. 3, 1980, pp. 130-137, https://www.emerald.com/insight/content/doi/10.1108/eb046814/full/html
11 Martin Porter, “Snowball: A language for stemming algorithms,” 2001, https://snowballstem.org/texts/introduction.html
12 Chris Paice, “Another stemmer," ACM SIGIR Forum, Vol. 24, No. 3, 1990, pp.56-61, https://dl.acm.org/doi/10.1145/101306.101310
14 Y. A. Alhaj, J. Xiang, D. Zhao, M. A. A. Al-Qaness, M. Abd Elaziz and A. Dahou, "A Study of the Effects of Stemming Strategies on Arabic Document Classification," IEEE Access, Vol. 7, pp. 32664-32671, https://ieeexplore.ieee.org/document/8664087. Janneke van der Zwaan, Maksim Abdul Latif, Dafne van Kuppevelt, Melle Lyklema, Christian Lange, "Are you sure your tool does what it is supposed to do? Validating Arabic root extraction," Digital Scholarship in the Humanities, Vol.36, 2021, pp.137-150, https://academic.oup.com/dsh/article/36/Supplement_1/i137/5545478
15 Ratnavel Rajalakshmi, Srivarshan Selvaraj, Faerie Mattins, Pavitra Vasudevan, Anand Kumar, "HOTTEST: Hate and Offensive content identification in Tamil using Transformers and Enhanced Stemming," Computer Speech & Language, Vol. 78, 2023, https://www.sciencedirect.com/science/article/abs/pii/S0885230822000870?via%3Dihub
16 Siba Sankar Sahu and Sukomal Pal, "Building a text retrieval system for the Sanskrit language: Exploring indexing, stemming, and searching issues," Computer Speech & Language, Vol. 81, 2023, https://www.sciencedirect.com/science/article/abs/pii/S0885230823000372?via%3Dihub
17 Chris Paice, “Stemming,” Encyclopedia of Database Systems, Springer, 2020.