ラベル word2vec の投稿を表示しています。 すべての投稿を表示
ラベル word2vec の投稿を表示しています。 すべての投稿を表示

2020年11月20日金曜日

for loopを使ったt-sne次元圧縮

MODEL100, MODEL200, MODEL300を読み込んで、次元圧縮を行い、FIGURE100.jpg, FIGURE200jpg, FIGURE300.jpgを保存する。

#ライブラリの読み込み
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
from gensim.models import word2vec

#for loopの設定
data = ['100', '200', '300']

for item in data:

#モデルの読み出し(以下はfor loopの中なのでインデントが必要。{}の中にloopの中身が入る。)
    model = word2vec.Word2Vec.load('MODEL{}.model'.format(item))

#x軸の決定
    X = model[model.wv.vocab]

#次元圧縮(次元数2、perplexity:次元圧縮の重要なパラメータ)
    tsne = TSNE(n_components=2, perplexity=30)


#次元圧縮後のx軸の決定
    X_tsne = tsne.fit_transform(X[:1000,:])

#保存先の図の準備(図を作る前に保存先の図を作っておく。)
    fig = plt.figure()

#図の作成(plt.scatterで書式を指定し、plt.show()で表示させる)
    plt.scatter(X_tsne[:, 0], X_tsne[:, 1])
    plt.show()

#図の保存。{}のところに上記と同じitemが入る
    fig.savefig("FIGURE{}.jpg".format(item))


2020年11月16日月曜日

vocab, index2word, syn0について

 word2vecでよく出てくるvocab, index2word, syn0について

 

vocab

辞書になっていて、keyは「単語」、valueは「gensim.models.keyedvectors.Vocab」になっている。

vocab = model.wv.vocab

 

 

index2word

形式はリスト。要素は「単語」が入っている。

index2word = model.wv.index2word

 

 

syn0

全ての単語ベクトルを返す

word_vectors = model.wv.syn0

 

参考リンク

gensimのWord2Vecを使ってみる。 

 

 

 

 

word2vecから語彙をファイルに保存する。

 語彙の保存(例:最初から1000番目まで)

#ライブラリの読み込み
from gensim.models import word2vec

#計算モデル(MODEL.model)の読み込み
model = word2vec.Word2Vec.load("MODEL.model")

#vocabの定義
vocab = model.wv.index2word

#ファイル(OUTPUT.txt)に書き込む
with open('OUTPUT.txt', 'w') as f:
    print(vocab[0:1000], file = f)

 

類似度ベクトルやベクトル間の距離の計算

#ライブラリの読み込み
from gensim.models import Word2Vec

# 計算済モデル(MODEL.model)の読み込み
model = Word2Vec.load("plant_sen100.model")

#ベクトルそのものと次元数を表示する#

#特定のベクトル(KEYWORD_A)定義
vector = model.wv["KEYWORD_A"]
 

#ベクトルを表示する
print(vector)

#ベクトルの次元数を表示する
print(vector.shape)

#単語ベクトル間の距離を計算する#

#全体ベクトルを定義する
vectors=model.wv

#ベクトル(KEYWORD_A,KEYWORD_B)間の距離の定義
distance = vectors.distance("KEYWORD_A", "KEYWORD_B")

#距離を小数点以下4桁まで表示する
print(f"{distance:.4f}")

#2つの単語の類似度(similarity)を計算する#
#similarityの定義
similarity = vectors.similarity("KEYWORD_A", "KEYWORD_B")

#類似度を小数点以下4桁まで表示する
print(f"{similarity:.4f}")

 

 

tips:wvはword vectorの略


gensim word2vecで複数のモデルファイルが作成される。

 今までより、次元数を増やしてgensim word2vecを計算していたところ、計算モデルが複数のファイルに出力されるようになった。(計算モデルはMODEL.modelと指定)

・MODEL.model

・ MODEL.model.trainables.syn1neg.npy

・MODEL.model.wv.vectors.npy

 

MODEL.modelのファイルサイズは、それまでの計算ファイルと比較しても小さいが、これら3つのファイルを同じフォルダにおいておけば、wordvectorの計算は今まで同様にできている。調べたところ、次元数を増やしたりして、データ数を増えると、自動的にファイルを分割するようだ。 


