Pythonによる自然言語処理のステミングとレムマター化について解説する

スポンサーリンク

自然言語処理の分野では、ステミングとレンマタイゼーションは、さらなる分析のためにテキストや文書を準備するために使用されるテキストの正規化技術です。

スポンサーリンク

ステミングとレムマティゼーションの理解

言語データを扱う際には、「care」と「caring」のような単語が同じ意味でありながら、異なる時制で使用されるという事実を認識する必要があります。

そこで、単語を基本形に還元するために、語幹処理とlematizationを使用します。

今回は、NLTKライブラリとSpaCyライブラリを使って、語幹処理とレマット処理を行います。

ステミングとは?

単語をステム処理するコンピュータープログラムまたはサブルーチンは、ステミングプログラム、ステミングアルゴリズム、またはステマーと呼ばれることがあります。

ステミングは、テキストデータの前処理に使用されます。

英語には 1 つの単語に多くのバリエーションがあるため、機械学習アルゴリズムが学習する際のあいまいさを減らすには、そのような単語をフィルタリングして基本形に減らすことが不可欠です。

NLTK には、単語のステミングを実行するためのクラスがあります。

最も広く使用されているステミングアルゴリズムは、PorterStemmer、SnowballStemmer などです。

PorterStemmerによるステマーの作成

PorterStemmerで単語のステムを作ってみましょう。

#Importing required modules
from nltk.stem.porter import PorterStemmer
 
#Creating the class object
stemmer = PorterStemmer()
 
#words to stem
words = ['rain','raining','faith','faithful','are','is','care','caring']
 
#Stemming the words
for word in words:
    print(word+' -> '+ stemmer.stem(word))

結果は以下の通りです。

rain --> rain
raining --> rain
faith --> faith
faithful --> faith
are --> are
is --> is
care --> care
caring --> care

PorterStemmerクラスには .stem メソッドがあり、入力引数として単語を受け取り、その単語をルートフォームに還元して返します。

Snowball Stemmerによるステマーの作成

これは、Porter Stemmer のいくつかの欠点を修正する傾向があるため、Porter2 ステミングアルゴリズムとしても知られ ています。

その使用方法を説明します。

#Importing the class
from nltk.stem.snowball import SnowballStemmer
 
#words to stem
words = ['rain','raining','faith','faithful','are','is','care','caring']
 
#Creating the Class object
snow_stemmer = SnowballStemmer(language='english')
 
#Stemming the words
for word in words:
    print(word+' -> '+snow_stemmer.stem(word))

結果は以下の通りです。

rain --> rain
raining --> rain
faith --> faith
faithful --> faith
are --> are
is --> is
care --> care
caring --> care

両方のステマーからの出力は、デモのために限られたテキストコーパスを使用したため、似ています。

さまざまな単語で自由に実験し、2 つの出力を比較してください。

Lemmatization とは何ですか?

レンマタイゼーションとは、単語のレンマを検索するアルゴリズムプロセスです。

ステミングでは単語が正しく削減されないことがありますが、レンマタイゼーションでは常に単語の意味に基づいて単語が削減されることを意味します。

これは、レンマと呼ばれる、単語の基本形または辞書形式を返すのに役立ちます。

ステミングとレンマタイゼーションは、一見同じように見えますが、実際には大きく異なります。

では、テキストデータに対してレンマタイゼーションを行う方法を説明します。

Python SpacyでLemmatizerを作成します。

Note: python -m spacy download en_core_web_sm

上記の行は、lemmatizationを行うために必要なファイルをダウンロードするために実行する必要があります。

#Importing required modules
import spacy
 
#Loading the Lemmatization dictionary
nlp = spacy.load('en_core_web_sm')
 
#Applying lemmatization
doc = nlp("Apples and oranges are similar. Boots and hippos aren't.")
 
#Getting the output
for token in doc:
    print(str(token) + ' --> '+ str(token.lemma_))

結果は、以下の通りです。

Apples --> apple
and --> and
oranges --> orange
are --> be
similar --> similar
. --> .
Boots --> boot
and --> and
hippos --> hippos
are --> be
n't --> not
. --> .

上記のコードは、入力された単語をLemmatizeした spacy.doc オブジェクトタイプのイテレータを返す。

このイテレータには .lemma_ 属性を使って、レンマタイズされた単語にアクセスすることができる。

どのように自動的に文がトークン化されるかを見てみましょう。

Python NLTKでLemmatizerを作成します。

NLTKはwordnetを利用します。

NLTKのLemmatizationはWorldNetの組み込みのmorph関数がベースになっている。

その使い方を見てみましょう。

import nltk
nltk.download('wordnet') #First download the required data
#Importing the module
from nltk.stem import WordNetLemmatizer
 
#Create the class object
lemmatizer = WordNetLemmatizer()
 
 
# Define the sentence to be lemmatized
sentence = "Apples and oranges are similar. Boots and hippos aren't."
 
# Tokenize the sentence
word_list = nltk.word_tokenize(sentence)
print(word_list)
 
 
# Lemmatize list of words and join
lemmatized_output = ' '.join([lemmatizer.lemmatize(w) for w in word_list])
print(lemmatized_output)

結果を出力すると、以下の様になります。

['Apples', 'and', 'oranges', 'are', 'similar', '.', 'Boots', 'and', 'hippos', 'are', "n't", '.']
Apples and orange are similar . Boots and hippo are n't .

Lemmatization vs. Stemming (語幹形成)

なるほど、そうなんですね。

ステミングとレマット化のどちらを選ぶか、最初は混乱するかもしれませんが、レマット化の方がステミングよりも効果的であることは間違いありません。

どちらの手法も、各単語をその語根に還元することを確認しました。

ステミングでは、これは対象単語の縮小形にすぎませんが、レムマティゼーションでは、対象単語をワードネットコーパス内で相互参照する必要があるため、真の英語の語根に削減されます。

語幹形成とレムマター化の比較 これは、速度と詳細の間のトレードオフの問題です。

ステミングは通常レンマタイゼーションより速いですが、不正確な場合があります。

一方、モデルをできるだけ詳細に、できるだけ正確にする必要がある場合は、レムマタイズを優先する必要があります。

まとめ

この記事では、ステミングとレンマタイゼーションがどのようなものかを見ました。

また、ステミングとレムマティゼーションを実装するさまざまな方法を見ました。

また、LemmatizationとStemmingを比較し、両プロセスの違いを説明しました。

タイトルとURLをコピーしました