1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- # 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"]))
- """
|