参考リンク

gensim word2vecで複数のモデルファイルが作成されるのはなぜですか?

creating word2vec model syn1neg.npy extension 


Pythonによるword2vec計算モデルを対象としたt-sneとpcaのコードの比較

word2vecで計算済みのモデル(MODEL.model)を呼び出して、t-sneとpcaで次元圧縮を行い、2次元に図示する。

ポイント:

t-sneはsklearn.manifordで呼び出し、pcaはsklearn.decompositionで呼び出す。

 

【t-sneのコード】

from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
from gensim.models import word2vec

#モデルの読み出し
model = word2vec.Word2Vec.load('MODEL.model')

#x軸の決定
X = model[model.wv.vocab]

#次元圧縮の定義
tsne = TSNE(n_components=2)

#次元圧縮後のx軸の決定
X_tsne = tsne.fit_transform(X[:1000,:])

#図の作成
plt.scatter(X_tsne[:, 0], X_tsne[:, 1])
plt.show() 


 



【pcaのコード】

#ライブラリの読み込み
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
from gensim.models import word2vec

#モデルの読み出し
model = word2vec.Word2Vec.load('MODEL.model')

#x軸の決定
X = model[model.wv.vocab]

#2次元圧縮の定義
pca = PCA(n_components=2)


#次元圧縮後のx軸の決定
X_PCA = pca.fit_transform(X[:1000,:])


#図の作成
plt.scatter(X_PCA[:, 0], X_PCA[:, 1])
plt.show() 

参考リンク

sklearn.manifold.TSNE

sklearn.decomposition.PCA 

 



 

2020年11月15日日曜日

word2vecでの色々な結果の表示方法

#ライブラリの読み込み
from gensim.models import Word2Vec

# モデルの読み込み
model = Word2Vec.load("MODEL.model")

#modelベクトルの行列要素を表示(語彙と次元数)
print(model.wv.vectors.shape)

#model.wv.vectorsのうち、1つ目のベクトルを表示
print(model.wv.vectors[0])

#辞書に登録された語彙の数を示す
print(len(model.wv.index2word))

#辞書に登録された語彙を全て示す
print(model.wv.index2word)

#辞書に登録された語彙(1番目から10番目)を示す
print(model.wv.index2word[0:10])
 
参考リンク:Word2Vecの学習済みmodelを扱う備忘録

2020年11月12日木曜日

word2vecの計算オプションについて

 【コード】

 #ライブラリの読み込み
from gensim.models import word2vec
import logging

#計算中のログを出力する
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

#文章ファイルの読み込み
files = word2vec.LineSentence('DATA.txt')

#モデルの作成=word2vecの計算
model = word2vec.Word2Vec(files, sg=1, size=100, min_count=2, window=5, sample=1e-3)

#モデルの保存
model.save("MODEL.model")


【word2vec.pyで見たWord2vecの計算オプション】

__init__(self, sentences=None, corpus_file=None, size=100, alpha=0.025, window=5, min_count=5,
                 max_vocab_size=None, sample=1e-3, seed=1, workers=3, min_alpha=0.0001,
                 sg=0, hs=0, negative=5, ns_exponent=0.75, cbow_mean=1, hashfxn=hash, iter=5, null_word=0,
                 trim_rule=None, sorted_vocab=1, batch_words=MAX_WORDS_IN_BATCH, compute_loss=False, callbacks=(),
                 max_final_vocab=None):


【オプションの説明】
sentences=None:
corpus_file=None:
size=100:基底とする単語ベクトルの数。これだと1つの単語を100次元のベクトルで表現する。
alpha=0.025:学習係数。
window=5:参照にする前後それぞれの単語数
min_count=5:登場回数がこの回数未満の単語を切り捨てる
max_vocab_size=None,
sample=1e-3,
seed=1,
workers=3: 並列計算を行う数
min_alpha=0.0001,
sg=0:計算に使用するモデル。 cbowの時は0、skip-gramであれば1
hs=0: 階層化ソフトマックス(頻度の低い単語に対して優れている。)を使うときは1
negative=5:ネガティブサンプリングに用いる単語数(ネガティブサンプリングを使うときはhs=0にしておくこと。)
ns_exponent=0.75,
cbow_mean=1,
hashfxn=hash,
iter=5:反復回数。ニューラルネットワークにおけるepochと同じ。
null_word=0,
trim_rule=None,
sorted_vocab=1:1の時は語彙を出現頻度でソートする。
batch_words=MAX_WORDS_IN_BATCH,
compute_loss=False,
callbacks=(),
max_final_vocab=None

