# coding=utf-8 import gzip from gensim.models import Word2Vec from gensim.test.utils import common_texts # sentences:我们要分析的语料 # size:詞向量的大小,默认值是100。 # window:考慮上下文各自的長度,默认值为 5。 # sg:即我们的word2vec两个模型的选择了。如果是0, 则是CBOW模型,是1则是Skip-Gram模型,默认是0即CBOW模型。 # hs:即我们的word2vec两个解法的选择了,如果是0, 则是Negative Sampling,是1的话并且负采样个数negative大于0, 则是Hierarchical Softmax。默认是0即Negative Sampling。 # negative:即使用Negative Sampling时负采样的个数,默认是5。推荐在[3,10]之间。这个参数在我们的算法原理篇中标记为neg。 # cbow_mean: 仅用于CBOW在做投影的时候,为0,则算法中的xw为上下文的词向量之和,为1则为上下文的词向量的平均值。在我们的原理篇中,是按照词向量的平均值来描述的。个人比较喜欢用平均值来表示xw,默认值也是1,不推荐修改默认值。 # min_count:單字至少出現的次數,workers:執行緒個數 # iter: 随机梯度下降法中迭代的最大次数,默认是5。对于大语料,可以增大这个值。 # alpha: 在随机梯度下降法中迭代的初始步长。算法原理篇中标记为η,默认是0.025。 # min_alpha: 由于算法支持在迭代的过程中逐渐减小步长,min_alpha给出了最小的迭代步长值。随机梯度下降中每轮的迭代步长可以由iter,alpha, min_alpha一起得出。这部分由于不是word2vec算法的核心内容,因此在原理篇我们没有提到。对于大语料,需要对alpha, min_alpha,iter一起调参,来选择合适的三个值。 model_simple = Word2Vec(sentences=common_texts, window=1, min_count=1, workers=4) # 傳回 有效的字數及總處理字數 print(model_simple.train([["hello", "world", "michael"]], total_examples=1, epochs=2)) sentences = [["cat", "say", "meow"], ["dog", "say", "woof"]] model_simple = Word2Vec(min_count=1) model_simple.build_vocab(sentences) # 建立生字表(vocabulary) print(model_simple.train(sentences, total_examples=model_simple.corpus_count , epochs=model_simple.epochs)) """ # 載入 OpinRank 語料庫:關於車輛與旅館的評論 data_file="../nlp-in-practice-master/word2vec/reviews_data.txt.gz" # 讀取 OpinRank 語料庫,並作前置處理 def read_input(input_file): with gzip.open (input_file, 'rb') as f: for i, line in enumerate (f): # 前置處理 yield gensim.utils.simple_preprocess(line) # 載入 OpinRank 語料庫,分詞 documents = list(read_input(data_file)) # print(documents) print(len(documents)) # Word2Vec 模型訓練,約10分鐘 model = Word2Vec(documents, vector_size=150, window=10, min_count=2, workers=10) print(model.train(documents, total_examples=len(documents), epochs=10)) # 測試『骯髒』相似詞 w1 = "dirty" print(model.wv.most_similar(positive=w1)) # positive:相似詞 # 測試『禮貌』相似詞 w1 = ["polite"] print(model.wv.most_similar(positive=w1, topn=6)) # topn:只列出前 n 名 # 測試『法國』相似詞 w1 = ["france"] print(model.wv.most_similar(positive=w1, topn=6)) # topn:只列出前 n 名 # 測試『床、床單、枕頭』相似詞及『長椅』相反詞 w1 = ["bed",'sheet','pillow'] w2 = ['couch'] print(model.wv.most_similar(positive=w1, negative=w2, topn=10)) # negative:相反詞 # 比較兩詞相似機率 print(model.wv.similarity(w1="dirty", w2="smelly")) print(model.wv.similarity(w1="dirty", w2="dirty")) print(model.wv.similarity(w1="dirty", w2="clean")) # 選出較不相似的字詞 print(model.wv.doesnt_match(["cat", "dog", "france"])) """