Artificial-intelligence-with-python-nltk-package

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

AI with Python – NLTKパッケージ

この章では、Natural Language Toolkit Packageを開始する方法を学びます。

前提条件

自然言語処理を使用してアプリケーションを構築する場合、コンテキストの変更が最も困難になります。 コンテキスト要因は、マシンが特定の文をどのように理解するかに影響します。 したがって、機械学習アプローチを使用して自然言語アプリケーションを開発し、人間がコンテキストを理解する方法も機械が理解できるようにする必要があります。

このようなアプリケーションを構築するには、NLTK(Natural Language Toolkit Package)と呼ばれるPythonパッケージを使用します。

NLTKのインポート

NLTKを使用する前にインストールする必要があります。 それは、次のコマンドの助けを借りてインストールすることができます-

pip install nltk

NLTKのcondaパッケージを構築するには、次のコマンドを使用します-

conda install -c anaconda nltk

NLTKパッケージをインストールしたら、pythonコマンドプロンプトからインポートする必要があります。 Pythonコマンドプロンプトで次のコマンドを記述することでインポートできます-

>>> import nltk

NLTKのデータをダウンロードする

NLTKをインポートしたら、必要なデータをダウンロードする必要があります。 Pythonコマンドプロンプトで次のコマンドの助けを借りて行うことができます-

>>> nltk.download()

その他の必要なパッケージのインストール

NLTKを使用して自然言語処理アプリケーションを構築するには、必要なパッケージをインストールする必要があります。 パッケージは次のとおりです-

ゲンシム

これは、多くのアプリケーションに役立つ堅牢なセマンティックモデリングライブラリです。 次のコマンドを実行してインストールできます-

pip install gensim

パターン

*gensim* パッケージを適切に動作させるために使用されます。 次のコマンドを実行してインストールできます
pip install pattern

トークン化、ステミング、および補題の概念

このセクションでは、トークン化、ステミング、および見出し語化とは何かを理解します。

トークン化

それは、与えられたテキストを壊すプロセスとして定義されるかもしれません。 トークンと呼ばれる小さな単位への文字シーケンス。 トークンは、単語、数字、または句読点です。 単語のセグメンテーションとも呼ばれます。 以下は、トークン化の簡単な例です-

入力-マンゴー、バナナ、パイナップル、リンゴはすべて果物です。

出力-トークン化

与えられたテキストを壊すプロセスは、単語の境界を見つける助けを借りて行うことができます。 単語の終わりと新しい単語の始まりを単語境界と呼びます。 書記体系と単語の活字構造が境界に影響します。

Python NLTKモジュールには、要件に応じてテキストをトークンに分割するために使用できるトークン化に関連するさまざまなパッケージがあります。 パッケージのいくつかは次のとおりです-

sent_tokenizeパッケージ

名前が示すように、このパッケージは入力テキストを文に分割します。 私たちは次のPythonコードの助けを借りてこのパッケージをインポートできます-

from nltk.tokenize import sent_tokenize

word_tokenizeパッケージ

このパッケージは、入力テキストを単語に分割します。 私たちは次のPythonコードの助けを借りてこのパッケージをインポートできます-

from nltk.tokenize import word_tokenize

WordPunctTokenizerパッケージ

このパッケージは、入力テキストを句読点と同様に単語に分割します。 私たちは次のPythonコードの助けを借りてこのパッケージをインポートできます-

from nltk.tokenize import WordPuncttokenizer

ステミング

言葉を使いながら、文法的な理由から多くのバリエーションに遭遇します。 ここでのバリエーションの概念は、 _ democracy、democratic、' および _democratization' のような同じ単語の異なる形式を処理する必要があることを意味します。 これらの異なる単語が同じ基本形式を持っていることを機械が理解することは非常に必要です。 この方法では、テキストを分析しているときに単語の基本形を抽出すると便利です。

これはステミングによって達成できます。 このように、ステミングは、単語の両端を切り落とすことにより、単語の基本形を抽出するヒューリスティックなプロセスであると言えます。

Python NLTKモジュールには、ステミングに関連するさまざまなパッケージがあります。 これらのパッケージを使用して、単語の基本形式を取得できます。 これらのパッケージはアルゴリズムを使用します。 パッケージのいくつかは次のとおりです-

