Natural-language-toolkit-stemming-lemmatization

提供:Dev Guides
移動先:案内検索

ステミングとレンマ化

ステミングとは何ですか?

ステミングは、接辞を削除して単語の基本形を抽出するために使用される手法です。 それはちょうど木の枝をその幹に切り落とすようなものです。 たとえば、 _ eating、eats、eaten_ という語の語幹は eat です。

検索エンジンは単語の索引付けにステミングを使用します。 そのため、検索エンジンは単語のすべての形式を保存するのではなく、語幹のみを保存できます。 このように、ステミングはインデックスのサイズを縮小し、検索精度を向上させます。

さまざまなステミングアルゴリズム

NLTKでは、* stem()メソッドを持つ *stemmerI のインターフェースに、次に取り上げるすべてのステマーがあります。 次の図でそれを理解しましょう

ステミングアルゴリズム

ポーターステミングアルゴリズム

これは、最も一般的なステミングアルゴリズムの1つであり、基本的には、よく知られている英語のサフィックスを削除して置き換えるように設計されています。

PorterStemmerクラス

NLTKには PorterStemmer クラスがあり、これを使用して、語幹処理したい単語のPorter Stemmerアルゴリズムを簡単に実装できます。 このクラスは、入力単語を最終的な語幹に変換するために役立ついくつかの通常の単語形式とサフィックスを知っています。 結果として生じる語幹は、同じ語根の意味を持つ短い単語であることがよくあります。 例を見てみましょう-

まず、自然言語ツールキット(nltk)をインポートする必要があります。

import nltk

次に、 PorterStemmer クラスをインポートして、Porter Stemmerアルゴリズムを実装します。

from nltk.stem import PorterStemmer

次に、次のようにPorter Stemmerクラスのインスタンスを作成します-

word_stemmer = PorterStemmer()

次に、語幹処理したい単語を入力します。

word_stemmer.stem('writing')

出力

'write'
word_stemmer.stem('eating')

出力

'eat'

完全な実装例

import nltk
from nltk.stem import PorterStemmer
word_stemmer = PorterStemmer()
word_stemmer.stem('writing')

出力

'write'

Lancasterステミングアルゴリズム

ランカスター大学で開発された、非常に一般的な別のステミングアルゴリズムです。

LancasterStemmerクラス

NLTKには LancasterStemmer クラスがあり、これを使用して、語幹処理したい単語にLancaster Stemmerアルゴリズムを簡単に実装できます。 例を見てみましょう-

まず、自然言語ツールキット(nltk)をインポートする必要があります。

import nltk
*LancasterStemmer* クラスをインポートして、Lancaster Stemmerアルゴリズムを実装します
from nltk.stem import LancasterStemmer

次に、次のように LancasterStemmer クラスのインスタンスを作成します-

Lanc_stemmer = LancasterStemmer()

次に、語幹処理したい単語を入力します。

Lanc_stemmer.stem('eats')

出力

'eat'

完全な実装例

import nltk
from nltk.stem import LancatserStemmer
Lanc_stemmer = LancasterStemmer()
Lanc_stemmer.stem('eats')

出力

'eat'

正規表現ステミングアルゴリズム

このステミングアルゴリズムを使用して、独自のステマーを構築できます。

RegexpStemmerクラス

NLTKには RegexpStemmer クラスがあり、正規表現ステマーアルゴリズムを簡単に実装できます。 基本的に単一の正規表現を取り、その表現に一致する接頭辞または接尾辞を削除します。 例を見てみましょう-

まず、自然言語ツールキット(nltk)をインポートする必要があります。

import nltk

次に、 RegexpStemmer クラスをインポートして、正規表現ステマーアルゴリズムを実装します。

from nltk.stem import RegexpStemmer

次に、 RegexpStemmer クラスのインスタンスを作成し、次のように単語から削除するサフィックスまたはプレフィックスを指定します-

Reg_stemmer = RegexpStemmer(‘ing’)

