【问题标题】:Gensim's `model.wv.most_similar` returns phonologically similar wordsGensim 的 `model.wv.most_similar` 返回语音相似的词
【发布时间】:2020-08-17 13:25:35
【问题描述】:

gensim 的wv.most_similar 返回语音上接近的词(相似的声音),而不是语义上相似的词。这是正常的吗?为什么会发生这种情况?

这是most_similar 上的文档:https://radimrehurek.com/gensim/models/keyedvectors.html#gensim.models.keyedvectors.WordEmbeddingsKeyedVectors.most_similar

In [144]: len(vectors.vocab)
Out[144]: 32966

... 

In [140]: vectors.most_similar('fight')
Out[140]:
[('Night', 0.9940935373306274),
 ('knight', 0.9928507804870605),
 ('fright', 0.9925899505615234),
 ('light', 0.9919329285621643),
 ('bright', 0.9914385080337524),
 ('plight', 0.9912853240966797),
 ('Eight', 0.9912533760070801),
 ('sight', 0.9908033013343811),
 ('playwright', 0.9905624985694885),
 ('slight', 0.990411102771759)]

In [141]: vectors.most_similar('care')
Out[141]:
[('spare', 0.9710584878921509),
 ('scare', 0.9626247882843018),
 ('share', 0.9594929218292236),
 ('prepare', 0.9584596157073975),
 ('aware', 0.9551078081130981),
 ('negare', 0.9550014138221741),
 ('glassware', 0.9507938027381897),
 ('Welfare', 0.9489598274230957),
 ('warfare', 0.9487678408622742),
 ('square', 0.9473209381103516)]

训练数据包含学术论文,这是我的训练脚本:

from gensim.models.fasttext import FastText as FT_gensim
import gensim.models.keyedvectors as word2vec

dim_size = 300
epochs = 10
model = FT_gensim(size=dim_size, window=3, min_count=1)
model.build_vocab(sentences=corpus_reader, progress_per=1000)
model.train(sentences=corpus_reader, total_examples=total_examples, epochs=epochs)

# saving vectors to disk
path = "/home/ubuntu/volume/my_vectors.vectors"
model.wv.save_word2vec_format(path, binary=True)

# loading vectors 
vectors = word2vec.KeyedVectors.load_word2vec_format(path)

