Word 埋め込みと Word2Vec モデルと例

Word 埋め込みとは何ですか?

単語の埋め込み は、機械学習アルゴリズムが類似した意味を持つ単語を理解できるようにする単語表現タイプです。これは、ニューラル ネットワーク、確率モデル、または単語共起行列の次元削減を使用して、単語を実数のベクトルにマッピングする言語モデリングおよび特徴学習手法です。単語埋め込みモデルには、Word2vec (Google)、Glove (スタンフォード大学)、fastest (Facebook) などがあります。

Word Embedding は、分散意味論的モデル、分散表現または意味論的ベクトル空間またはベクトル空間モデルとも呼ばれます。 これらの名前を読んでいると、類似した単語をまとめて分類することを意味するセマンティックという単語に遭遇します。 たとえば、リンゴ、マンゴー、バナナなどの果物は近くに配置する必要がありますが、本はこれらの単語から遠く離れた場所に配置します。 より広い意味では、単語の埋め込みにより、本のベクトル表現から遠く離れた場所に配置される果物のベクトルが作成されます。

Word の埋め込みはどこで使用されますか?

単語埋め込みは、特徴生成、ドキュメントのクラスタリング、テキスト分類、自然言語処理タスクに役立ちます。これらをリストし、それぞれのアプリケーションについて説明しましょう。

  • 類似した単語を計算します。 単語の埋め込みは、予測モデルの対象となる単語に類似した単語を提案するために使用されます。 それに加えて、最も一般的な単語だけでなく、異なる単語も提案します。
  • 関連する単語のグループを作成します。 これは、似た特徴を持つものを一緒にグループ化し、遠く離れた異なるものをグループ化する意味論的なグループ化に使用されます。
  • テキスト分類の機能: テキストはベクトルの配列にマッピングされ、トレーニングと予測のためにモデルに供給されます。 テキストベースの分類子モデルは文字列でトレーニングできないため、テキストが機械でトレーニング可能な形式に変換されます。 さらに、テキストベースの分類でセマンティック ヘルプを構築する機能も備えています。
  • ドキュメントのクラスタリング: Word Embedding Word2vec が広く使用されているもう XNUMX つのアプリケーションです
  • 自然言語処理: 単語の埋め込みが便利で、品詞のタグ付け、感情分析、構文分析などの特徴抽出フェーズで役立つアプリケーションは数多くあります。 これで、単語の埋め込みについてある程度の知識が得られました。 単語埋め込みを実装するために、さまざまなモデルにもいくつかの光が当てられています。 この Word 埋め込みチュートリアル全体は、モデルの 2 つ (WordXNUMXvec) に焦点を当てています。

Word2vecとは何ですか?

Word2vec は、より適切な単語表現を目的とした単語埋め込みを生成する手法/モデルです。 これは、多数の正確な構文的および意味的な単語の関係を取得する自然言語処理方法です。 これは浅い XNUMX 層のニューラル ネットワークであり、トレーニング後に同義語を検出し、文の一部に対して追加の単語を提案できます。

この Word2vec チュートリアルをさらに進める前に、以下の Word 埋め込み例の図に示すように、浅いニューラル ネットワークと深いニューラル ネットワークの違いを確認してください。

浅いニューラル ネットワークは入力と出力の間に XNUMX つの隠れ層のみで構成されますが、深いニューラル ネットワークには入力と出力の間に複数の隠れ層が含まれます。 入力はノードの影響を受けますが、出力層と同様に隠れ層にはニューロンが含まれます。

浅い学習と深い学習
浅い学習と深い学習

Word2vec は、入力 XNUMX つの隠れ層と出力がある XNUMX 層ネットワークです。

Word2vec は、Google の Tomas Mikolov が率いる研究者グループによって開発されました。 Word2vec は、潜在的な意味分析モデルよりも優れており、より効率的です。

Word2vec を使用する理由

