【问题标题】:Finding most similar sentence match寻找最相似的句子匹配
【发布时间】:2018-06-20 15:28:51
【问题描述】:

我有一个包含单词和短语混合的大型数据集,例如:

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 的每个单独的向量化项目值的余弦相似度。

问题是,这只有在 input 包含数据集中的确切单词时才真正有效 - 例如,在 input = "trai" 的情况下,它的余弦值为 0 ,而我试图让它映射到数据集中的值"train"

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

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

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

【问题讨论】:

  • 您可能需要考虑词对之间的 Levenshtein 距离,因为即使输入拼写错误,您似乎也希望能够预测匹配项
  • 类似地,使用 nltk 包应该可以让您找到词干(例如,break、break、break 都可以映射到单个词干)。
  • @Aalok 我已经尝试了 Levenshtein 距离,我应该提到它,但它似乎不是一个有效的选项,因为在某些情况下 dataset 可能包含更长的句子,例如 @ 987654333@,而input 可能只是一个单词,例如red,鉴于Levenshtein 距离的性质,它们不太可能被准确映射(尤其是因为它是一个如此庞大的数据集)。

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


【解决方案1】:

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

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

另一种可能性是特征生成,即使用附加字符串增强数据集中的项目。这些可以是 n-gram、词干或任何适合您需要的内容。例如,您可以(自动)将red-car 扩展为

red-car red car

【讨论】:

  • 1.我确实简单地测试了 Levenshtein 距离,但我对如何准确映射感到有点困惑,因为假设你有一个只有三个项目 dataset = ['fly', 'red car', 'train']input = 'car' 的数据集,我希望它映射到 @987654325 @ 因为这是最相似的,但它会映射到 fly,因为这只需要三个更改。 2. N-gram 相似度我还没看,现在就来看看。 3. 不幸的是,编辑数据集不是一种选择。
  • 对于特征生成,您不需要编辑数据集。您加载数据集,然后使用代码(例如通过添加词干)(自动)对其进行扩充。然后,您可以使用增强数据集作为学习算法的输入。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    相关资源
    最近更新 更多