【问题标题】:Word2Vec Vocab SimilaritiesWord2Vec 词汇相似之处
【发布时间】:2020-03-22 13:56:52
【问题描述】:

我对大约 750k 个单词的文本运行了 word2vec 算法(在删除一些停用词之前)。使用我的模型,我开始查看与我选择的特定单词最相似的单词,并且相似度分数(对于 model.wv.most_similar 方法)都非常接近 1。第十个最接近的分数仍然像 0.998,所以我觉得我在单词的相似性之间没有任何显着差异,这会导致无意义的相似词。

我的模型构造函数是

model = Word2Vec(all_words, size=75, min_count=30, window=10, sg=1)

我认为问题可能在于我如何构建文本以运行神经网络。我像这样存储所有单词:

all_sentences = nltk.sent_tokenize(v)
all_words = [nltk.word_tokenize(sent) for sent in all_sentences]
all_words = [[word for word in all_words[0] if word not in nltk.stopwords('English')]]

...其中 v 是对 txt 文件调用 read() 的结果。

【问题讨论】:

    标签: python machine-learning neural-network nlp word2vec


    【解决方案1】:

    根据我的知识,我建议如下:

    • 使用sg=0 使用连续词袋模型代替skip-gram 模型。 CBOW 更适合较小的数据集。 skip-gram 模型在官方paper 中训练了超过 10 亿个单词。
    • 使用min_count=5,这是他们在论文中使用的那个,他们有 10 亿。我认为 30 对您的数据来说太多了。
    • 不要删除停用词,因为它会改变移动窗口中的相邻词。
    • 例如使用更多迭代,例如iter=10
    • 使用gensim.utils.simple_preprocess 而不是word_tokenize,因为标点符号在这种情况下没有帮助。
    • 另外,我建议您将数据集拆分为段落而不是句子,但我不知道这是否适用于您的数据集

    当执行这些步骤时,您的代码应该是:

    >>> from gensim.utils import simple_preprocess
    
    >>> all_sentences = nltk.sent_tokenize(v)
    >>> all_words = [simple_preprocess(sent) for sent in all_sentences]
    >>> # define the model
    >>> model = Word2Vec(all_words, size=75, min_count=5, window=10, sg=0, iter=10)
    

    【讨论】:

      【解决方案2】:

      在将其传递给Word2Vec 之前,您是否查看过all_words,以确保它包含您期望的语料库的大小和种类? (最后一个停用词剥离步骤看起来只对第一句起作用,all_words[0]。)

      此外,您是否启用了INFO 级别的日志记录,并观察了模型最终词汇量和训练进度指标的输出,以检查这些值是否符合预期?

      请注意,移除停用词对于 word2vec 训练并不是绝对必要的。它们的存在并没有造成太大的伤害,并且由sample 参数控制的默认常用词下采样已经可以经常忽略非常常用的词,例如停用词。

      (另外,min_count=30 对于小型语料库是相当激进的。)

      【讨论】:

        猜你喜欢
        • 2019-07-02
        • 2023-03-24
        • 2022-06-24
        • 2019-07-07
        • 2023-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-07
        相关资源
        最近更新 更多