Word2vec は単語をベクトル空間表現で表します。単語はベクトルの形で表され、意味が似ている単語は一緒に表示され、意味の異なる単語は離れた位置に配置されます。これは意味関係とも呼ばれます。ニューラル ネットワークはテキストを理解せず、数字のみを理解します。Word Embedding はテキストを数値ベクトルに変換する方法を提供します。

Word2vec は単語の言語コンテキストを再構築します。 さらに先に進む前に、言語的コンテキストとは何なのかを理解しましょう。 一般的な生活の場面では、私たちがコミュニケーションのために話したり書いたりするとき、他の人はその文の目的が何かを理解しようとします。 たとえば、「インドの気温は何度ですか」、ここでのコンテキストは、ユーザーが知りたいのは「インドの気温」、つまりコンテキストです。 つまり、文の主な目的は文脈です。 話し言葉または書き言葉の周りの単語や文(開示)は、文脈の意味を判断するのに役立ちます。 Word2vec は、コンテキストを通じて単語のベクトル表現を学習します。

Word2vec は何をするのですか?

Word埋め込み前

Word 埋め込みの前にどのアプローチが使用されるか、またそのデメリットは何かを知ることが重要です。その後、Word2vec アプローチを使用した Word 埋め込みによってデメリットがどのように克服されるかというトピックに移ります。 最後に、Word2vec の動作を理解することが重要なので、WordXNUMXvec がどのように動作するかを説明します。

潜在意味解析のアプローチ

これは、単語の埋め込みが行われる前に使用されていたアプローチです。 これは、単語がエンコードされたベクトルの形式で表現される Bag of Words の概念を使用しました。 これは、次元が語彙のサイズと等しいスパース ベクトル表現です。 単語が辞書にある場合はカウントされ、それ以外の場合はカウントされません。 さらに詳しく理解するには、以下のプログラムをご覧ください。

Word2vec の例

Word2vec の例

from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer()
data_corpus = ["guru99 is the best site for online tutorials. I love to visit guru99."]
vocabulary = vectorizer.fit(data_corpus)
X = vectorizer.transform(data_corpus)

print(X.toarray())
print(vectorizer.get_feature_names_out())

出力:

[[1 2 1 1 1 1 1 1 1 1]]

[u'best', u'guru99', u'is', u'love', u'online', u'sitefor', u'the', u'to', u'tutorials', u'visit']

コードの説明

  1. CountVectorizer は、単語の適合に基づいて語彙を保存するために使用されるモジュールです。 これはsklearnから輸入したものです。
  2. CountVectorizer クラスを使用してオブジェクトを作成します。
  3. CountVectorizer に当てはめるデータをリストに書き込みます。
  4. データは、CountVectorizer クラスから作成されたオブジェクトに収まります。
  5. Bag of Word アプローチを適用して、語彙を使用してデータ内の単語をカウントします。 単語またはトークンが語彙内で使用できない場合、そのインデックス位置はゼロに設定されます。
  6. 5 行目の変数 x は配列に変換されます (x で使用できるメソッド)。 これにより、3 行目で指定された文またはリスト内の各トークンの数が得られます。
  7. これにより、4 行目のデータを使用して適合させた場合の語彙の一部である特徴が表示されます。

潜在意味論的アプローチでは、行は一意の単語を表し、列はその単語が文書内に出現する回数を表します。 これは、文書マトリックスの形式で単語​​を表現したものです。 用語頻度逆文書頻度 (TFIDF) は、文書内の単語の頻度をカウントするために使用されます。これは、文書内の用語の頻度/コーパス全体内の用語の頻度です。

Bag of Words 法の欠点

  • たとえば、これは悪い = これは悪いというように、単語の順序は無視されます。
  • 単語の文脈を無視します。 「彼は本が好きでした。」という文を書いたとします。 教育は本から得られるのが一番です。」 これにより、「彼は本が好きだった」というベクトルと「教育は本に最もよく見つかる」という XNUMX つのベクトルが作成されます。 両方を直交して扱うため独立していますが、実際には相互に関連しています。

これらの制限を克服するために、単語埋め込みが開発され、Word2vec はそれを実装するためのアプローチです。

Word2vec はどのように機能するのでしょうか?

