我发现了许多关于模糊匹配的链接,将一个字符串与另一个字符串进行比较,看看哪个字符串的相似度得分最高。
我有一个非常长的字符串,它是一个文档,还有一个子字符串。子字符串来自原始文档,但已经被转换了几次,因此可能引入了奇怪的工件,例如这里的空格,那里的破折号。子字符串将与原始文档中的文本部分匹配99%或更多。我没有进行匹配以查看该字符串来自哪个文档,我正在尝试查找该字符串开始的文档中的索引。
如果字符串是相同的,因为没有引入随机错误,我将使用document.index(substring)
,但是如果有一个字符差异,这个操作就会失败。
我认为可以通过删除字符串和子字符串中除a-z之外的所有字符来说明差异,比较,然后使用压缩字符串时生成的索引将压缩字符串中的索引转换为实际文档中的索引。这在空格和标点符号不同的地方工作得很好,但一旦一个字母不同,它就会失败。
文档通常是几页到一百页,子串从几个句子到几页。
发布于 2015-03-29 22:40:26
一个简单的例子就是fuzzy_match
require 'fuzzy_match'
FuzzyMatch.new(['seamus', 'andy', 'ben']).find('Shamus') #=> seamus
一个更详细的例子是levenshein,它计算差异的数量(但在本例中不会这么说)。
require 'levenshtein'
Levenshtein.distance('test', 'test') # => 0
Levenshtein.distance('test', 'tent') # => 1
发布于 2013-08-22 18:31:33
您应该看看这里详细介绍的StrikeAMatch实现:A better similarity ranking algorithm for variable length strings
它不依赖于某种类型的字符串距离(即两个字符串之间的变化次数),而是查看字符对模式。每个字符串中出现的字符对越多,匹配就越好。它在我们的应用程序中工作得很好,我们在纯文本文件中搜索输入错误的/可变长度的标题。
还有一个gem结合了StrikeAMatch (字符级二元语法上的Dice's coefficient实现)和Levenshtein距离来查找匹配项:https://github.com/seamusabshere/fuzzy_match
发布于 2011-05-23 15:07:00
这取决于可以在子字符串中结束的工件。在更简单的情况下,它们不是[a-z]
的一部分,您可以使用解析子字符串,然后对文档使用Regexp#match
:
document = 'Ulputat non nullandigna tortor dolessi illam sectem laor acipsus.'
substr = "tortor - dolessi _%&# +illam"
re = Regexp.new(substr.split(/[^a-z]/i).select{|e| !e.empty?}.join(".*"))
md = document.match re
puts document[md.begin(0) ... md.end(0)]
# => tortor dolessi illam
(在这里,因为我们在正则表达式中没有设置任何括号,所以我们在MatchData
的第一个(完全匹配)元素0
上使用begin
和end
。
如果你只对起始位置感兴趣,你可以使用=~
运算符:
start_pos = document =~ re
https://stackoverflow.com/questions/6093473
复制相似问题