【问题讨论】:

    标签: python data-science gensim embedding word-embedding


    【解决方案1】:

    您已选择使用FastText 算法来训练您的向量。该算法专门利用子词片段(如'ight''are')有机会为不在训练集中的“词汇外”单词合成好的猜测向量,这可能是您所看到的结果的一个贡献者。

    但是,通常单词的独特含义占主导地位,这些子词的影响只对未知单词起作用。而且,在一组健康的词向量中,最相似的 any 词列表很少有如此多的0.99+ 相似性。

    所以,我怀疑您的训练数据中有一些奇怪或不足之处。

    它是什么类型的文本,它包含多少个示例用法的单词?

    在训练期间,INFO 级别的日志中显示的训练进度/速度方面是否存在任何令人费解的方面?

    (300 维也可能有点过多,词汇表只有 33K 唯一词;这是一个向量大小,在处理数十万到数百万个唯一词和大量训练数据时很常见。)

    【讨论】:

      【解决方案2】:

      这是对尺寸大小的一个很好的标注。减少该参数肯定会有所作为。

      1。使用更大的语料库(33k --> 275k 独特词汇)再现原始行为(其中 dim_size=300):

      注意:我还调整了一些其他参数,例如 min_countwindow 等)

      from gensim.models.fasttext import FastText as FT_gensim
      
      fmodel0 = FT_gensim(size=300, window=5, min_count=3, workers=10) # window is The maximum distance between the current and predicted word within a sentence.
      fmodel0.build_vocab(sentences=corpus)
      fmodel0.train(sentences=corpus, total_examples=fmodel0.corpus_count, epochs=5)
      
      fmodel0.wv.vocab['cancer'].count  # number of times the word occurred in the corpus
      fmodel0.wv.most_similar('cancer')
      fmodel0.wv.most_similar('care')
      fmodel0.wv.most_similar('fight')
      
      # -----------
      # cancer 
      [('breastcancer', 0.9182084798812866),
       ('noncancer', 0.9133851528167725),
       ('skincancer', 0.898530900478363),
       ('cancerous', 0.892244279384613),
       ('cancers', 0.8634265065193176),
       ('anticancer', 0.8527657985687256),
       ('Cancer', 0.8359113931655884),
       ('lancer', 0.8296531438827515),
       ('Anticancer', 0.826178252696991),
       ('precancerous', 0.8116365671157837)]
      
      # care
      [('_care', 0.9151567816734314),
       ('încălcare', 0.874087929725647),
       ('Nexcare', 0.8578598499298096),
       ('diacare', 0.8515325784683228),
       ('încercare', 0.8445525765419006),
       ('fiecare', 0.8335763812065125),
       ('Mulcare', 0.8296753168106079),
       ('Fiecare', 0.8292017579078674),
       ('homecare', 0.8251558542251587),
       ('carece', 0.8141698837280273)]
      
      # fight
      [('Ifight', 0.892048180103302),
       ('fistfight', 0.8553390502929688),
       ('dogfight', 0.8371964693069458),
       ('fighter', 0.8167843818664551),
       ('bullfight', 0.8025394678115845),
       ('gunfight', 0.7972971200942993),
       ('fights', 0.790093183517456),
       ('Gunfight', 0.7893823385238647),
       ('fighting', 0.775499701499939),
       ('Fistfight', 0.770946741104126)]
      

      2。将维度大小减小到 5:

      _fmodel = FT_gensim(size=5, window=5, min_count=3, workers=10)
      _fmodel.build_vocab(sentences=corpus)
      _fmodel.train(sentences=corpus, total_examples=_fmodel.corpus_count, epochs=5)  # workers is specified in the constructor
      
      
      _fmodel.wv.vocab['cancer'].count  # number of times the word occurred in the corpus
      _fmodel.wv.most_similar('cancer')
      _fmodel.wv.most_similar('care')
      _fmodel.wv.most_similar('fight')
      
      # cancer 
      [('nutrient', 0.999614417552948),
       ('reuptake', 0.9987781047821045),
       ('organ', 0.9987629652023315),
       ('tracheal', 0.9985960721969604),
       ('digestion', 0.9984923601150513),
       ('cortes', 0.9977986812591553),
       ('liposomes', 0.9977765679359436),
       ('adder', 0.997713565826416),
       ('adrenals', 0.9977011680603027),
       ('digestive', 0.9976763129234314)]
      
      # care
      [('lappropriate', 0.9990135431289673),
       ('coping', 0.9984776973724365),
       ('promovem', 0.9983049035072327),
       ('requièrent', 0.9982239603996277),
       ('diverso', 0.9977829456329346),
       ('feebleness', 0.9977156519889832),
       ('pathetical', 0.9975940585136414),
       ('procure', 0.997504472732544),
       ('delinking', 0.9973599910736084),
       ('entonces', 0.99733966588974)]
      
      # fight 
      [('decied', 0.9996457099914551),
       ('uprightly', 0.999250054359436),
       ('chillies', 0.9990670680999756),
       ('stuttered', 0.998710036277771),
       ('cries', 0.9985755681991577),
       ('famish', 0.998246431350708),
       ('immortalizes', 0.9981046915054321),
       ('misled', 0.9980905055999756),
       ('whore', 0.9980045557022095),
       ('chanted', 0.9978444576263428)]
      

      这不是很好,但它不再返回仅包含子词的词。

      3。并且为了更好的衡量标准,对 Word2Vec 进行基准测试:

      from gensim.models.word2vec import Word2Vec
      
      wmodel300 = Word2Vec(corpus, size=300, window=5, min_count=2, workers=10)
      wmodel300.total_train_time  # 187.1828162111342
      wmodel300.wv.most_similar('cancer')
      
      [('cancers', 0.6576876640319824),
       ('melanoma', 0.6564366817474365),
       ('malignancy', 0.6342018842697144),
       ('leukemia', 0.6293295621871948),
       ('disease', 0.6270142197608948),
       ('adenocarcinoma', 0.6181445121765137),
       ('Cancer', 0.6010828614234924),
       ('tumors', 0.5926551222801208),
       ('carcinoma', 0.5917977094650269),
       ('malignant', 0.5778893828392029)]
      

      ^ 更好地捕捉分布相似性 + 更真实的相似性度量。

      但是使用更小的 dim_size,结果会更差一些(相似度也不太现实,都在 0.99 左右):

      wmodel5 = Word2Vec(corpus, size=5, window=5, min_count=2, workers=10)
      wmodel5.total_train_time  # 151.4945764541626
      wmodel5.wv.most_similar('cancer')
      
      [('insulin', 0.9990534782409668),
       ('reaction', 0.9970406889915466),
       ('embryos', 0.9970351457595825),
       ('antibiotics', 0.9967449903488159),
       ('supplements', 0.9962579011917114),
       ('synthesize', 0.996055543422699),
       ('allergies', 0.9959680438041687),
       ('gadgets', 0.9957243204116821),
       ('mild', 0.9953152537345886),
       ('asthma', 0.994774580001831)]
      

      因此,增加维度大小似乎对 Word2Vec 有帮助,但对 fastText 没有帮助...

      我确信这种对比与 fastText 模型正在学习子词信息这一事实有关,并且以某种方式与参数交互以增加其值是有害的。但我不确定究竟如何……我试图将这一发现与直觉相协调,即增加向量的大小通常会有所帮助,因为更大的向量可以捕获更多信息。

      【讨论】:

      • 最好在我的回答中提供更多详细信息作为 cmets,或者对您的原始问题进行编辑。在这里,您将它们作为单独的“答案”提供。然而,最有趣的事情——我问的第一个问题——“它是什么类型的文本,它包含多少个示例用法的单词?” ——尚未澄清。另外:就像 300 维似乎过多一样,5 是非常小的——仅用于玩具大小的演示(无论如何,对于 word2vec 来说确实没有足够的数据)。为什么不尝试保留 gensim 默认值 (100)?
      • 另外,仅使用 ``epochs=5`(而不是原始报告中的 10)更有可能是弊大于利。
      【解决方案3】:

      我在 366k 字的语料库中遇到了同样的问题。我认为问题出在 min_n max_n 参数中。尝试使用

      word_ngrams = 0
      

      根据文档,它相当于 word2vec。或者尝试将 min_n 和 max_n 设置为更大的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-02
        • 2015-10-10
        • 2015-10-27
        • 2020-11-28
        • 2022-01-17
        • 2020-08-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多