Word2vec は、周囲のコンテキストを予測して単語を学習します。 たとえば、「彼は」という言葉を考えてみましょう。 フットボール。"

「loves」という単語の Word2vec を計算したいと考えています。

仮に

loves =  Vin. P(Vout / Vin) is calculated	
where,	
Vin is the input word. 	
P is the probability of likelihood.	
Vout is the output word. 	

Word コーパス内の各単語を移動します。 単語間の構文的関係だけでなく意味的関係もエンコードされます。 これは、類似した単語や類似した単語を見つけるのに役立ちます。

単語のすべてのランダムな特徴 計算されます。 これらの機能は、隣接単語または文脈単語に関して変更または更新されます。 誤差逆伝播法 方法。

もう XNUMX つの学習方法は、XNUMX つの単語の文脈が類似している場合、または XNUMX つの単語が類似した特徴を持っている場合、そのような単語は関連しているということです。

Word2vec Archi構造

Word2vec で使用されるアーキテクチャは XNUMX つあります。

  1. 連続バッグ・オブ・ワード (CBOW)
  2. スキップグラム

この Word2vec チュートリアルをさらに進める前に、これらのアーキテクチャやモデルが単語表現の観点からなぜ重要なのかを説明しましょう。単語表現の学習は基本的に教師なしですが、モデルをトレーニングするにはターゲット/ラベルが必要です。Skip-gram と CBOW は、モデル トレーニングのために教師なし表現を教師あり形式に変換します。

CBOWでは、現在の単語は周囲のコンテキストウィンドウのウィンドウを使用して予測されます。たとえば、wI-1,wI-2,wi + 1,wi + 2単語またはコンテキストが与えられると、このモデルは以下の情報を提供します。i

Skip-Gram は、単語から指定されたシーケンスまたはコンテキストを予測することを意味する CBOW の逆の動作を行います。 例を逆にすると理解できます。 もしwi が与えられた場合、これはコンテキストまたは w を予測します。I-1,wI-2,wi + 1,wi+2。

Word2vec では、CBOW (連続 Bag of words) と skim-gram のどちらかを選択するオプションが提供されています。このようなパラメータは、モデルのトレーニング中に提供されます。ネガティブ サンプリングまたは階層型ソフトマックス レイヤーを使用するオプションがあります。

言葉の連続バッグ

連続した単語バッグアーキテクチャを理解するために、簡単な Word2vec の例の図を描いてみましょう。

連続した単語の袋 Archi構造

連続した単語の袋 Archi構造

方程式を数学的に計算してみましょう。 V が語彙サイズ、N が隠れ層サイズであると仮定します。 入力は { x として定義されますI-1、Xi-2、 xi+1、 xi + 2}. V * N を乗算して重み行列を取得します。入力ベクトルに重み行列を乗算すると、別の行列が得られます。これは次の式でも理解できます。

h=xitW

ここでxit? W はそれぞれ入力ベクトルと重み行列です。

コンテキストと次の単語の間の一致を計算するには、以下の式を参照してください。

u=予測された表現*h

ここで、予測表現は上式のモデル?h で取得されます。

スキップグラムモデル

Skip-Gram アプローチは、入力単語が与えられた文を予測するために使用されます。 これをよりよく理解するために、以下の Word2vec の例に示すような図を描いてみましょう。

スキップグラムモデル

スキップグラムモデル

これを、入力が単語であり、モデルがコンテキストまたはシーケンスを提供する、単語の連続バッグ モデルの逆として扱うことができます。 また、ターゲットは入力層に供給され、選択された数のコンテキストワードに対応するために出力層が複数回複製されると結論付けることもできます。 すべての出力層からの誤差ベクトルが合計され、逆伝播法によって重みが調整されます。

どのモデルを選択しますか?

CBOW はスキップ グラムよりも数倍高速で、頻繁に使用される単語に対してより良い周波数を提供します。一方、スキップ グラムは少量のトレーニング データを必要とし、まれな単語やフレーズも表現します。

Word2vecとNLTKの関係

