この記事は、の一部として公開されました データサイエンスブログソン.
NLPを使用した情報検索システムの構築に関するエンドツーエンドガイド
やあ、フォークス!
LSTMを使用したテキスト生成に関する前回の記事をまだ読んでいない場合は、これを楽しんでいただければ幸いです。 .
この記事では、情報検索システムであるNLPの非常に興味深いがトリッキーなユースケースについて説明します。 情報検索システムは、NLPの非常に広く使用されているアプリケーションです。
情報検索システムでは、さまざまなドキュメントのコレクションがあり、コンテキストの意味を渡して特定のドキュメントを検索する必要があります。
目次
- 概要
- 単語の埋め込み
- IRシステムの実装
概要
Googleには何兆ものWebページがありますが、GoogleはページのURLを取得せずに、関連するWebページを効率的に検索する方法を教えてください。
IR(情報検索)システムを使用すると、そのドキュメントに関する意味のある情報に基づいて、効率的な方法でドキュメントを検索できます。
私たちが知っているように、XNUMXつの文は非常に異なる構造と異なる単語を持つことができますが、それらはおそらく同じ意味を持つことができます。 NLPでの私たちの目標は、記事でさらに詳しく説明するさまざまなNLPの概念を使用して、文の意味を把握することです。
IRシステムでは、コンテキストの意味を使用してドキュメントを検索します。
問題文:コンテキストの意味を使用して情報検索システムを実行します。
解決法:
情報検索を実行するには、複数の方法があります。 しかし、単語の埋め込みを使用してそれを行う最も簡単で非常に効率的な方法。 単語の埋め込みは、文の構造に関係なく、文脈の意味を考慮に入れます。
IRシステムのアプリケーション:
- ドキュメント検索
- パッセージ検索
- 検索エンジン
- 質問に答える
単語の埋め込み
単語埋め込みの実装を含むさまざまな特徴抽出手法に関する記事を書きました。まだ読んでいない場合は、リンクは次のとおりです。 こちら.
単語の埋め込みは、単語の構造に関係なく、文の意味を理解することができます。
例えば、
「私は、彼を愛しています"と"彼が好き単語の埋め込みを使用する場合、」はほぼ同じ意味になります
これは、単語がコンテキスト階層を使用してベクトルにマッピングされる予測特徴学習手法です。
ご覧のとおり 子猫 & cat それらは非常に近い意味を持っているので、非常に近くに配置されます。
単語の埋め込みは、浅いニューラルネットワークを使用して8億以上の単語でトレーニングされています。タスクには、事前にトレーニングされた単語の埋め込みベクトルを使用します。
IRシステムの実装
Pythonを使用して情報検索システムを実装します。
情報検索システムを実装している間、私たちが従う必要のあるいくつかのステップがあります:-
- データの取得
- データのクリーニング
- 事前にトレーニングされたword2vecを読み込んでいます
- ドキュメントのコンテキストの意味を取得する
- クエリとドキュメントの比較
1ドキュメントの取得
4つのドキュメントを含む独自のデータセットを作成しました。理解を深めるために、小さなデータセットを使用します。
Doc1 = ["" "天然資源の浪費は非常に深刻な問題です。天然資源は限られていることは誰もが知っていますが、それでも私たちはそれを感じていません。必要以上に使用しています。政府はまた、人々に天然資源の節約を奨励しています。" ""] Doc2 = ["" "機械学習は現在非常に人気のある研究分野であり、継続的な研究が行われています。機械学習はすべて数学に関するものです。パターンを分析することで課題を解決できます。" ""] Doc3 = [ "" "電話やスマートガジェットが昔を引き継いでいるため、今日では本の魅力が失われています。本はデジタル方式で印刷されるようになりました。これにより、紙が節約され、最終的には数千本の木が節約されます "" "] Doc4 = [" ""ウィケットの後ろの男はMSDHONIであり、ウィケットの後ろの彼の速い手はインドにとって大きな利点ですが、パンツは現在DHONIの遺産を運んでいますが、彼はそれほど速くはありません "" "]
ここには4つのドキュメントがあり、データセットはコンマで区切られたドキュメントのリストになります。
#------すべてのドキュメントのマージ------- data = doc1 + doc2 + doc3 + doc4 print(data)
2必要なライブラリのインポート
一度に使用されるすべての依存関係をインポートしています。
import numpy as np import nltk import itertools from nltk.tokenize import stopwords from nltk.tokenize import send_tokenize、word_tokenize import scipy from scipy import Spatial import re tokenizer = ToktokTokenizer()stopword_list = nltk.corpus.stopwords.words('english')
3データクリーニング
NLPでは、データクリーニングは常にトレーニングを一般化し、より良い結果を約束します。 データのロード後にデータクリーニングを実行することは常に良い習慣です。
データクリーニング機能の作成
def remove_stopwords(text、is_lower_case = False):pattern = r'[^ a-zA-z0-9s]' text = re.sub(pattern、 ""、'' .join(text))tokens = tokenizer.tokenize( text)tokens = [tok.strip()for tok in tokens] if is_lower_case:cleaned_token = [tok for tok in tokens if tok not in stopword_list] else:cleaned_tokens = [tok for tok in tokens if tok.lower()not in stopword_list]filtered_text ='' .join(cleaned_tokens)returnfiltered_text
関数 remove_stopwords
ドキュメントをXNUMXつずつ取得し、クリーンアップされたドキュメントを返します。
- まず、正規表現を使用して不要な文字をすべて削除しました。
- 不要な文字を削除した後、フィルタリングされた単語をトークン化し、stopword_listを使用してすべてのストップワードを除外しました。
4単語埋め込みの実装
300次元の事前トレーニング済みの単語ベクトルを使用します。 これを使用して単語ベクトルをダウンロードできます 。 ワールドベクトルの大きなファイルをダウンロードしたくない場合は、Kaggleでノートブックを作成することをお勧めします。
単語ベクトルの読み込み
単語ベクトルは、単語とそれに対応するベクトルを含むテキストファイルです。
glove_vectors = dict()file = open('../ input / glove6b / glove.6B.300d.txt'、encoding ='utf-8')for line in file:values = line.split()word = values [ 0]ベクトル=np.asarray(values [1:])glove_vectors [word] =ベクトルfile.close()
glove_vector
これは、キーとしての単語と特徴ベクトルとしての値を含む辞書です。glove.6B.300d
この単語の埋め込みは6億の単語でトレーニングされており、特徴ベクトルの長さは300です。- 単語が単語ベクトル辞書に存在しない場合、300の長さのゼロベクトルが返されます。
例:
glove_vectors ['cat']
猫に返される特徴ベクトルは300の特徴値を持っています。
単語の埋め込みを使用して、ドキュメントの特徴ベクトルを作成します。
文を受け取り、300次元の特徴ベクトルを返す関数を作成しています。
vec_dimension = 300 def get_embedding(x):arr = np.zeros(vec_dimension)text = str(x).split()for t in text:try:vec = glove_vectors.get(t).astype(float)arr = arr + vecを除く:pass arr = arr.reshape(1、-1)[0] return(arr / len(text))
5ドキュメントの要約
ドキュメントには多くの文が含まれており、文にはその文に存在する単語の数に基づいた多くのベクトルがあります。
ドキュメントの意味を要約するには、そのドキュメント内のすべての文の意味を平均する必要があります。
NLPの言語では、そのドキュメント内のすべての文のすべての特徴ベクトルを平均します。
out_dict = {} for sen in fin:average_vector =(np.mean(np.array([get_embedding(x)for x in nltk.word_tokenize(remove_stopwords(sen))])、axis = 0))dict = {sen: (average_vector)} out_dict.update(dict)
- 辞書out_dictには、キーとしてドキュメントが含まれ、対応する値としてそれらの平均特徴ベクトルが含まれています。
- 平均特徴ベクトルは、ドキュメントの意味をベクトルにエンコードします。
6コンテキストの意味の比較
現在のところ、すべてのドキュメントの特徴ベクトルがあり、その意味に基づいて特徴ベクトルを比較できる関数を作成する必要があります。
XNUMXつの単語の類似性は、それらの特徴ベクトル間の余弦距離を使用して計算できます。
def get_sim(query_embedding、average_vector_doc):sim = [(1-scipy.spatial.distance.cosine(query_embedding、average_vector_doc))] return sim
- 機能
get_sim
クエリの機能ベクトルとすべてのドキュメントの機能ベクトルを取得し、クエリとドキュメントの類似性を返します。 - 類似性がある場合
sim
高く、1に近いほど、ほぼ同じ意味であると言えます。 - 類似性がある場合
sim
0に近いほど、意味が違うと言えます。 - その包み
scipy
クラスを提供しますscipy.spatial.distance.cosine
コサイン距離を計算するため。
7クエリの作成
ドキュメントの特徴ベクトルの準備ができているだけでなく、XNUMXつの特徴ベクトルの類似性を比較する関数を作成しました。
def Rank_documents(query):query_word_vectors =(np.mean(np.array([get_embedding(x)for x in nltk.word_tokenize(query.lower())]、dtype = float)、axis = 0))rank = [ ] for k、v in out_dict.items():rank.append((k、get_sim(query_word_vectors、v)))rank =sorted(rank、key = lambda t:t [1]、reverse = True)print( 'ランク付けされたドキュメント:')returnrank [0]
query_word_vectors
これは、入力クエリの特徴ベクトルを保持します。- 関数
Ranked_document
クエリの特徴ベクトル間の類似性をドキュメントの特徴ベクトルと繰り返し比較します。 - 出力として最も類似したドキュメントをXNUMXつだけ返します。
8結果
私たちが呼ぶとき Ranked_document
関数はクエリを渡すことにより、クエリに関連する最も関連性の高いドキュメントをXNUMXつ返します。
Example1:
ランク付けされたドキュメント('バットアンドボール')
ご覧のとおり bat and ball
このキーワードを検索したときにクリケットに関連しているモデルは、クリケットに関連するドキュメントを返します。 さらに、このドキュメントには、バットアンドボールの単語はありません。
Example2:
ランク付けされたドキュメント('コンピュータサイエンス')
コンピュータサイエンスは機械学習に関連していることは誰もが知っています。 キーワードを照会したとき computer science
コンピュータサイエンスに関連するドキュメントを返しました。
まとめ
この記事では、特徴ベクトルを比較することによる文書/文の意味の比較に基づく文書検索システムについて説明しました。
Pythonと事前にトレーニングされた単語の埋め込みを使用してドキュメント検索システムを実装しました。 ドキュメントの照合を実行する方法は複数ありますが、単語の埋め込みと scipy’s
コサイン距離の実装が非常に簡単になります。
ディープラーニングを使用した検索エンジンに関する私の記事が気に入っていただけたでしょうか。
これを使用して、この記事で使用されているコードをコピーしてダウンロードできます .
お気軽に当たってください LinkedIn 質問や提案があれば。
この記事に示されているメディアは Analytics Vidhya が所有するものではなく、著者の裁量で使用されています。