極簡使用︱Gemsim-FastText 詞向量訓練與使用
glove/word2vec/fasttext目前詞向量比較通用的三種方式,之前三款詞向量的原始訓練過程還是挺繁瑣的,這邊筆者列舉一下再自己使用過程中快速訓練的方式。
其中,word2vec可見:python︱gensim訓練word2vec及相關函式與功能理解
glove可見:極簡使用︱Glove-python詞向量訓練與使用
因為是在gensim之中的,需要安裝fasttext,可見:
https://github.com/facebookresearch/fastText/tree/master/python
$ git clone https://github.com/facebookresearch/fastText.git $ cd fastText $ pip install .
文章目錄
2 、fasttext訓練
2.1 訓練主函式
from gensim.models import FastText sentences = [["你", "是", "誰"], ["我", "是", "中國人"]] model = FastText(sentences, size=4, window=3, min_count=1, iter=10,min_n = 3 , max_n = 6,word_ngrams = 0) model['你'] # 詞向量獲得的方式 model.wv['你'] # 詞向量獲得的方式
其中FastText主函式為:
class gensim.models.fasttext.FastText(sentences=None, corpus_file=None, sg=0, hs=0, size=100, alpha=0.025, window=5, min_count=5, max_vocab_size=None, word_ngrams=1, sample=0.001, seed=1, workers=3, min_alpha=0.0001, negative=5, ns_exponent=0.75, cbow_mean=1, hashfxn=<built-in function hash>, iter=5, null_word=0, min_n=3, max_n=6, sorted_vocab=1, bucket=2000000, trim_rule=None, batch_words=10000, callbacks=())
幾個引數的含義為:
-
常規引數:
- model: Training architecture. Allowed values:
cbow
,skipgram
(Defaultcbow
) - size: Size of embeddings to be learnt (Default 100)
- alpha: Initial learning rate (Default 0.025)
- window: Context window size (Default 5)
- min_count: Ignore words with number of occurrences below this (Default 5)
- loss: Training objective. Allowed values:
ns
,hs
,softmax
(Defaultns
) - sample: Threshold for downsampling higher-frequency words (Default 0.001)
- negative: Number of negative words to sample, for
ns
(Default 5) - iter: Number of epochs (Default 5)
- sorted_vocab: Sort vocab by descending frequency (Default 1)
- threads: Number of threads to use (Default 12)
- model: Training architecture. Allowed values:
-
fasttext附加引數
- min_n: min length of char ngrams (Default 3)
- max_n: max length of char ngrams (Default 6)
- bucket: number of buckets used for hashing ngrams (Default 2000000)
-
額外引數:
- word_ngrams ({1,0}, optional)
- If 1, uses enriches word vectors with subword(n-grams) information. If 0, this is equivalent to Word2Vec.
- word_ngrams ({1,0}, optional)
2.2 模型的儲存與載入
# 模型儲存與載入
model.save(fname)
model = FastText.load(fname)
2.3 線上更新語料庫
# 線上更新訓練 fasttext
from gensim.models import FastText
sentences_1 = [["cat", "say", "meow"], ["dog", "say", "woof"]]
sentences_2 = [["dude", "say", "wazzup!"]]
model = FastText(min_count=1)
model.build_vocab(sentences_1)
model.train(sentences_1, total_examples=model.corpus_count, epochs=model.iter)
model.build_vocab(sentences_2, update=True)
model.train(sentences_2, total_examples=model.corpus_count, epochs=model.iter)
通過build_vocab
來實現
2.4 c++ 版本的fasttext訓練
# 使用c++ 版本的fasttext
from gensim.models.wrappers.fasttext import FastText as FT_wrapper
# Set FastText home to the path to the FastText executable
ft_home = '/home/chinmaya/GSOC/Gensim/fastText/fasttext'
# train the model
model_wrapper = FT_wrapper.train(ft_home, lee_train_file)
print(model_wrapper)
3 fasttext使用
3.1 獲得詞向量
model['你'] # 詞向量獲得的方式
model.wv['你'] # 詞向量獲得的方式
兩種方式獲得詞向量
3.2 詞向量詞典
existent_word = '你'
existent_word in model.wv.vocab
>>> True
3.3 與word2vec 相同的求相似性
其中包括:
model.wv.most_similar(positive=['你', '是'], negative=['中國人'])
model.wv.most_similar_cosmul(positive=['你', '是'], negative=['中國人'])
類比關係,其中most_similar_cosmul使用乘法組合來查詢最接近的詞(參考url)
model.wv.doesnt_match("你 真的 是".split()) # 找到不匹配的
找出不適合的詞
model.wv.similarity('你', '是') # 求相似
model.n_similarity(['cat', 'say'], ['dog', 'say']) # 多個詞條求相似
similarity
求兩個詞之間的相似性;n_similarity
為求多個詞之間的相似性
# !pip3 install pyemd
model.wmdistance(['cat', 'say'], ['dog', 'say']) # 求詞條之間的WMD距離
依據詞向量求詞條之間的WMD距離
4 fasttext 與 word2vec的對比
在案例:Comparison of FastText and Word2Vec之中有官方給出的對比gensim之中,fasttext與word2vec的效能、語義關係比對。
參考博文:https://rare-technologies.com/fasttext-and-gensim-word-embeddings/
得出的結論:
- 具有n-gram的FastText模型在語法任務上的表現明顯更好,因為句法問題與單詞的形態有關;
- Gensim word2vec和沒有n-gram的fastText模型在語義任務上的效果稍好一些,可能是因為語義問題中的單詞是獨立的單詞而且與它們的char-gram無關;
- 一般來說,隨著語料庫大小的增加,模型的效能似乎越來越接近。但是,這可能是由於模型的維度大小保持恆定在100,而大型語料庫較大維度的模型大小可能會導致更高的效能提升。
- 隨著語料庫大小的增加,所有模型的語義準確性顯著增加。
- 然而,由於n-gram FastText模型的語料庫大小的增加,句法準確度的提高較低(相對和絕對術語)。這可能表明,在較大的語料庫大小的情況下,通過合併形態學資訊獲得的優勢可能不那麼顯著(原始論文中使用的語料庫似乎也表明了這一點)
- 最原始的fastText 由c++寫的,而gensim是由py寫的,執行效能還是c++要快一些
參考資源
1、facebookresearch/fastText
2、案例:Using FastText via Gensim
3、案例:Comparison of FastText and Word2Vec
4、官方教程:models.fasttext – FastText model
5、FastText and Gensim word embeddings