代码之家  ›  专栏  ›  技术社区  ›  outlier

doc2vec不精确余弦相似性

  •  0
  • outlier  · 技术社区  · 6 年前

    我已经在400万条记录上训练了doc2vec模型。我想找到和我从数据中加入的新句子最相似的句子,但我得到的结果非常糟糕。

    数据示例:

    Xolo Era (Black, 8 GB)(1 GB RAM).
    Sugar C6 (White, 16 GB)(2 GB RAM).
    Celkon Star 4G+ (Black & Dark Blue, 4 GB)(512 MB RAM).
    Panasonic Eluga I2 (Metallic Grey, 16 GB)(2 GB RAM).
    Itel IT 5311(Champagne Gold).
    Itel A44 Pro (Champagne, 16 GB)(2 GB RAM).
    Nokia 2 (Pewter/ Black, 8 GB)(1 GB RAM).
    InFocus Snap 4 (Midnight Black, 64 GB)(4 GB RAM).
    Panasonic P91 (Black, 16 GB)(1 GB RAM).
    

    1) 停止删除单词。 2) 特殊字符和数值删除。 3) 将数据小写。

    我用于培训的代码:

    sentences=doc2vec.TaggedLineDocument('training_data.csv') # i have used TaggedLineDocument which can generate label or tags for my data
    
    max_epochs = 100
    vec_size = 100
    alpha = 0.025
    
    model = doc2vec.Doc2Vec(vector_size=vec_size,
                    alpha=alpha, 
                    min_alpha=0.00025,
                    dm =1,
                    min_count=1)
    model.build_vocab(sentences)
    model.train(sentences, epochs=100, total_examples=model.corpus_count)
    model.save('My_model.doc2vec')
    

    我对gensim和doc2vec是新手,所以我用了一个例子来训练我的模型,所以如果我使用了错误的参数,请纠正我。

    在测试侧

    model = gensim.models.doc2vec.Doc2Vec.load('My_model.doc2vec')
    test = 'nokia pewter black gb gb ram'.split()
    new_vector = model.infer_vector(test)
    similar = model.docvecs.most_similar([new_vector]) 
    print(similar) # It returns index of sentence and similarity score
    

    为了测试,我已经通过了训练数据中出现的相同句子,但是模型没有给出类似文档的相关文档,例如我得到了“ 用于micromax帆布汁的lootmela钢化玻璃防护罩 “作为一个最相似的句子 “诺基亚白蜡黑gb内存” 这句话的相似度为0.80。

    So my questions to you: 
    1) Do i need to reconsider parameters for model training?
    2) Training process is correct?
    3) How to build more accurate model for similarity?
    4) Apart from doc2vec what will be your suggestion for similarity (keeping in mind i have very large data so training and testing time should not be much longer)
    

    如果问题格式不好,请原谅。

    1 回复  |  直到 6 年前
        1
  •  11
  •   gojomo    6 年前

    Doc2Vec 将有一个较短的时间与较短的文本,它似乎你的文本可能只有5-10代币。

    Doc2Vec公司 / Word2Vec -like分析可以对这样的文本片段做任何有用的事情 不要 与自然口语/书面语具有相同种类的共现多样性将取决于数据的特性。我不确定它会不会,但它可能只有尝试/调整它才能说明问题。

    但是,你想要的结果应该是什么还不清楚。什么样的产品名称 应该 是最相似的吗?同一品牌?同样的颜色?(如果其中任何一个,您可以使用比 Doc2Vec公司 相同的规格,包括内存?(如果是这样的话,你就不想扔掉数字信息,而是应该将其规范化为单个符号,这些符号在逐字逐句的层次上都有意义 Doc2Vec公司 ,例如将“64 GB”转换为“64gb”,或将“2 GB RAM”转换为“2gbram”。)

    由于这不是常规的自然语言文本,您可能有一个非常小的受限词汇表—可能只有几千个标记,而不是普通语言中的几万到几十万个标记。而且,每一个代币可能只出现在少数几个例子中(单个生产商的产品线),绝对不会出现与类似竞争产品的密切相关的术语(因为产品名称 不要 这些因素也会对这种算法提出挑战,因为这种算法需要多种不同的重叠使用词,以及许多含义深浅的词,才能逐渐将向量推进有用的排列。一个小的词汇表可能需要使用一个更小的模型(更低的 vector_size

    很多 / 文字2vec

    你应该举例说明你的“培训”中的实际内容_数据.csv“文件,查看算法实际使用的是什么。请注意 TaggedLineDocument 不会正确处理真正的逗号分隔值文件-它只要求每行有一个文本,已经用空格分隔。(任何逗号都会留在原处,可能会附加到字段标记上。)

    降低 min_count to 1通常会使结果恶化,因为这种罕见的标记(只有1次或很少出现)不会得到好的向量,但是如果它们聚集在一起(在正常文本中有,但可能不在这里)可以作为训练噪声来降低其他向量。

    你不需要改变 min_alpha 应该 比第三项更相似。对于您尝试的每一个算法/参数,有多少个这样的对被正确地发现为“比第三个更相似”

    infer_vector() . 所以一定要使用这个版本,并测试提供更大版本的改进 epochs 价值观。

    总的来说,我建议:

    • 明确什么是一个好的相似性结果:举例说明最相似和最不相似的项目

    • 使用这些示例来创建模型质量的严格自动化评估

    • 以一种对领域敏感的方式进行预处理,保留有意义的区别;试着获取/创建文本,不要将品牌词孤立到隐藏潜在跨品牌关系的单个产品示例中

    • 不要改变默认值,除非你确定这有帮助

    • 在信息级别启用日志记录,这样您就可以看到算法的进度和有效词汇表之类的报告

    根据你真正的“相似性”目标是什么,你仍然可能得不到很好的结果产品名称不是同一种自然语言 效果最好。

    另一个需要考虑的基线是将每个产品名称视为一个“单词包”,这会产生一个单词(来自完整词汇表)的热门向量。这些热点向量的余弦相似性(可能有额外的加权)将是一个简单的衡量标准,至少可以捕捉到一些东西,比如把所有的“黑色”物品放得更近一些,或者所有“诺基亚”物品等等。