参考リンク

gemsimのword2vecのためのオプション一覧

word2vec のオプション一覧 

alphaとmin_alphaのdoc2vecのデフォルト値

頻度の低い単語に対しては階層的なソフトマックスが優れているのに対し、頻度の高い単語に対してはネガティブサンプリングが優れているのはなぜですか? 

Negative Sampling(1/4)発明の概要

 図解Word2vec


2020年11月11日水曜日

t-sneの例

 参考リンクに載っていたt-sneのコードを使って実際に動かしてみた。

 

#ライブラリの読み込み
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
from gensim.models import word2vec

#モデルの読み出し
model = word2vec.Word2Vec.load('MODEL.model')

#x軸の決定
X = model[model.wv.vocab]

#次元圧縮の定義
tsne = TSNE(n_components=2)

#次元圧縮後のx軸の決定
X_tsne = tsne.fit_transform(X[:1000,:])

#図の作成
plt.scatter(X_tsne[:, 0], X_tsne[:, 1])
plt.show() 


参考リンク

word2vec:類似ベクトルの計算

類似ベクトルを表示する。

パターン1:計算モデルをロードし、キーワードを予め与える。
from gensim.models import word2vec

model = word2vec.Word2Vec.load('MODEL.model')
results = model.wv.most_similar(positive=['KEYWORD'], topn=10)
for result in results:
    print(result)


・topn=10はデフォルトなので、省略可能。(20個表示したければtopn=20と書く)

・wv.most_similarを使っている。 



パターン2: modelとキーワードは引数として与える。

from gensim.models import word2vec
import sys

model   = word2vec.Word2Vec.load(sys.argv[1])
results = model.most_similar(positive=sys.argv[2], topn=10)

for result in results:
    print(result[0], '\t', result[1])


・most_similarはmv.most_similarを使うように警告がでている。



word2vecの計算モデルの読み込み

word2vecの計算モデルの読み込み

 

from gensim.models import word2vec
from pprint import pprint

model = word2vec.Word2Vec.load('Keisan.model')
pprint(model.wv['keyword'])

word2vecの計算方法について

簡単なword2vecの計算方法

from gensim.models import word2vec

files = word2vec.LineSentence('data.txt')

model = word2vec.Word2Vec(files, size=200, min_count=10, window=10, sample=1e-3)
model.save("out.model")


注釈
データを読み込むときはword2vec.LineSentence、または
word2vec.Text8Corpusを使っているケースが多いが、とりあえず、LineSentenceを使っておけばよい。

Text8Corpusを使うのは以下の時。


    テキストと画像キャプションは保持
    テーブルや外国語バージョンへのリンクを除去
    引用、脚注、マークアップを除去
    ハイパーテキストはアンカーテキストだけ保持。それ以外は除去
    数字はつづりを変換。たとえば、"20"は"two zero"に変換
    大文字を小文字に変換
    a-zの範囲に入らない文字はスペースに変換


参考リンク

日本語版text8コーパスを作って分散表現を学習する

gensimのword2vecのためのオプション一覧

2020年11月5日木曜日

word2vec (pythonライブラリ編)

 pythonのライブラリを使って、word2vecを行う方法。

pip3 install gensim

pip3 install word2vec

でインストールする。

・機械学習のためのスクリプト

from gensim.models import word2vec
import logging
import sys

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

sentences = word2vec.LineSentence(sys.argv[1])
model = word2vec.Word2Vec(sentences,
                          sg=1,
                          size=100,
                          min_count=1,
                          window=10,
                          hs=1,
                          negative=0)
model.save(sys.argv[2])

これをtrain.pyと名付けて実行する。 (実行できなければ、chmod 755 train.pyで実行許可を与える。)

python3 train.py TEXT.txt TEXT.model

(python3でtrain.pyを実行し、TEXT.txtを機械学習する。その後、TEXT.modelとしてアウトプットする。)