NLTK 自然言語ツールキットです。テキストの前処理に使用されます。品詞のタグ付け、見出し語化、語幹処理、ストップワードの削除、まれな単語や最も使用されていない単語の削除など、さまざまな操作を実行できます。テキストのクリーンアップに役立つだけでなく、有効な単語から特徴を準備するのにも役立ちます。一方、Word2vec は意味的 (密接に関連する項目を一緒に) および構文的 (シーケンス) マッチングに使用されます。Word2vec を使用すると、類似した単語、類似しない単語、次元削減など、さまざまなことを見つけることができます。Word2vec のもう XNUMX つの重要な機能は、テキストの高次元表現を低次元のベクトルに変換することです。

NLTK と Word2vec をどこで使用するのですか?

トークン化、POS タグ付け、解析などの上記の汎用タスクを実行する必要がある場合は、NLTK を使用する必要がありますが、コンテキスト、トピック モデリング、またはドキュメントの類似性に基づいて単語を予測する場合は Word2vec を使用する必要があります。

コードを使用した NLTK と Word2vec の関係

NLTKとWord2vecを一緒に使用して、類似した単語表現や構文マッチングを見つけることができます。NLTKツールキットを使用すると、NLTKに付属する多くのパッケージをロードでき、Word2vecを使用してモデルを作成できます。その後、実際の単語でテストできます。次のコードで、両方の組み合わせを見てみましょう。さらに処理する前に、NLTKが提供するコーパスを確認してください。次のコマンドを使用してダウンロードできます。

nltk(nltk.download('all'))

NLTKとWord2vecの関係

NLTK を使用してダウンロードされたコーパス

コードのスクリーンショットを参照してください。

import nltk
import gensim
from nltk.corpus import abc

model= gensim.models.Word2Vec(abc.sents())
X= list(model.wv.vocab)
data=model.most_similar('science')
print(data)

コードを利用した NLTK と Word2vec の関係

出力:

[('law', 0.9415997266769409), ('practice', 0.9276568293571472), ('discussion', 0.9259148836135864), ('agriculture', 0.9257254004478455), ('media', 0.9232194423675537), ('policy', 0.922248125076294), ('general', 0.9166069030761719), ('undertaking', 0.916458249092102), ('tight', 0.9129181504249573), ('board', 0.9107444286346436)]

コードの説明

  1. nltk ライブラリがインポートされ、そこから次のステップで使用する abc コーパスをダウンロードできます。
  2. ゲンシムは輸入されています。 Gensim Word2vec がインストールされていない場合は、「pip3 install gensim」コマンドを使用してインストールしてください。 以下のスクリーンショットをご覧ください。
PIP を使用した Gensim のインストール

PIP を使用した Gensim のインストール
  1. nltk.download('abc') を使用してダウンロードしたコーパス abc をインポートします。
  2. Gensimを使用してインポートされたファイルをモデルWord2vecに文として渡します。
  3. 語彙は変数の形式で保存されます。
  4. これらのファイルは科学に関連しているため、モデルはサンプル単語サイエンスでテストされます。
  5. ここでは、「科学」という類似の単語がモデルによって予測されます。

アクティベータと Word2Vec

ニューロンの活性化関数は、一連の入力が与えられた場合のニューロンの出力を定義します。生物学的には、異なる刺激を使用して異なるニューロンが活性化される脳の活動にヒントを得ています。次の図で活性化関数を理解しましょう。

Word2vecのアクティベーション機能

アクティベーション関数を理解する

ここで、x1、x2、..x4 はニューラル ネットワークのノードです。

w1、w2、w3 はノードの重みです。

? は、活性化関数として機能するすべての重みとノード値の合計です。

なぜアクティベーション機能なのか?

活性化関数を使用しない場合、出力は線形になりますが、線形関数の機能は制限されます。オブジェクト検出、画像分類、音声を使用したテキスト入力などの複雑な機能を実現するには、活性化関数を使用して実現される他の多くの非線形出力が必要です。

単語埋め込み (Word2vec) でのアクティベーション レイヤーの計算方法

