我的目标是在给定输入字符串的情况下,在一大串字符串中识别出前10个最相似的字符串。这是基于Web的API,因此我需要非常快的响应时间(<100ms是理想的)。
我正在使用Python进行操作,但是如果有更好的方法可以实现这一目标(可以通过Bash脚本或另一种语言来实现),则可以很灵活。到目前为止,我已经尝试了多种方法,包括difflib和fuzzywuzzy,但返回的结果太慢或没有返回理想的结果。
在我最近的实验中,使用Fuzzywuzzy的解决方案返回了不理想的结果集。
“优惠券”的输入返回:
Query Stem Key compare score
34046 copson copson 1 coupon 83
35011 couponcom couponcom 1 coupon 80
61206 groupon groupon 1 coupon 77
5834 able coupon abl coupon 1 coupon 75
124231 rjr coupons rjr coupon 1 coupon 75
35026 couponscom couponscom 1 coupon 75
34991 couples coupl 1 coupon 73
34993 couples dominated coupl domin 1 coupon 71
11236 arbys coupon arbi coupon 1 coupon 71
虽然结果集中有相关的关键字,但是不相关的关键字(“ couples”)我知道,由于较大的字符串集之间的编辑距离较大,因此更好的结果被忽略了原始查询。例如。 “生日优惠券”,“超市优惠券”
是否有一种方法可以像n-gram进行匹配以确保更相关的相似性?速度是这里的重中之重,我会提前处理拼写错误和词根阻塞等问题。
字符串相似性是NLP中的一个广泛主题,因此决定度量标准很重要。 fuzzywuzzy
使用Levenshtein distance适用于处理拼写错误,但不以任何方式解决语义相似性。从您的书面内容来看,这就是您要寻找的内容,因此我建议您通过gensim
库使用Word2Vec模型。
为此,我建议您参考此问题的答案:How to use word2vec to calculate the similarity distance by giving 2 words?