1. 程式人生 > >極簡使用︱Gemsim-FastText 詞向量訓練與使用

極簡使用︱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 (Default cbow)
    • 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 (Default ns)
    • 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)
  • 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.

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