查找最相似的句子匹配

时间:2018-06-20 15:28:51

标签: python scikit-learn nlp cosine-similarity sentence-similarity

我有一个庞大的数据集,其中包含单词和短短语的组合,例如:

dataset = [
    "car",
    "red-car",
    "lorry",
    "broken lorry",
    "truck owner",
    "train",
    ...
]

我正在尝试找到一种方法来从短句中确定最相似的词,例如:

input = "I love my car that is red"   # should map to "red-car"
input = "I purchased a new lorry"     # should map to "lorry"
input = "I hate my redcar"            # should map to "red-car"
input = "I will use my truck"         # should map to "truck owner"
input = "Look at that yellow lorri"   # should map to "lorry"

我尝试了许多无济于事的方法,包括:

使用TfidfVectorizer对datasetinput进行向量化,然后针对input中每个单独的向量化项值计算向量化dataset值的余弦相似度。 / p>

问题是,仅当input包含数据集中的确切单词时,这才真正起作用-例如,在input = "trai"的情况下,它将具有一个余弦值0,而我正试图使其映射到数据集中的值"train"

最明显的解决方案是执行简单的拼写检查,但这可能不是一个有效的选择,因为即使在单词略有不同的情况下,我仍然希望选择最相似的结果,即:

input = "broke"    # should map to "broken lorry" given the above dataset

如果有人可以建议我尝试其他可能的方法,那将不胜感激。

2 个答案:

答案 0 :(得分:0)

正如@Aaalok在评论中建议的那样,一种想法是使用不同的距离/相似度函数。可能的候选人包括

  • Levenshtein距离(测量将一个字符串转换为另一个字符串的更改次数)
  • N元语法相似度(衡量两个字符串之间共享的n元语法的数量)

另一种可能性是功能生成,即使用其他字符串增强数据集中的项目。这些可以是n-gram,词干或任何适合您的需求。例如,您可以(自动)将red-car展开为

red-car red car

答案 1 :(得分:0)

段落向量或doc2vec应该可以解决您的问题。提供足够和适当的数据集。当然,您必须进行大量调整才能使结果正确。您可以尝试gensim / deeplearning4j。但是您可能必须使用其他方法来管理拼写错误。