IBMニュースレター
The DX Leaders
AI活用のグローバル・トレンドや日本の市場動向を踏まえたDX、生成AIの最新情報を毎月お届けします。登録の際はIBMプライバシー・ステートメントをご覧ください。
ニュースレターは日本語で配信されます。すべてのニュースレターに登録解除リンクがあります。サブスクリプションの管理や解除はこちらから。詳しくはIBMプライバシー・ステートメントをご覧ください。
自然言語処理(NLP) では、ステミングとレンマ化は、テキスト・データセット全体の単語の屈折形式を1つの共通の語根または辞書形式(計算言語学では「レマ」とも呼ばれます)に縮小するテキスト前処理技術です。1
研究者たちは人工知能が推論できるかどうかについて議論しており、この議論は計算言語学にまで及んでいます。チャットボットやディープラーニング・モデルは言語形式のみを処理できるのか、それとも意味を理解できるのか。2この問題についてどう考えるにせよ、機械学習モデルは異なる単語を1つの基本語の形態素的な変異形として認識するように訓練されなければなりません。つまり、意味ではなく形態に基づいて単語を処理します。派生した単語形を1つの語幹に減らすことで、ステミングとレマタイゼーションは、情報検索システムやディープラーニング・モデルが形態的に関連する単語を同等に扱うのを助けます。
多くのテキスト・マイニング・タスク、例えばテキスト分類、クラスタリング、インデックス作成などで、ステミングとレマタイゼーションは、機械学習アルゴリズムの次元を縮小し、形態的に関連する単語をグループ化することで、精度を向上させるのに役立ちます。アルゴリズムの次元削減は、NLPにおけるトピック・モデルや単語ベクトル・モデルなどの統計モデルの精度と精密度を向上させることができます。3
IBMニュースレター
AI活用のグローバル・トレンドや日本の市場動向を踏まえたDX、生成AIの最新情報を毎月お届けします。登録の際はIBMプライバシー・ステートメントをご覧ください。
ニュースレターは日本語で配信されます。すべてのニュースレターに登録解除リンクがあります。サブスクリプションの管理や解除はこちらから。詳しくはIBMプライバシー・ステートメントをご覧ください。
ステミングとレマタイゼーションは、生のテキスト・データを機械で処理できるように構造化された形式に変換するテキスト・マイニング・パイプラインの一段階として機能します。ステミングとレマタイゼーションはどちらも、語形変化した単語から接辞を取り除き、語根だけを残します。4これらのプロセスは、単語トークンの最初と最後から文字を削除することになります。結果として得られた語根、つまりベースとなる単語は、さらなる処理のために渡されます。この基本的な類似性以外にも、ステミングとレマタイゼーションには、さまざまな形式の単語を1つの共通の基本形に縮小する方法に大きな違いがあります。
ステミング・アルゴリズムは大きく異なりますが、いくつかの一般的な動作モードを共有しています。ステマーは、事前定義された一般的な接尾辞のリストに対して入力単語トークンを処理することで、単語の接尾辞を除去します。その後、ステマーは、見つかった接尾辞文字列を、接尾辞に関連するルールや条件に違反しない限り、単語から削除します。一部のステマー(たとえば、Lovinsステマー)は、結果として得られる語幹を、不正な語幹を修正するための追加のルール・セットに通します。
最も広く使用されているアルゴリズムはPorterステミング・アルゴリズムであり、その更新版であるSnowballステマーです。ステミングをよりよく理解するために、シェイクスピアの『ハムレット』から「There is nothing either good or bad but thinking makes it so.(良いことも悪いこともない。ただ考えることでそうなるのだ。)」という一節をSnowballステマーで処理できます。
Pythonの自然言語ツールキット(NLTK)には、SnowballとPorterのステマーの組み込み関数が含まれています。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]
print("Original:", text)
print("Tokenized:", words)
print("Stemmed:", stemmed_words)
コードの出力は次のとおりです。
Original: There is nothing either good or bad but thinking makes it so. Tokenized: ['There', 'is', 'nothing', 'either', 'good', 'or', 'bad', 'but', 'thinking', 'makes', 'it', 'so', '.'] Stemmed: ['there', 'is', 'noth', 'either', 'good', 'or', 'bad', 'but', 'think', 'make', 'it', 'so', '.']
SnowballおよびPorterステミング・アルゴリズムは、他のステマーよりも接尾辞を除去するためのより数学的な方法を持っています。要するに、ステマーは、トークン内の母音と子音のグループ数に応じて削除する接尾辞文字列を指定するルールのリストに対して、すべての単語トークンを処理します。5もちろん、英語は一般的な語彙規則には従いますが、絶対的な規則ではないため、ステミング・アルゴリズムの体系的な基準は、nothのようなエラーを返します。
ステマーは、現在進行形を表す一般的な語尾である-ingを削除します。しかし、『ハムレット』の引用では、-ingを削除すると誤って語幹nothが生成されます。これにより、その後の言語分析でnothingをanythingやsomethingなどの類似の名詞と関連付けることが妨げられる可能性があります。さらに、ステマーは不規則動詞isを変更せずに残します。Snowballステマーも同様に、wasやareなどのto beの他の活用形をステム化せずに残します。これにより、モデルが特定の動詞の不規則な活用を適切に関連付けることができなくなる可能性があります。
文献では、一般的にステミングを単語から接辞を取り除き、語幹化された単語列を得るプロセスと定義し、レマタイゼーションを形態的な変異形を1つの辞書の基本形に縮小するより大きな取り組みと定義しています。6ステミングとレマタイゼーションの実際的な違いは、ステミングが単に単語トークンの末尾から一般的な接尾辞を削除するのに対し、レマタイゼーションは、出力単語が辞書で見つけることができる単語の既存の正規化された形(例えば、レマ)であることを保証することです。7
レマタイゼーションは辞書の基本形を出力することを目的としているため、ステミングよりも堅牢な形態素解析が必要です。品詞(POS)タグ付けはレマタイゼーションにおける重要なステップです。POSは基本的に、文中での構文上の機能を示す各単語にタグを割り当てます。PythonのNLTKはWordNetレマタイゼーション・アルゴリズムの関数を提供しており、それによって『ハムレット』の一節をレマタイゼーションすることができます。
from nltk.stem import WordNetLemmatizer
from nltk.corpus import wordnet
from nltk import word_tokenize, pos_tag
def get_wordnet_pos(tag):
if tag.startswith('J'):
return wordnet.ADJ
elif tag.startswith('V'):
return wordnet.VERB
elif tag.startswith('N'):
return wordnet.NOUN
elif tag.startswith('R'):
return wordnet.ADV
else:
return wordnet.NOUN
def lemmatize_passage(text):
words = word_tokenize(text)
pos_tags = pos_tag(words)
lemmatizer = WordNetLemmatizer()
lemmatized_words = [lemmatizer.lemmatize(word, get_wordnet_pos(tag)) for word, tag in pos_tags]
lemmatized_sentence = ' '.join(lemmatized_words)
return lemmatized_sentence
text = "There is nothing either good or bad but thinking makes it so."
result = lemmatize_passage(text)
print("Original:", text)
print("Tokenized:", word_tokenize(text))
print("Lemmatized:", result)
コードは次を返します。
Original: There is nothing either good or bad but thinking makes it so. Tokenized: ['There', 'is', 'nothing', 'either', 'good', 'or', 'bad', 'but', 'thinking', 'makes', 'it', 'so', '.'] Lemmatized: There be nothing either good or bad but think make it so .
WordNetLemmatizerは、Snowballステマーとよく似ており、動詞の活用を基本形(例えば、thinkingをthinkに、makesをmakeに)に減らします。しかし、Snowballステミング・アルゴリズムとは異なり、レマタイザーはnothingを名詞と識別し、その-ing語尾を適切にそのままにし、さらにisをその基本形であるbeに変更します。このようにして、レマタイザーは不規則な動詞形をより適切に統合します。
ステミングとレマタイゼーションは、主に英語のテキスト・データの正規化をサポートします。両方のテキスト正規化手法は、フランス語、ドイツ語、スペイン語など、他のローマ字言語もサポートしています。ロシア語などの他のスクリプトは、Snowballステマーによってさらにサポートされています。他の言語、特にアラビア語のステミングおよびレマタイゼーション・アルゴリズムの開発は、最近の継続的な研究分野です。アラビア語は、凝集的な形態、正書法の変化、語彙の曖昧さなどの特徴により、特に困難です。8全体として、これらの要素は、形態変化した単語の中から基本的な単語形を識別する体系的な方法を難しくします。少なくとも英語と比較した場合にはそうです。
この一般的な制限に加えて、ステミングとレマタイゼーションにはそれぞれ欠点があります。『ハムレット』の例で示したように、ステミングは比較的ヒューリスティックで、ルールに基づく文字列の削除プロセスです。過剰ステミングと過少ステミングはよく起こる2つのエラーです。前者は、意味的に異なる2つの単語が同じ語根に還元される場合(たとえば、newsがnewに還元されるなど)、後者は意味的に関連する2つの単語が同じ語根に還元されない場合(たとえば、knavishとknaveがそれぞれknavishとknaveのまま残るなど)です。9さらに、ステミングは単語から接尾辞のみを削除するため、レマタイゼーションのように不規則な動詞形や接頭辞を考慮することはできません。もちろん、ステミングは比較的シンプルで実装が容易ですが、レマタイゼーションは処理するデータのサイズによっては計算コストが高く、時間がかかる可能性があります。
IBM® watsonx Orchestrateを使用すると、スケーラブルなAIアシスタントとエージェントを簡単に設計し、反復的なタスクを自動化し、複雑なプロセスを簡素化できます。
ライブラリー、サービス、アプリケーションの強力かつ柔軟なポートフォリオにより、人工知能のビジネス価値を促進します。
AIの導入で重要なワークフローと業務を再構築し、エクスペリエンス、リアルタイムの意思決定とビジネス価値を最大化します。