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

前端之家收集整理的这篇文章主要介绍了如何在Ruby中进行模糊子串匹配?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我发现很多关于模糊匹配的链接,将一个字符串与另一个字符串进行比较,看到哪个获得最高的相似性分数.

我有一个非常长的字符串,它是一个文档和一个子字符串.子串来自原始文档,但已被转换好几次,所以可能会引入奇怪的文物,比如这里的空格,破折号.子字符串将匹配原始文档中的一部分文本99%以上.我不匹配,看看这个字符串是从哪个文档,我试图在文档中找到字符串开始的索引.

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

我认为通过删除字符串和子字符串中除az之外的所有字符进行比较,比较,然后使用压缩字符串时生成的索引,将压缩字符串中的索引转换为真实文档中的索引.这一点在差异是空白和标点符号的情况下运行良好,但一旦一个字母不同,它就失败了.

该文档通常是几页到一百页,从几个句子到几页的子字符串.

解决方法

你可以试试amatch.它可以作为一个红宝石宝石,虽然我没有使用模糊逻辑很长一段时间,它看起来有你需要的. amatch的主页是: http://flori.github.com/amatch/.

只是无聊和混乱的想法,一个完全未优化和未经测试的黑客的解决方案如下:

  1. include 'amatch'
  2.  
  3. module FuzzyFinder
  4. def scanner( input )
  5. out = [] unless block_given?
  6. pos = 0
  7. input.scan(/(\w+)(\W*)/) do |word,white|
  8. startpos = pos
  9. pos = word.length + white.length
  10. if block_given?
  11. yield startpos,word
  12. else
  13. out << [startpos,word]
  14. end
  15. end
  16. end
  17.  
  18. def find( text,doc )
  19. index = scanner(doc)
  20. sstr = text.gsub(/\W/,'')
  21. levenshtein = Amatch::Levensthtein.new(sstr)
  22. minlen = sstr.length
  23. maxndx = index.length
  24. possibles = []
  25. minscore = minlen*2
  26. index.each_with_index do |x,i|
  27. spos = x[0]
  28. str = x[1]
  29. si = i
  30. while (str.length < minlen)
  31. i += 1
  32. break unless i < maxndx
  33. str += index[i][1]
  34. end
  35. str = str.slice(0,minlen) if (str.length > minlen)
  36. score = levenshtein.search(str)
  37. if score < minscore
  38. possibles = [spos]
  39. minscore = score
  40. elsif score == minscore
  41. possibles << spos
  42. end
  43. end
  44. [minscore,possibles]
  45. end
  46. end

显然有很多改进可能,可能是必要的!几个顶部:

>一次处理文档并存储结果,可能在一个数据库.>确定字符串的可用长度进行初步检查,处理最初的子串在尝试匹配整个之前分段.>跟随上一个,预先计算起始片段那个长度.

猜你在找的Ruby相关文章