ソフトマックス層(正規化された指数関数)は、各ノードをアクティブ化または起動する出力層関数です。使用される別のアプローチは、複雑さがO(log2V) で、ソフトマックスは O(V) です (V は語彙サイズ)。これらの違いは、階層型ソフトマックス レイヤーの複雑さの削減です。その (階層型ソフトマックス) 機能を理解するには、以下の単語埋め込みの例をご覧ください。

階層的なソフトマックスツリーのような構造

階層的なソフトマックスツリーのような構造

単語が観測される確率を計算したいとします。 特定のコンテキストが与えられると。 ルートからリーフ ノードへのフローは、最初にノード 2 に移動し、次にノード 5 に移動します。したがって、語彙サイズが 8 の場合、必要な計算は XNUMX 回だけです。 したがって、XNUMX つの単語の確率を分解して計算することができます ().

階層的ソフトマックス以外に利用できるオプションはありますか?

一般的な単語埋め込みオプションで言えば、微分ソフトマックス、CNN-ソフトマックス、重要度サンプリング、適応重要度サンプリング、ノイズ対比推定、ネガティブ サンプリング、自己正規化、および低頻度正規化が利用可能です。

特に Word2vec について言えば、ネガティブ サンプリングが利用可能です。

ネガティブ サンプリングは、トレーニング データをサンプリングする方法です。 これは確率的勾配降下法に似ていますが、いくつかの違いがあります。 ネガティブ サンプリングでは、ネガティブなトレーニング サンプルのみが検索されます。 これはノイズ対比推定に基づいており、文脈ではなく単語をランダムにサンプリングします。 これは高速なトレーニング方法であり、コンテキストをランダムに選択します。 予測された単語がランダムに選択されたコンテキスト内に出現する場合、両方のベクトルは互いに近くなります。

どのような結論が導き出せるでしょうか?

アクティベーターは、外部刺激を使用してニューロンが発火するのと同じようにニューロンを発火します。ソフトマックス層は、単語埋め込みの場合にニューロンを発火する出力層関数の 2 つです。WordXNUMXvec には、階層的ソフトマックスやネガティブ サンプリングなどのオプションがあります。アクティベーターを使用すると、線形関数を非線形関数に変換でき、複雑な機械学習アルゴリズムを実装できます。

ゲンシムとは何ですか?

ゲンシム は、オープンソースのトピック モデリングおよび自然言語処理ツールキットであり、 Python そしてサイソン。 Gensim ツールキットを使用すると、ユーザーは Word2vec をインポートしてトピック モデリングを行い、テキスト本文の隠れた構造を発見できます。 Gensim は Word2vec の実装だけでなく、Doc2vec および FastText の実装も提供します。

このチュートリアルはすべて Word2vec に関するものであるため、現在のトピックに限定して説明します。

Gensimを使用してWord2vecを実装する方法

これまで、Word2vec とは何か、そのさまざまなアーキテクチャ、単語バッグから Word2vec への移行の理由、ライブ コードとアクティベーション関数による Word2vec と NLTK の関係について説明しました。

以下は、Gensim を使用して Word2vec を実装するための段階的な方法です。

ステップ 1) データ収集

機械学習モデルの実装または自然言語処理の実装の最初のステップはデータ収集です

以下の Gensim Word2vec の例に示すように、データを観察してインテリジェントなチャットボットを構築してください。

[{"tag": "welcome",
"patterns": ["Hi", "How are you", "Is any one to talk?", "Hello", "hi are you available"],
"responses": ["Hello, thanks for contacting us", "Good to see you here"," Hi there, how may I assist you?"]

        },
{"tag": "goodbye",
"patterns": ["Bye", "See you later", "Goodbye", "I will come back soon"],
"responses": ["See you later, thanks for visiting", "have a great day ahead", "Wish you Come back again soon."]
        },

{"tag": "thankful",
"patterns": ["Thanks for helping me", "Thank your guidance", "That's helpful and kind from you"],
"responses": ["Happy to help!", "Any time!", "My pleasure", "It is my duty to help you"]
        },
        {"tag": "hoursopening",
"patterns": ["What hours are you open?", "Tell your opening time?", "When are you open?", "Just your timing please"],
"responses": ["We're open every day 8am-7pm", "Our office hours are 8am-7pm every day", "We open office at 8 am and close at 7 pm"]
        },

{"tag": "payments",
"patterns": ["Can I pay using credit card?", " Can I pay using Mastercard?", " Can I pay using cash only?" ],
"responses": ["We accept VISA, Mastercard and credit card", "We accept credit card, debit cards and cash. Please don’t worry"]
        }
   ]