PorterStemmerパッケージ

このPythonパッケージは、ポーターのアルゴリズムを使用して基本フォームを抽出します。 私たちは次のPythonコードの助けを借りてこのパッケージをインポートできます-

from nltk.stem.porter import PorterStemmer

たとえば、このステマーへの入力として「書き込み」という単語を指定すると、ステミング後に「書き込み」という単語が表示されます。

LancasterStemmerパッケージ

このPythonパッケージは、ランカスターのアルゴリズムを使用して基本フォームを抽出します。 私たちは次のPythonコードの助けを借りてこのパッケージをインポートできます-

from nltk.stem.lancaster import LancasterStemmer

たとえば、このステマーへの入力として「書き込み」という単語を指定すると、ステミング後に「書き込み」という単語が表示されます。

SnowballStemmerパッケージ

このPythonパッケージは、スノーボールのアルゴリズムを使用して基本フォームを抽出します。 私たちは次のPythonコードの助けを借りてこのパッケージをインポートできます-

from nltk.stem.snowball import SnowballStemmer

たとえば、このステマーへの入力として「書き込み」という単語を指定すると、ステミング後に「書き込み」という単語が表示されます。

これらのアルゴリズムはすべて、厳密さのレベルが異なります。 これら3つのステマーを比較すると、ポーターステマーが最も厳密でなく、ランカスターが最も厳密です。 スノーボールステマーは、速度と厳密さの点で使用するのに適しています。

補題

見出し語化によって単語の基本形を抽出することもできます。 基本的には、語彙と単語の形態素解析を使用してこのタスクを実行し、通常は屈折語尾のみを削除することを目的としています。 単語のこの種の基本形は補題と呼ばれます。

ステミングと見出し語化の主な違いは、単語の語彙と形態素解析の使用です。 別の違いは、語幹化が派生語に関連する単語を最も頻繁に折りたたむのに対し、補題化は一般的に補題の異なる屈折形のみを折りたたむことです。 たとえば、入力語としてsawを指定した場合、ステミングは単語「s」を返す可能性がありますが、見出し語化は、トークンの使用が動詞であるか名詞であるかに応じてseeまたはsawの単語を返そうとします。

Python NLTKモジュールには、単語の基本形を取得するために使用できる補題化プロセスに関連する次のパッケージがあります-

WordNetLemmatizerパッケージ

このPythonパッケージは、名詞として使用されるか動詞として使用されるかに応じて、単語の基本形を抽出します。 私たちは次のPythonコードの助けを借りてこのパッケージをインポートできます-

from nltk.stem import WordNetLemmatizer

チャンキング:データをチャンクに分割する

これは、自然言語処理の重要なプロセスの1つです。 チャンクの主な仕事は、品詞や名詞句などの短い句を識別することです。 トークン化のプロセス、トークンの作成についてはすでに検討しました。 チャンキングは基本的に、これらのトークンのラベル付けです。 言い換えれば、チャンクは文の構造を示します。

次のセクションでは、さまざまなタイプのチャンキングについて学習します。

チャンクの種類

チャンキングには2つのタイプがあります。 タイプは次のとおりです-

チャンクアップ

このチャンクのプロセスでは、オブジェクト、物など。 より一般的になり、言語がより抽象的になります。 合意の可能性がさらにあります。 このプロセスでは、ズームアウトします。 たとえば、「車は何の目的なのか」という質問をまとめたらどうでしょうか。 「トランスポート」という回答が得られる場合があります。

チャンクダウン

このチャンクのプロセスでは、オブジェクト、物など。 より具体的になり、言語が浸透します。 より深い構造は、チャンクダウンで調べられます。 このプロセスでは、ズームインします。 たとえば、「車について具体的に教えて」という質問をまとめたらどうでしょうか。 車に関する小さな情報を入手します。

この例では、PythonのNLTKモジュールを使用して、文の名詞句チャンクを見つけるチャンクのカテゴリである名詞句チャンキングを行います-

名詞句のチャンク化を実装するには、Pythonで次の手順を実行します-

  • ステップ1 *-このステップでは、チャンク用の文法を定義する必要があります。 それは私たちが従う必要のある規則から成ります。
  • ステップ2 *-このステップでは、チャンクパーサーを作成する必要があります。 文法を解析し、出力を提供します。
  • ステップ3 *-この最後のステップでは、出力はツリー形式で生成されます。

