How to train word2vec model using gensim library
What is word embedding?
Word embedding is the process of understanding text by machine learning algorithms, also we say word embedding is a learned representation for text where it capture word of context in a document, semantic and syntactic similarity as well as relation between other words in corpus.
このアプローチは、機械学習や深層学習アルゴリズムを使用して自然言語処理の問題を解決するための鍵を握っています。 基本的に、単語埋め込みは、単語のベクトル表現である。 単語の距離や位置を計算することによって、それは意味の単語、文、段落やドキュメントを表しています
単語の埋め込みの技術は、現在までにいくつか紹介されています。 一般的に、我々は、単語の埋込みの2つのタイプがあると言う –
- Static Word Embedding
- Contextual Word Embedding
1.The 技術があります。 静的な単語の埋め込み。 Skip-GramやContinuous Bag-of-Wordsのような従来の手法は、単語を密なベクトルに変換するルックアップテーブルを学習することで静的埋め込みを行う。 静的埋め込みは、語彙的意味論タスクを解決するために直接有用である
問題:多義語のあいまいさを解決することはできません。 単語は2つの異なる文の複数の意味を表すときのように、その後スキップ-グラムまたはBOWメソッドはfailed.
2を取得します。 コンテキストワードの埋め込み。 文脈依存の単語埋め込み:文脈依存の単語埋め込みは、多義性と単語の文脈依存の問題に対処するために、異なる文脈で単語の意味論を捕捉することを目的としています。 LSTM、双方向LSTMなどのモデルは、単語のベクトル形式を取得するのに役立つ。 Word2Vecは、このような静的な単語の埋め込みを構築する方法である。 これは、Skip GramとCommon Bag of Words (CBOW)の2つの手法とニューラルネットワークの助けを借りて達成されている。
なぜそれが必要なのか?
例えば、次のような文があるとします。「I love coding in Jupyter.」と「I enjoy coding in Pycharm」です。 もし網羅的な語彙(Vと呼ぶことにします)を作ると、V = {I, love, enjoy, coding, in, Jupyter, Pycharm}のようになります。 もし、1つのホットエンコーディングで行くとしたら。 5077>
私たちの動機は、似たような文脈の単語が非常に近い空間位置にあるようにすることです。 数学的には、余弦距離は、2つの単語がどれだけ近いかを識別します。 最も近い単語のコサイン距離またはエンジェルのコサインは 0 に近く、最も遠い単語は 1 に近くなります。
Word2Vecのモデルは、以下の2つのアルゴリズムで動作します。 この方法は、各単語の文脈を入力とし、その文脈に対応する単語を予測しようとするものである。 予測する過程で、対象となる単語のベクトル表現を学習する。 5077>
アーキテクチャをもう少し詳しく見てみよう:
Skip-Gram model: Word2Vecのもう一つのアルゴリズム。 CBOWモデルのちょうど反対である。 5077>
Gensimによる単語埋め込みの実装 Word2Vecモデル:
ここではGensimによるWord2Vecモデル学習方法をステップバイステップで説明します。 データセットは、Kaggleプラットフォームから収集しました。 このデータセットはMyers-Briggs Type Indicatorの公開データから収集したものです。 typeとpostの2つのカラムから構成されています。 「typeは16種類の性格を定義し、postはその16種類の性格から個人を特定するコメントを定義しています。 データの読み込みと説明
# データセットの読み込み
data_df = pd.read_csv(“data/mbti_1.csv”)
data_df.head()
2. データクリーニングと前処理
データをロードした後、データにNAの値が含まれているかどうかを調べる必要があります、もしデータセット内にNAの値があればそれを削除します
# Removing na values from dataframe
def data_na_value_cleaning(data):
print(“\nBefore cleaning, Data Shape : “, data.Data.shape)
print(“\nBefore removing Null values: – – – – – -“)
print(data.isna().sum())
data.dropna(inplace=True)
data.reset_index(inplace=True,drop=True)
print(“After removing Null values: – – – – – – -“)
print(data.isnBefore removed NULL values: – – – – – – -))
print(data.isna().sum())
print(“\nAfter cleaning, Data Shape : “, data.shape)
return data
NA値がないデータなので、このように表示されました。 したがって、行は削除されていません。
# 重複値の削除
def duplicate_content_removal(data, col, ini_row):
print(“\nBefore removing duplicates, number of data was : “, ini_row)
duplicate_count = data.Duplicate_content_removal(data.duplicated().sum()
print(“\nNumber of Duplicates: “, duplicate_count)description_data = data.Duplicate_data = data.drop_duplicates()
cleaned_row = len(description_data)
if (ini_row – cleaned_row) > 0:
print(“\nTotal data reduction : “, (ini_row – cleaned_row))
print(“\nAfter removing duplicates, number of data is :”, cleaned_row)
else:
print(“\nDataset doesn’t content any duplicate data.”>重複データはありません。”)
return list(description_data)posts = duplicate_content_removal(data_df, ‘posts’, data_df.shape)
クリーニングプロセスの一部としてリンクや句読点も削除することにしました。 また、より良い学習のために、我々は数字や英数字ではない単語を考慮します。
def remove_link_punc(string):
# removing links
temp_string = re.sub(‘http?://(?:|||(??)):%))+’, ‘ ‘, string)# 英字のa-z以外を全て削除
regex = re.compile(”)
temp_string = regex.sub(‘ ‘, temp_string)# 余計なスペース削除
clean_string = re.sub(‘ +’, ‘ ‘, temp_string).lower()return clean_string
次のメソッド data_cleaning
def data_cleaning(content):
sentences =
for idx in tqdm(range(len(content))):
if content !=””:
# Sentence tokenize using NLTK library
for each_sent in sent_tokenize(str(content)):
if each_sent != “”:
temp_sent =
# リンクと句読点の除去
each_sent = remove_link_punc(each_sent.lower())#ストップワードの除去とレムマットの適用
for each_word in each_sent.LEFT_PROFILE(string):
for each_word in each_sent.split():
if each_word not in stop_words and len(each_word)>= 3:
temp_sent.append(lemmatizer.lemmatize(each_word))# only taking word list length is greater than equals to 5
if len(temp_sent) >= 5:
sentences.Add(each_words) return sentences
sent_corpus = data_cleaning(posts)
# Sentence words stats
len_count =
for l in sent_corpus:
len_count.append(len(l))print(“total number of Sentences : “, len(len_count))
word_sent_df = pd.DataFrame(sorted(Counter(len_count).items()), columns=)
word_sent_df.head(10)
クリーニングとデータの前処理をした後のデータは、リントの中の各単語のように見えます。 各リストは文章を表現している。 Genism word2vecは学習用に「リストのリスト」形式を要求しており、各文書はリストに含まれ、各リストはその文書のトークンのリストを含んでいる。
3. モデルの学習
では、Gensimライブラリを使って独自データセットでWord2VECモデルを学習することにします。
model = Word2Vec(sentences=sent_corpus, size=200, window=4, min_count=1, workers=4)
sentences : sent_corpusというデータセットを渡す
size : 各単語の生成ベクトル次元、デフォルトは100である。
window : 文中の単語と予測される単語の最大距離、デフォルトは5
min_count : Min_count以下の頻度の単語は無視する、デフォルトは5。 コーパスの単語を全て追加したいので1
workers : モデルの学習に使用するスレッドの数を指定する。 デフォルトは3
sg : 学習アルゴリズムの選択に使用する。 1はskip-gram、0はCBOW。
4.Vector form word
モデルの学習が完了したら、次のステップに進みます。 各単語のベクトル化された形を取りに行くことができる。 ベクトル化には2つの方法がある。 5077>
# Kingという単語のベクトル型を取得する
model.wv.get_vector(‘king’)
Or
# 別の方法として word2vec
model.wv.word_vec(‘king’)
5 のベクトル化形式を取得する。 2つの単語の類似度と距離
2つの単語のリストが用意されています。
# List of word similarity
model.wv.n_similarity(,)
ここで、二つの単語の距離がどのくらいかを調べてみる。distance(‘king’,’queen’)
もし我々が類似したものを得たいなら、以下のコードを使うことができます。wv.similar_by_word(‘king’)
6. word2Vecを使った他の手法
# wordの一覧から奇数個
model.wv.Similar’を使う。doesnt_match()
これでリストに存在する奇数の単語を見つけることができる。
# word pairs evaluation
model.wv.evaluate_word_pairs(‘data/SimLex-999/SimLex-999_2.XXX’)
Model.wv.txt’,)
これで単語ペアの評価
#単語一覧から単語の類推
model.wv.evaluate_word_analogies(‘data/questions-words.Txt’,)
#単語の類推
model.wv.analogies(‘questions-words.txt’)
これは単語の類推に便利です
7. 学習済みモデルのロード
もし、学習済みモデルを使用したい場合は、下記のコードで実現可能です。
# Loading google pre-train model
from gensim import models
models.KeyedVectors.load_word2vec_format(‘data/GoogleNews-vectors-negative300.bin’, binary=True)
ここでGoogle pre-trained modelをロードしようとしました。 リンク先からダウンロードできます。 5077>
実装の詳細については、githubにある私のコードを見てください。 質問には喜んでお答えします。
Leave a Reply