データから分かることは次のとおりです

  • このデータには、タグ、パターン、レスポンスの XNUMX つが含まれます。 タグは意図(議論のテーマは何か)です。
  • データはJSON形式です。
  • パターンとは、ユーザーがボットに尋ねる質問です。
  • 応答は、チャットボットが対応する質問/パターンに対して提供する回答です。

ステップ 2) データの前処理

生データを処理することは非常に重要です。 クリーンなデータがマシンに供給されると、モデルはより正確に応答し、より効率的にデータを学習します。

この手順には、ストップ ワード、ステミング、不要な単語などの削除が含まれます。続行する前に、データをロードしてデータ フレームに変換することが重要です。 そのような場合は、以下のコードを参照してください

import json
json_file =’intents.json'
with open('intents.json','r') as f:
    data = json.load(f)

コードの説明:

  1. データは json 形式であるため、json がインポートされます
  2. ファイルは変数に格納されます
  3. ファイルが開かれており、データ変数にロードされています

データがインポートされたので、データをデータ フレームに変換します。 次のステップを確認するには、以下のコードを参照してください。

import pandas as pd
df = pd.DataFrame(data)
df['patterns'] = df['patterns'].apply(', '.join) 

コードの説明:

1. 上記でインポートしたpandasを使用してデータをデータフレームに変換します。

2. 列パターンのリストを文字列に変換します。

from nltk.corpus import stopwords
from textblob import Word
stop = stopwords.words('english')
df['patterns'] = df['patterns'].apply(lambda x:' '.join(x.lower() for x in x.split()))
df['patterns't']= df['patterns''].apply(lambda x: ' '.join(x for x in x.split() if x not in string.punctuation)
df['patterns']= df['patterns'].str.replace('[^\w\s]','')
df['patterns']= df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if  not x.isdigit()))
df['patterns'] = df['patterns'].apply(lambda x:' '.join(x for x in x.split() if not x in stop))
df['patterns'] = df['patterns'].apply(lambda x: " ".join([Word(word).lemmatize() for word in x.split()]))

コードの説明:

1. 英語のストップワードは、nltk ツールキットのストップワードモジュールを使用してインポートされます

2. for 条件とラムダ関数を使用して、テキストのすべての単語が小文字に変換されます。 ラムダ関数 は匿名関数です。

3. データ フレーム内のテキストのすべての行で文字列句読点がチェックされ、文字列句読点がフィルタリングされます。

4. 正規表現を使用して、数字やドットなどの文字が削除されます。

5. Digits はテキストから削除されます。

6. ストップワードはこの段階で削除されます。

7. 単語がフィルタリングされ、見出し語化を使用して同じ単語の異なる形式が削除されます。 以上でデータの前処理は完了です。

出力:

, patterns, responses, tag
0,hi one talk hello hi available,"['Hello, thanks for contacting us', 'Good to see you here', ' Hi there, how may I assist you?']",welcome
1,bye see later goodbye come back soon,"['See you later, thanks for visiting', 'have a great day ahead', 'Wish you Come back again soon.']",goodbye
2,thanks helping thank guidance thats helpful kind,"['Happy to help!', 'Any time!', 'My pleasure', 'It is my duty to help you']",thankful
3,hour open tell opening time open timing please,"[""We're open every day 8am-7pm"", 'Our office hours are 8am-7pm every day', 'We open office at 8 am and close at 7 pm']",hoursopening
4,pay using credit card pay using mastercard pay using cash,"['We accept VISA, Mastercard and credit card', 'We accept credit card, debit cards and cash. Please don’t worry']",payments