次に、語幹処理したい単語を入力します。

Reg_stemmer.stem('eating')

出力

'eat'
Reg_stemmer.stem('ingeat')

出力

'eat'
Reg_stemmer.stem('eats')

出力

'eat'

完全な実装例

import nltk
from nltk.stem import RegexpStemmer
Reg_stemmer = RegexpStemmer()
Reg_stemmer.stem('ingeat')

出力

'eat'

Snowballステミングアルゴリズム

これは、非常に便利なステミングアルゴリズムです。

SnowballStemmerクラス

NLTKには SnowballStemmer クラスがあり、これを利用してSnowball Stemmerアルゴリズムを簡単に実装できます。 15の非英語言語をサポートしています。 このスチーミングクラスを使用するには、使用する言語の名前でインスタンスを作成し、stem()メソッドを呼び出す必要があります。 例を見てみましょう-

まず、自然言語ツールキット(nltk)をインポートする必要があります。

import nltk

次に、 SnowballStemmer クラスをインポートして、Snowball Stemmerアルゴリズムを実装します。

from nltk.stem import SnowballStemmer

それがサポートする言語を見てみましょう-

SnowballStemmer.languages

出力

(
   'arabic',
   'danish',
   'dutch',
   'english',
   'finnish',
   'french',
   'german',
   'hungarian',
   'italian',
   'norwegian',
   'porter',
   'portuguese',
   'romanian',
   'russian',
   'spanish',
   'swedish'
)

次に、使用したい言語でSnowballStemmerクラスのインスタンスを作成します。 ここでは、「フランス語」言語のステマーを作成しています。

French_stemmer = SnowballStemmer(‘french’)

次に、stem()メソッドを呼び出して、語幹処理したい単語を入力します。

French_stemmer.stem (‘Bonjoura’)

出力

'bonjour'

完全な実装例

import nltk
from nltk.stem import SnowballStemmer
French_stemmer = SnowballStemmer(‘french’)
French_stemmer.stem (‘Bonjoura’)

出力

'bonjour'

レンマ化とは何ですか?

レンマ化技法はステミングのようなものです。 見出し語化の後に得られる出力は「見出し語」と呼ばれます。これは、語幹の出力である語幹ではなく語根です。 見出し語化の後、同じことを意味する有効な単語が得られます。

NLTKは、 wordnet コーパスの薄いラッパーである WordNetLemmatizer クラスを提供します。 このクラスは、 Wordy CorpusReader クラスに対して* morphy()*関数を使用して、補題を検索します。 例でそれを理解しましょう-

まず、自然言語ツールキット(nltk)をインポートする必要があります。

import nltk

次に、 WordNetLemmatizer クラスをインポートして、見出し語化手法を実装します。

from nltk.stem import WordNetLemmatizer

次に、 WordNetLemmatizer クラスのインスタンスを作成します。

lemmatizer = WordNetLemmatizer()

次に、lemmatize()メソッドを呼び出して、見出し語を検索する単語を入力します。

lemmatizer.lemmatize('eating')

出力

'eating'
lemmatizer.lemmatize('books')

出力

'book'

完全な実装例

import nltk
from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
lemmatizer.lemmatize('books')

出力

'book'

ステミングとレンマ化の違い

次の例の助けを借りて、ステミングとレンマ化の違いを理解しましょう-

import nltk
from nltk.stem import PorterStemmer
word_stemmer = PorterStemmer()
word_stemmer.stem('believes')

出力

believ
import nltk
from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
lemmatizer.lemmatize(' believes ')

出力

believ

両方のプログラムの出力は、ステミングと見出し語化の主な違いを示しています。 PorterStemmer クラスは、単語から「es」を切り捨てます。 一方、 WordNetLemmatizer クラスは有効な単語を検索します。 簡単な言葉で言えば、語幹解釈技法は単語の形だけを見るのに対して、見出し語化技法は単語の意味を調べます。 これは、見出し語化を適用した後、常に有効な単語を取得することを意味します。