次のように必要なNLTKパッケージをインポートしましょう-

import nltk

次に、文を定義する必要があります。 ここで、DTは行列式、VBPは動詞、JJは形容詞、INは前置詞、NNは名詞を意味します。

sentence=[("a","DT"),("clever","JJ"),("fox","NN"),("was","VBP"),
          ("jumping","VBP"),("over","IN"),("the","DT"),("wall","NN")]

次に、文法を与える必要があります。 ここでは、正規表現の形式で文法を示します。

grammar = "NP:{<DT>?<JJ>*<NN>}"

文法を解析するパーサーを定義する必要があります。

parser_chunking = nltk.RegexpParser(grammar)

パーサーは次のように文を解析します-

parser_chunking.parse(sentence)

次に、出力を取得する必要があります。 出力は、 output_chunk と呼ばれる単純な変数で生成されます。

Output_chunk = parser_chunking.parse(sentence)

次のコードを実行すると、出力をツリー形式で描画できます。

output.draw()

Nltk

ワードオブワード(BoW)モデル

自然言語処理のモデルであるBag of Word(BoW)は、基本的にテキストから特徴を抽出するために使用され、テキストを機械学習アルゴリズムなどのモデリングで使用できるようにします。

ここで、なぜテキストから特徴を抽出する必要があるのか​​という疑問が生じます。 これは、機械学習アルゴリズムが生データを扱うことができず、意味のある情報を抽出できるように数値データが必要だからです。 テキストデータの数値データへの変換は、特徴抽出または特徴エンコードと呼ばれます。

使い方

これは、テキストから特徴を抽出するための非常に簡単なアプローチです。 テキストドキュメントがあり、それを数値データに変換するか、またはそれから特徴を抽出したい場合、まずこのモデルはドキュメント内のすべての単語から語彙を抽出するとします。 次に、ドキュメント用語マトリックスを使用して、モデルを構築します。 このように、BoWはドキュメントを単語の袋としてのみ表します。 文書内の単語の順序または構造に関する情報はすべて破棄されます。

文書用語マトリックスの概念

BoWアルゴリズムは、ドキュメント用語マトリックスを使用してモデルを構築します。 名前が示すように、ドキュメント用語マトリックスは、ドキュメント内で発生するさまざまな単語数のマトリックスです。 このマトリックスの助けを借りて、テキスト文書はさまざまな単語の重み付き組み合わせとして表すことができます。 しきい値を設定し、より意味のある単語を選択することで、特徴ベクトルとして使用できるドキュメント内のすべての単語のヒストグラムを作成できます。 以下は、ドキュメントの用語マトリックスの概念を理解するための例です-

次の2つの文があると仮定します-

  • *文1 *-私たちはBag of Wordsモデルを使用しています。
  • *文2 *-特徴の抽出にはBag of Wordsモデルが使用されます。

今、これらの2つの文を検討することにより、次の13の異なる単語があります-

  • we
  • are
  • 使う
  • the
  • bag
  • of
  • ことば
  • モデル
  • is
  • used
  • for
  • 抜き取り
  • 特徴

今、私たちは各文の単語数を使用して、各文のヒストグラムを構築する必要があります-

  • *文1 *-[1,1,1,1,1,1,1,1,0,0,0,0,0]
  • *文2 *-[0,0,0,1,1,1,1,1,1,1,1,1,1,1]

このようにして、抽出された特徴ベクトルがあります。 13個の異なる単語があるため、各特徴ベクトルは13次元です。

統計の概念

統計の概念は、TermFrequency-Inverse Document Frequency(tf-idf)と呼ばれます。 ドキュメントではすべての単語が重要です。 統計は、すべての単語の重要性を理解するのに役立ちます。

期間頻度(tf)

これは、ドキュメント内の各単語の出現頻度の尺度です。 これは、各単語のカウントを特定のドキュメント内の単語の総数で除算することで取得できます。

逆ドキュメント頻度(idf)

これは、指定された一連のドキュメントの中で、このドキュメントに対して単語がどれだけユニークであるかの尺度です。 idfを計算し、特徴的な特徴ベクトルを定式化するために、のようなよくある単語の重みを減らし、まれな単語を重み付けする必要があります。