計算が終わったら、以下のスクリプト(similars.py)で類似の高い語を抜き出してみる。

from gensim.models import word2vec
import sys

model   = word2vec.Word2Vec.load(sys.argv[1])
results = model.most_similar(positive=sys.argv[2], topn=10)

for result in results:
    print(result[0], '\t', result[1])


使い方

python3 similars.py TEXT.model AAA

(AAAは調べたい単語)


参考リンク:Pythonで「老人と海」をword2vecする



 

 

 

 

2017年4月27日木曜日

word2vecのオプション

/usr/local/bin/word2vec -train jawiki_data.txt -output jawiki_data.bin -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -binary 1

-train:学習させるデータ。半角スペースで区切られた単語列。1行ごとに文脈ベクトルの処理対象となる。

-output:文脈ベクトルの出力先ファイル

-cbow:Bags of words Modelを使用するときには1と指定する。defaultは1となっており、Skip-gram modelを使用する時は0とする。

-size:文脈ベクトルの次元サイズ(defaultは100)

-window:文脈ベクトルを計算する際に、対象語から調べる前後の語の数。defaultは5となっている。大きな値を指定すると、より広範囲の語まで処理対象とする。

-negative:Negative Samplingで用いる例の数。defaultは5となっており、妥当な値の範囲は3から10となっている。0を指定するとNegative Samplingを行わない。

-hs:学習にHierarchical Softmaxを用いて計算させたい場合に1と指定する。defaultは0。

-sample:Hierarchical Softmaxの際に頻出語をカットするスレッシュホールドを指定する。defaultは1e-3となっており、妥当な値の範囲は0から1e-5となっている。

-binary:Binary形式で出力したい場合に1と指定する。defaultは0となっており、テキスト形式で出力される。

参考リンク:word2vecのオプション一覧

http://repository.seinan-gu.ac.jp/bitstream/handle/123456789/1302/co-n62v3_4-p263-284-yos.pdf?sequence=1

2017年4月24日月曜日

wikipediaをダウンロードしてword2vecを試すまでの手順

1.wikipediaのデータを取ってくる。
curl https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2 -o jawiki-latest-pages-articles.xml.bz2

2.テキストデータへの変換を行う。
git clone https://github.com/attardi/wikiextractor
python3 wikiextractor/WikiExtractor.py jawiki-latest-pages-articles.xml.bz2

3.ここまでやるとtextディレクトリが作成されているので、ここの情報を一つにまとめるために以下の処理を行う。
cat text/*/* > jawiki.txt

4.mecabのインストール


5.mecabで分かち書き(mecabエラー)

「mecab -Owakati jawiki.txt -o jawiki_data.txt」
としたところ、
「input-buffer overflow. The line is split. use -b #SIZE option.」
とエラーが出た。

そこで、バッファーを大きくして
「mecab -b 81920 -Owakati jawiki.txt > jawiki_data.txt」

6.word2vecで機械学習
/usr/local/bin/word2vec -train jawiki_data.txt -output jawiki_data.bin -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -binary 1

7.word2vecで計算
/usr/local/bin/word2vec-distance jawiki_data.bin

2017年3月8日水曜日

word2vecの動かし方

【mecabのインストールと分かち書き】
$ sudo apt-get install mecab libmecab-dev mecab-ipadic
$ sudo apt-get install mecab-ipadic-utf8
$ sudo apt-get install python-mecab

echo "$(<jawiki.txt)" | mecab -F"%f[6] " -U"%m " -E"\n" > jawiki_data.txt

【word2vecの動かし方】
./word2vec -train input-wakati.txt -output jawiki_data.bin -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -binary 1

その後、以下のコマンドで動いた
/usr/local/bin/word2vec-distance jawiki_data.model

【word2vecのコマンド】
word2phrase, word2vec, word2vec-compute-accuracy, word2vec-distance, word2-doc2vec, word2vec-word-analogy

2017年3月2日木曜日

word2vecのインストール

sudo apt install python3-pip
pip3 install numpy
pip3 install scipy

下の3つは単純にpip3ではインストールできない。
また、cythonが入っていないとword2vecはインストールできないみたい。

sudo -E pip3 install gensim
sudo -E pip3 install cython
sudo -E pip3 install word2vec