首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Ruby中进行模糊子串匹配?

如何在Ruby中进行模糊子串匹配?
EN

Stack Overflow用户
提问于 2011-05-23 14:12:29
回答 3查看 12.5K关注 0票数 17

我发现了许多关于模糊匹配的链接,将一个字符串与另一个字符串进行比较,看看哪个字符串的相似度得分最高。

我有一个非常长的字符串,它是一个文档,还有一个子字符串。子字符串来自原始文档,但已经被转换了几次,因此可能引入了奇怪的工件,例如这里的空格,那里的破折号。子字符串将与原始文档中的文本部分匹配99%或更多。我没有进行匹配以查看该字符串来自哪个文档,我正在尝试查找该字符串开始的文档中的索引。

如果字符串是相同的,因为没有引入随机错误,我将使用document.index(substring),但是如果有一个字符差异,这个操作就会失败。

我认为可以通过删除字符串和子字符串中除a-z之外的所有字符来说明差异,比较,然后使用压缩字符串时生成的索引将压缩字符串中的索引转换为实际文档中的索引。这在空格和标点符号不同的地方工作得很好,但一旦一个字母不同,它就会失败。

文档通常是几页到一百页,子串从几个句子到几页。

EN

回答 3

Stack Overflow用户

发布于 2015-03-29 22:40:26

一个简单的例子就是fuzzy_match

代码语言:javascript
复制
require 'fuzzy_match'
FuzzyMatch.new(['seamus', 'andy', 'ben']).find('Shamus') #=> seamus

一个更详细的例子是levenshein,它计算差异的数量(但在本例中不会这么说)。

代码语言:javascript
复制
require 'levenshtein' 
Levenshtein.distance('test', 'test')    # => 0
Levenshtein.distance('test', 'tent')    # => 1
票数 3
EN

Stack Overflow用户

发布于 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

票数 2
EN

Stack Overflow用户

发布于 2011-05-23 15:07:00

这取决于可以在子字符串中结束的工件。在更简单的情况下,它们不是[a-z]的一部分,您可以使用解析子字符串,然后对文档使用Regexp#match

代码语言:javascript
复制
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上使用beginend

如果你只对起始位置感兴趣,你可以使用=~运算符:

代码语言:javascript
复制
start_pos = document =~ re
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6093473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档