NLTKでBag of Wordsモデルを作成する

このセクションでは、CountVectorizerを使用してこれらの文からベクトルを作成することにより、文字列のコレクションを定義します。

必要なパッケージをインポートしましょう-

from sklearn.feature_extraction.text import CountVectorizer

次に、一連の文を定義します。

Sentences = ['We are using the Bag of Word model', 'Bag of Word model is
           used for extracting the features.']

vectorizer_count = CountVectorizer()

features_text = vectorizer.fit_transform(Sentences).todense()

print(vectorizer.vocabulary_)

上記のプログラムは、次のように出力を生成します。 上記の2つの文に13の異なる単語があることを示しています-

{'we': 11, 'are': 0, 'using': 10, 'the': 8, 'bag': 1, 'of': 7,
 'word': 12, 'model': 6, 'is': 5, 'used': 9, 'for': 4, 'extracting': 2, 'features': 3}

これらは、機械学習に使用できる特徴ベクトル(テキストから数値形式)です。

問題を解決する

このセクションでは、関連するいくつかの問題を解決します。

カテゴリー予測

一連のドキュメントでは、単語だけでなく、単語のカテゴリも重要です。特定の単語が含まれるテキストのカテゴリ。 たとえば、特定の文が電子メール、ニュース、スポーツ、コンピューターなどのカテゴリに属する​​かどうかを予測したいとします。 次の例では、tf-idfを使用して特徴ベクトルを定式化し、ドキュメントのカテゴリを検索します。 sklearnの20のニュースグループデータセットのデータを使用します。

私たちは必要なパッケージをインポートする必要があります-

from sklearn.datasets import fetch_20newsgroups
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer

カテゴリマップを定義します。 宗教、自動車、スポーツ、電子機器、宇宙という5つの異なるカテゴリを使用しています。

category_map = {'talk.religion.misc':'Religion','rec.autos''Autos',
   'rec.sport.hockey':'Hockey','sci.electronics':'Electronics', 'sci.space': 'Space'}

トレーニングセットを作成します-

training_data = fetch_20newsgroups(subset = 'train',
   categories = category_map.keys(), shuffle = True, random_state = 5)

カウントベクトライザーを構築し、用語カウントを抽出します-

vectorizer_count = CountVectorizer()
train_tc = vectorizer_count.fit_transform(training_data.data)
print("\nDimensions of training data:", train_tc.shape)

tf-idfトランスフォーマーは次のように作成されます-

tfidf = TfidfTransformer()
train_tfidf = tfidf.fit_transform(train_tc)

今、テストデータを定義します-

input_data = [
   'Discovery was a space shuttle',
   'Hindu, Christian, Sikh all are religions',
   'We must have to drive safely',
   'Puck is a disk made of rubber',
   'Television, Microwave, Refrigrated all uses electricity'
]

上記のデータは、多項ナイーブベイズ分類器を訓練するのに役立ちます-

classifier = MultinomialNB().fit(train_tfidf, training_data.target)

カウントベクトライザーを使用して入力データを変換します-

input_tc = vectorizer_count.transform(input_data)

今、私たちはtfidfトランスフォーマーを使用してベクトル化されたデータを変換します-

input_tfidf = tfidf.transform(input_tc)

出力カテゴリを予測します-

predictions = classifier.predict(input_tfidf)

出力は次のように生成されます-

for sent, category in zip(input_data, predictions):
   print('\nInput Data:', sent, '\n Category:', \
      category_map[training_data.target_names[category]])

カテゴリー予測子は、次の出力を生成します-

Dimensions of training data: (2755, 39297)

Input Data: Discovery was a space shuttle
Category: Space

Input Data: Hindu, Christian, Sikh all are religions
Category: Religion

Input Data: We must have to drive safely
Category: Autos

Input Data: Puck is a disk made of rubber
Category: Hockey

Input Data: Television, Microwave, Refrigrated all uses electricity
Category: Electronics

性別検索

この問題の記述では、名前を提供することにより、性別(男性または女性)を見つけるために分類子が訓練されます。 ヒューリスティックを使用して、特徴ベクトルを構築し、分類器をトレーニングする必要があります。 scikit-learnパッケージのラベル付きデータを使用します。 以下は、ジェンダーファインダーを構築するためのPythonコードです-

必要なパッケージをインポートしましょう-

import random

from nltk import NaiveBayesClassifier
from nltk.classify import accuracy as nltk_accuracy
from nltk.corpus import names

ここで、入力語から最後のN文字を抽出する必要があります。 これらの文字は機能として機能します-

def extract_features(word, N = 2):
   last_n_letters = word[-N:]
   return {'feature': last_n_letters.lower()}

if __name__=='__main__':

NLTKで利用可能なラベル付きの名前(男性と女性)を使用してトレーニングデータを作成します-

male_list = [(name, 'male') for name in names.words('male.txt')]
female_list = [(name, 'female') for name in names.words('female.txt')]
data = (male_list + female_list)

random.seed(5)
random.shuffle(data)

今、テストデータは次のように作成されます-

namesInput = ['Rajesh', 'Gaurav', 'Swati', 'Shubha']

次のコードを使用して、トレーニングとテストに使用するサンプルの数を定義します

train_sample = int(0.8 *len(data))

今、私たちは精度を比較できるように、異なる長さを反復処理する必要があります-

for i in range(1, 6):
   print('\nNumber of end letters:', i)
   features = [(extract_features(n, i), gender) for (n, gender) in data]
   train_data, test_data = features[:train_sample],
features[train_sample:]
   classifier = NaiveBayesClassifier.train(train_data)

分類器の精度は次のように計算することができます-

accuracy_classifier = round(100* nltk_accuracy(classifier, test_data), 2)
   print('Accuracy = ' + str(accuracy_classifier) + '%')

今、私たちは出力を予測することができます-

for name in namesInput:
   print(name, '==>', classifier.classify(extract_features(name, i)))

上記のプログラムは、次の出力を生成します-

Number of end letters: 1
Accuracy = 74.7%
Rajesh -> female
Gaurav -> male
Swati -> female
Shubha -> female

Number of end letters: 2
Accuracy = 78.79%
Rajesh -> male
Gaurav -> male
Swati -> female
Shubha -> female

Number of end letters: 3
Accuracy = 77.22%
Rajesh -> male
Gaurav -> female
Swati -> female
Shubha -> female

Number of end letters: 4
Accuracy = 69.98%
Rajesh -> female
Gaurav -> female
Swati -> female
Shubha -> female

Number of end letters: 5
Accuracy = 64.63%
Rajesh -> female
Gaurav -> female
Swati -> female
Shubha -> female

上記の出力では、終了文字の最大数の精度は2であり、終了文字の数が増えるにつれて精度が低下していることがわかります。

トピックモデリング:テキストデータのパターンの識別

一般的に、ドキュメントはトピックにグループ化されることを知っています。 特定のトピックに対応するテキストのパターンを識別する必要がある場合があります。 これを行う手法は、トピックモデリングと呼ばれます。 言い換えれば、トピックモデリングは、特定のドキュメントセット内の抽象的なテーマまたは隠された構造を明らかにする手法であると言えます。

私たちは、次のシナリオでトピックモデリング技術を使用することができます-

テキスト分類

トピックモデリングを使用すると、各単語を個別に機能として使用するのではなく、類似した単語をグループ化するため、分類を改善できます。

レコメンダーシステム

トピックモデリングの助けを借りて、類似性の尺度を使用してレコメンダーシステムを構築できます。

トピックモデリングのアルゴリズム

アルゴリズムを使用して、トピックモデリングを実装できます。 アルゴリズムは次のとおりです-

潜在ディリクレ割り当て(LDA)

このアルゴリズムは、トピックモデリングで最も一般的です。 トピックモデリングの実装に確率的グラフィカルモデルを使用します。 LDA slgorithmを使用するには、Pythonでgensimパッケージをインポートする必要があります。

潜在的意味分析(LDA)または潜在的意味索引付け(LSI)

このアルゴリズムは線形代数に基づいています。 基本的に、ドキュメント用語マトリックスでSVD(特異値分解)の概念を使用します。

非負行列因子分解(NMF)

また、線形代数に基づいています。

上記のトピックモデリングのアルゴリズムはすべて、パラメータとして*トピック数*、入力として*ドキュメントワードマトリックス*、出力として* WTM(ワードトピックマトリックス)および TDM(トピックドキュメントマトリックス)*を持ちます。 。