找到最相似的句子匹配

3

我有一个大型数据集,其中包含一些单词和短语,例如:

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对数据集和输入进行向量化,然后计算从数据集中每个向量化的项值到输入向量化值的余弦相似度。
问题在于,这种方法只有当输入中包含数据集中的确切单词时才有效。例如,如果输入为“trai”,则余弦值为0,而我想将其映射到数据集中的值“train”。
最明显的解决方法是执行简单的拼写检查,但这可能不是一个有效的选项,因为即使单词略有不同,我仍然想选择最相似的结果,例如:
input = "broke"    # should map to "broken lorry" given the above dataset

如果有人能提供其他我可以尝试的潜在方法,我将不胜感激。

你可能想考虑一下单词对之间的Levenshtein距离,因为似乎你希望能够在输入有拼写错误的情况下预测匹配。 - axolotl
类似的,使用nltk包应该可以让你找到词干(例如,broken、broke、break都可以映射到一个单一的词干)。 - Tom Dalton
@Aalok我已经尝试了Levenshtein距离,我应该提到,但是它似乎不是一个有效的选项,因为在某些情况下“数据集”可能包含更长的句子,例如“红色汽车”,而“输入”可能只是一个单词,比如“红色”,并且鉴于Levenshtein距离的本质,它们很难被精确地映射(特别是因为这是一个如此巨大的数据集)。 - user9966656
2个回答

0

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

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

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

red-car red car

  1. 我简单测试了Levenshtein距离,但我有点困惑它如何准确地映射,因为假设你有一个只有三个项目的数据集dataset = ['fly','red car','train']input ='car',我希望它映射到'red car',因为那是最相似的,但它会映射到fly,因为只需要三个更改。
  2. 我还没有看N-gram相似度,我现在会去看一下。
  3. 不幸的是,编辑数据集不是一个选项。
- user9966656
特征生成无需修改数据集。您只需加载数据集,然后使用代码进行增强(例如添加词干)。然后将增强后的数据集用作学习算法的输入。 - Florian Brucker

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接