ステップ 3) Word2vec を使用したニューラル ネットワークの構築

次に、Gensim Word2vec モジュールを使用してモデルを構築します。 Gensim から Word2vec をインポートする必要があります。 これを実行してからビルドし、最終段階でリアルタイム データでモデルを確認します。

from gensim.models import Word2Vec

この Gensim Word2vec チュートリアルでは、Word2Vec を使用してモデルを正常に構築できます。 Word2Vec を使用してモデルを作成する方法については、コードの次の行を参照してください。 テキストはリストの形式でモデルに提供されるため、以下のコードを使用してテキストをデータフレームからリストに変換します。

Bigger_list=[]
for i in df['patterns']
     li = list(i.split(""))
     Bigger_list.append(li)	
Model= Word2Vec(Bigger_list,min_count=1,size=300,workers=4)

コードの説明:

1. 内部リストが追加される、bigger_list を作成しました。 これは、Word2Vec モデルに供給される形式です。

2. ループが実装され、データ フレームのパターン列の各エントリが反復されます。

3. 列パターンの各要素が分割され、内部リスト li に格納されます。

4. 内側のリストに外側のリストが追加されます。

5. このリストは Word2Vec モデルに提供されます。 ここで提供されるパラメータのいくつかを理解しましょう

最小数: 合計頻度がこれより低い単語はすべて無視されます。

サイズ: これは単語ベクトルの次元を表します。

労働者: これらはモデルをトレーニングするためのスレッドです

他にも利用可能なオプションがあり、いくつかの重要なオプションについては以下で説明します。

ウィンドウ: 文内の現在の単語と予測された単語の間の最大距離。

代表: これはトレーニング アルゴリズムであり、1 は skip-gram で、0 は Continuous bag of words です。これらについては上記で詳しく説明しました。

Hs: これが 1 の場合、トレーニングに階層的ソフトマックスが使用され、0 の場合はネガティブ サンプリングが使用されます。

アルファ: 初期学習率

最終的なコードを以下に表示してみましょう。

#list of libraries used by the code
import string
from gensim.models import Word2Vec
import logging
from nltk.corpus import stopwords
from textblob import Word
import json
import pandas as pd
#data in json format
json_file = 'intents.json'
with open('intents.json','r') as f:
    data = json.load(f)
#displaying the list of stopwords
stop = stopwords.words('english')
#dataframe
df = pd.DataFrame(data)

df['patterns'] = df['patterns'].apply(', '.join)
# print(df['patterns'])
#print(df['patterns'])
#cleaning the data using the NLP approach
print(df)
df['patterns'] = df['patterns'].apply(lambda x:' '.join(x.lower() for x in x.split()))
df['patterns']= df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if x not in string.punctuation))
df['patterns']= df['patterns'].str.replace('[^\w\s]','')
df['patterns']= df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if  not x.isdigit()))
df['patterns'] = df['patterns'].apply(lambda x:' '.join(x for x in x.split() if not x in stop))
df['patterns'] = df['patterns'].apply(lambda x: " ".join([Word(word).lemmatize() for word in x.split()]))
#taking the outer list
bigger_list=[]
for i in df['patterns']:
    li = list(i.split(" "))
    bigger_list.append(li)
#structure of data to be taken by the model.word2vec
print("Data format for the overall list:",bigger_list)
#custom data is fed to machine for further processing
model = Word2Vec(bigger_list, min_count=1,size=300,workers=4)
#print(model)

ステップ4) モデルの保存

モデルはビンとモデルフォームの形式で保存できます。 bin はバイナリ形式です。 モデルを保存するには、以下の行を参照してください。

model.save("word2vec.model")
model.save("model.bin")

上記コードの説明

1. モデルは .model ファイルの形式で保存されます。

2. モデルは .bin ファイルの形式で保存されます

このモデルを使用して、似た単語、似ていない単語、最も一般的な単語などのリアルタイム テストを実行します。

