wordsim.py 3.8 KB

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