ステミングとレマタイズ Python NLTK の例
⚡ スマートサマリー
ステミングとレンマ化は、テキスト正規化技術です。 Python NLTKは、単語のバリエーションを共通の基本形に還元します。語幹抽出は文脈を無視して接尾辞を素早く抽出し、語形変化は意味に基づいて真の辞書単語を返します。

ステミングとレマタイズとは何か Python NLTK?
ステミングと見出し語化 in Python NLTKは、自然言語処理におけるテキスト正規化技術です。これらの技術は、テキストの前処理に広く用いられています。ステミングとレンマ化の違いは、ステミングは文脈を考慮せずに単語を切り出すため高速であるのに対し、レンマ化は処理前に単語の文脈を把握する必要があるため低速であるという点です。
ステミングとは何ですか?
ステミング は、単語を正規化する方法です。 自然言語処理これは、文中の単語の集合をシーケンスに変換して検索時間を短縮する技術です。この方法では、同じ意味を持つが文脈や文によって多少の違いがある単語を正規化します。言い換えれば、語根は1つですが、同じ単語のバリエーションが多数存在します。たとえば、語根は「eat」で、そのバリエーションは「eats、eating、eaten」などです。同様に、ステミングの助けを借りて、 Pythonそうすれば、あらゆるバリエーションの語源を見つけることができます。
具体的な例を挙げますと、以下の通りです。
He was riding. He was taking the ride.
上記の2つの文は、どちらも過去の乗馬活動という意味で、意味は同じです。人間であれば、どちらの意味も同じだと容易に理解できます。しかし、機械にとっては、この2つの文は異なります。そのため、同じデータ行に変換するのは困難です。同じデータセットを提供しないと、機械は予測に失敗します。したがって、機械学習用のデータセットを準備するには、各単語の意味を区別する必要があります。ここでは、語幹抽出を用いて、同じ種類のデータを語根から抽出し、分類します。
これを実装するには Python プログラム。NLTKには、 ポーターステマーこのアルゴリズムは、トークン化された単語のリストを受け取り、それらを語幹に分解します。
ステミングを理解するためのプログラム
from nltk.stem import PorterStemmer e_words= ["wait", "waiting", "waited", "waits"] ps =PorterStemmer() for w in e_words: rootWord=ps.stem(w) print(rootWord)
出力:
wait wait wait wait
Code 説明:
- NLTKにはステムモジュールがあり、これをインポートします。モジュール全体をインポートすると、数千行のコードが含まれるため、プログラムが重くなります。そのため、ステムモジュール全体から「PorterStemmer」のみをインポートしました。
- 同じ単語の変化データのダミーリストを用意しました。
- nltk.stem.porter.PorterStemmer クラスに属するオブジェクトが作成されます。
- 私たちは「for」ループを使って、リストにある単語を一つずつPorterStemmerに渡しました。最終的に、リストにある各単語の語根が出力されました。
上記から、ステミングは重要な前処理ステップであることがわかります。なぜなら、ステミングによって同じ単語内の冗長性やバリエーションが除去されるからです。その結果、データがフィルタリングされ、機械学習の精度向上に役立ちます。それでは、完全な文を入力して出力結果を確認してみましょう。
from nltk.stem import PorterStemmer from nltk.tokenize import sent_tokenize, word_tokenize sentence="Hello Guru99, You have to build a very good site and I love visiting your site." words = word_tokenize(sentence) ps = PorterStemmer() for w in words: rootWord=ps.stem(w) print(rootWord)
出力:
hello
guru99
,
you
have
build
a
veri
good
site
and
I
love
visit
your
site
Code 説明:
- PorterStemmer パッケージは、stem モジュールからインポートされます。
- 文と単語の両方をトークン化するためのパッケージがインポートされます。
- 次のステップでトークン化される文が書かれます。
- PorterStemmer のオブジェクトがここで作成されます。
- ループが実行され、コードの5行目で作成されたオブジェクトを使用して各単語の語幹抽出が行われます。
要するに、ステミングはデータ前処理モジュールです。英語には一つの単語に多くのバリエーションがあり、それが機械学習の学習や予測において曖昧さを生み出します。成功するモデルを構築するには、ステミングを用いてそのような単語を同じ順序のデータにフィルタリングすることが不可欠です。これは正規化とも呼ばれます。
見出し語化とは何ですか?
レンマ化 NLTK のレンマ化は、意味と文脈に基づいて単語の語幹を見つけるアルゴリズム処理です。レンマ化は通常、語の形態素解析を指し、語尾の屈折を取り除くことを目的としています。これは、語幹として知られる単語の基本形または辞書形を返すのに役立ちます。NLTK のレンマ化メソッドは、WordNet の組み込みの morph 関数に基づいています。テキストの前処理には、ステミングとレンマ化の両方が含まれます。多くの人がこの 2 つの用語を混同しています。これらを同じものとして扱う人もいますが、ステミングとレンマ化には違いがあります。以下の理由から、レンマ化が前者よりも好まれます。
見出し語化が語幹解析よりも優れているのはなぜですか?
ステミングアルゴリズムは、単語から接尾辞を切り取ることで機能します。より広い意味では、単語の先頭または末尾を切り取ります。一方、レンマ化はより強力な操作であり、単語の形態論的分析を考慮に入れます。これは、すべての活用形の基本形であるレンマを返します。辞書を作成し、単語の適切な形を探すには、深い言語学的知識が必要です。ステミングは一般的な操作ですが、レンマ化は辞書で適切な形を検索するインテリジェントな操作です。したがって、レンマ化はより良い辞書を作成するのに役立ちます。 機械学習 機能。
Code レンマ化とステミングを区別する
ステミング Code:
import nltk from nltk.stem.porter import PorterStemmer porter_stemmer = PorterStemmer() text = "studies studying cries cry" tokenization = nltk.word_tokenize(text) for w in tokenization: print("Stemming for {} is {}".format(w,porter_stemmer.stem(w)))
出力:
Stemming for studies is studi Stemming for studying is studi Stemming for cries is cri Stemming for cry is cri
レンマ化 Code:
import nltk from nltk.stem import WordNetLemmatizer wordnet_lemmatizer = WordNetLemmatizer() text = "studies studying cries cry" tokenization = nltk.word_tokenize(text) for w in tokenization: print("Lemma for {} is {}".format(w, wordnet_lemmatizer.lemmatize(w)))
出力:
Lemma for studies is study Lemma for studying is studying Lemma for cries is cry Lemma for cry is cry
成果物の議論
「studies」と「studying」の語幹抽出を見ると、出力は同じ(studi)ですが、NLTKの語幹抽出器は、両方のトークンに対して異なる語幹を生成します。「studies」には「study」、「studying」には「studying」とします。そのため、機械学習モデルを訓練するための特徴量セットを作成する際には、語幹抽出が優先されることが望ましいでしょう。
Lemmatizer の使用例
レマタイザーはテキストの曖昧さを最小限に抑えます。bicycle や bicycles のような単語は、基本語 bicycle に変換されます。意味は同じでも表現が異なるすべての単語を基本形に変換し、単語密度とヘルパーを削減します。ping 機械学習モデルのトレーニング用に、正確な特徴量を準備しましょう。データがきれいであればあるほど、機械学習モデルの精度は向上します。NLTK Lemmatizerは、メモリと計算コストの削減にも貢献します。
WordNetの語形変化と品詞タグ付けの使用例を示すリアルタイムの例 Python:
from nltk.corpus import wordnet as wn from nltk.stem.wordnet import WordNetLemmatizer from nltk import word_tokenize, pos_tag from collections import defaultdict tag_map = defaultdict(lambda : wn.NOUN) tag_map['J'] = wn.ADJ tag_map['V'] = wn.VERB tag_map['R'] = wn.ADV text = "guru99 is a totally new kind of learning experience." tokens = word_tokenize(text) lemma_function = WordNetLemmatizer() for token, tag in pos_tag(tokens): lemma = lemma_function.lemmatize(token, tag_map[tag[0]]) print(token, "=>", lemma)
出力:
guru99 => guru99 is => be totally => totally new => new kind => kind of => of learning => learn experience => experience . => .
Code 説明:
- コーパスリーダーであるwordnetがインポートされ、wordnetからWordNetLemmatizerがインポートされます。
- 単語のトークン化と品詞タグはnltkからインポートされ、デフォルト辞書はcollectionsからインポートされます。
- pos_tagの最初の文字をキーとし、それをWordNet辞書の値にマッピングした辞書が作成されます。
- テキストが書き込まれ、トークン化され、ループ内で使用するオブジェクト lemma_function が作成されます。
- ループが実行され、lemmatize はトークンとマップの 2 つの引数を取ります。ping wordnet値を持つpos_tag。
Python レンマ化は WordNet辞書したがって、次にそのトピックを研究することが不可欠です。