ステップ 5) モデルのロードとリアルタイム テストの実行

モデルは以下のコードを使用してロードされます。

model = Word2Vec.load('model.bin')

語彙を印刷したい場合は、以下のコマンドを使用して実行します。

vocab = list(model.wv.vocab)

結果をご覧ください:

['see', 'thank', 'back', 'thanks', 'soon', 'open', 'mastercard', 'card', 'time', 'pay', 'talk', 'cash', 'one', 'please', 'goodbye', 'thats', 'helpful', 'hour', 'credit', 'hi', 'later', 'guidance', 'opening', 'timing', 'hello', 'helping', 'bye', 'tell', 'come', 'using', 'kind', 'available']

ステップ 6) 最も類似した単語のチェック

実際に実装してみましょう。

similar_words = model.most_similar('thanks')	
print(similar_words)	

結果をご覧ください:

[('kind', 0.16104359924793243), ('using', 0.1352398842573166), ('come', 0.11500970274209976), ('later', 0.09989878535270691), ('helping', 0.04855936020612717), ('credit', 0.04659383371472359), ('pay', 0.0329081267118454), ('thank', 0.02484947443008423), ('hour', 0.0202352125197649), ('opening', 0.018177658319473267)]

ステップ 7) 指定された単語の単語と一致しません

dissimlar_words = model.doesnt_match('See you later, thanks for visiting'.split())
print(dissimlar_words)

私たちは言葉を提供しました 「また後で会いましょう。来てくれてありがとう」 これは意志 これらの単語から最も似ていない単語を出力します。 このコードを実行して結果を見てみましょう

上記のコードを実行した結果:

Thanks

ステップ 8) XNUMX つの単語間の類似性を見つける

これにより、XNUMX つの単語間の類似性の確率がわかります。 このセクションを実行する方法は、以下のコードを参照してください。

similarity_two_words = model.similarity('please','see')
print("Please provide the similarity between these two words:")
print(similarity_two_words)

上記のコードの結果は以下のようになります

0.13706

以下のコードを実行すると、類似した単語をさらに見つけることができます

similar = model.similar_by_word('kind')
print(similar)

上記のコードの出力:

[('credit', 0.11764447391033173), ('cash', 0.11440904438495636), ('one', 0.11151769757270813), ('hour', 0.0944807156920433), ('using', 0.0705675333738327), ('thats', 0.05206916481256485), ('later', 0.04502468928694725), ('bye', 0.03960943967103958), ('back', 0.03837274760007858), ('thank', 0.0380823090672493)] 

まとめ

  • 単語埋め込みは、類似した意味を持つ単語を機械学習アルゴリズムが理解できるようにする単語表現の一種です。
  • 単語埋め込みは、類似語の計算、関連語のグループの作成、テキスト分類の特徴、ドキュメントのクラスタリング、自然言語処理に使用されます。
  • Word2vec の説明: Word2vec は、より適切な単語表現のための単語埋め込みを生成する浅い XNUMX 層のニューラル ネットワーク モデルです。
  • Word2vec は単語をベクトル空間表現で表します。 単語はベクトル形式で表現され、同じ意味の単語は一緒に表示され、異なる単語は遠くに配置されるように配置されます。
  • Word2vecアルゴリズムは、連続バッグオブワード(CBOW)とスキップグラムの2つのアーキテクチャを使用します。
  • CBOW はスキップ グラムよりも数倍高速で、頻繁に使用される単語に対してより良い周波数を提供します。一方、スキップ グラムは少量のトレーニング データを必要とし、まれな単語やフレーズも表現します。
  • NLTK と Word2vec を組み合わせて使用​​すると、強力なアプリケーションを作成できます
  • ニューロンの活性化関数は、一連の入力が与えられた場合のそのニューロンの出力を定義します。 Word2vecで。 Softmax Layer (正規化指数関数) は、各ノードをアクティブ化または起動する出力層関数です。 Word2vec ではネガティブ サンプリングも利用できます
  • Gensim は Python で実装されたトピック モデリング ツールキットです。