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

2024-04-18

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

我有一个很长的字符串(一个文档)和一个子字符串。子字符串来自原始文档,但已被转换多次,因此可能会引入奇怪的工件,例如这里有一个空格,那里有一个破折号。子字符串将与原始文档中的文本部分匹配 99% 或更多。我无法匹配该字符串来自哪个文档,我试图在该字符串开始的文档中找到索引。

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

我认为可以通过删除字符串和子字符串中除 a-z 之外的所有字符进行比较,然后使用压缩字符串时生成的索引将压缩字符串中的索引转换为真实文档中的索引来解决差异。当差异是空格和标点符号时,这种方法效果很好,但一旦有一个字母不同,它就会失败。

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


你可以尝试一下匹配。它可以作为 ruby​​ gem 提供,虽然我已经很长时间没有使用模糊逻辑了,但它看起来有你需要的东西。 amatch的主页是:https://github.com/flori/amatch https://github.com/flori/amatch.

只是无聊地摆弄这个想法,一个完全未经优化且未经测试的解决方案黑客如下:

include 'amatch'

module FuzzyFinder
  def scanner( input )
    out = [] unless block_given?
    pos = 0
    input.scan(/(\w+)(\W*)/) do |word, white|
      startpos = pos
      pos = word.length + white.length
      if block_given?
        yield startpos, word
      else
        out << [startpos, word]
      end
    end
  end

  def find( text, doc )
    index = scanner(doc)
    sstr = text.gsub(/\W/,'')
    levenshtein = Amatch::Levensthtein.new(sstr)
    minlen = sstr.length
    maxndx = index.length
    possibles = []
    minscore = minlen*2
    index.each_with_index do |x, i|
      spos = x[0]
      str = x[1]
      si = i
      while (str.length < minlen)
        i += 1
        break unless i < maxndx
        str += index[i][1]
      end
      str = str.slice(0,minlen) if (str.length > minlen)
      score = levenshtein.search(str)
      if score < minscore
        possibles = [spos]
        minscore = score
      elsif score == minscore
        possibles << spos
      end
    end
    [minscore, possibles]
  end
end

显然,还有许多可能的改进,而且可能是必要的!一些顶部:

  1. 处理一次文档并存储 结果,可能在数据库中。
  2. 确定字符串的可用长度 进行初步检查、处理 首先针对该初始子字符串 在尝试匹配整个之前 分段。
  3. 继上一篇之后, 预先计算起始片段 那个长度。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Ruby 中进行模糊子字符串匹配? 的相关文章

  • 清洁琴弦的更好方法?

    我正在使用这种方法来清理字符串 public static string CleanString string dirtyString string removeChars lt gt string result dirtyString f
  • 返回类型时 c_str() 与 data()

    在C 11之后 我想到了c str and data 同等地 https stackoverflow com questions 194634 string c str vs data C 17 为后者引入了一个重载 它返回一个非常量指针
  • 执行 Boyer-Moore 模式匹配时是否必须考虑编码?

    我即将实现 Boyer Moore 模式匹配算法的变体 具体来说是星期日算法 我问自己 我的字母表大小是多少 它是否取决于编码 可能的字符数 或者我可以假设我的字母表由 256 个符号组成 一个字节可以表示的符号数 在许多其他情况下 将字符
  • 如何处理 Nokogiri 中的 404 未找到错误

    我正在使用 Nokogiri 来抓取网页 很少有 url 需要猜测 当它们不存在时 会返回 404 未找到错误 有没有办法捕获这个异常 http yoursite page 38475 gt page number 38475 doesn
  • Rails 3.2:用 json 序列化中的空字符串替换 null 值

    我正在使用 Rails 3 2序列化 http www simonecarletti com blog 2010 04 inside ruby on rails serializing ruby objects with json 将 ru
  • 从logstash中的文件名获取事件的时间戳

    我们有一个将事件写入文件的进程 没有时间戳 文件名本身带有时间戳后缀 该时间戳应用于文件中的所有事件 现在 我尝试使用logstash的输入文件插件来解析该文件 有没有一种方法可以将文件名获取到字段 以便我可以使用 gsub 过滤器提取时间
  • 使用正则表达式搜索 Ruby 数组

    你好 我有一个小的 ruby 函数 它可以分割出一个 Ruby 数组 如下所示 def rearrange arr from to sidx arr index from eidx arr index to arr sidx arr sid
  • 从 Ruby on Rails 应用程序运行 phantomjs

    我有兴趣使用幻影 http www phantomjs org 我想从我的 Ruby on Rails 应用程序运行它 然而 这是一个命令行工具 即我需要运行类似phantomjs rasterize js http raphaeljs c
  • 通过 ruby​​ 进程共享变量

    我正在编写一个 gem 其中我必须分叉两个进程来启动两个 webrick 服务器 我想通过基类的类方法启动该服务器 因为应该只运行这两个服务器 而不是多个服务器 在运行时 我想调用这两台服务器上的一些方法来更改变量 我的问题是 我无法通过基
  • 更改 en.yml 文件中的属性名称不起作用

    我更改了 ruby on Rails 项目中 en yml 文件中的属性名称 按钮工作正常 但字段属性并没有改变 这是我的模型 class Enr AffordableWarmth lt ActiveRecord Base self tab
  • 将对象转换为哈希,然后将其保存到用户的列

    找不到任何接近我想做的事情 我想将一个对象存储到用户的列中 该列采用数组的形式 postgres def change add column users interest string array true default end 我有另一
  • 具有字符串类型的 CAPL 关联数组

    按照此paper https kb vector com upload 551 file CAPL 3 CANNewsletter 201411 PressArticle EN pdf 我正在尝试创建一个像这样的关联数组 variables
  • 如何在 Ruby 中将 DateTime.now 转换为 UTC?

    如果我有d DateTime now 如何将 d 转换为 UTC 带有适当的日期 DateTime now new offset 0 将在标准 Ruby 中工作 即没有 ActiveSupport
  • Rails 6:每个用户只能创建一个配置文件

    我目前正在开发 Rails 6 应用程序 我有以下关联 用户有一个配置文件 并且配置文件属于用户 当编辑用户的配置文件时 我最终为该用户提供了两个配置文件 我希望每个用户只有一份个人资料 编辑表单 profile edit html erb
  • 使用 HTTPClient 发布嵌套参数(哈希)

    我需要从一个应用程序到另一个应用程序的多部分 http 帖子 其中包括文件附件和嵌套的参数哈希 我尝试使用HTTPClient这适用于文件附件 但是我无法获取以嵌套格式发送的参数 data params Hash new data para
  • Windows 等效的系统配置目录

    我正在 Ruby 中开发一个 CLI 应用程序 我希望允许通过标准配置文件级联在 Unix 中进行配置 etc appnamerc appnamerc 然而 该应用程序也应该在 Windows 环境中运行 我不确定将像这样的文件放在哪里 e
  • 递归检查字符串中的所有字母是否都是大写

    我必须检查递归中所有字母是否都是大写字母 我不知道为什么这不起作用 public static bool IsCapital string str if str Length 1 return int Parse str 0 ToStrin
  • 迭代带有小胡子的数组

    如何获取迭代中当前元素的引用 my array p what goes here p my array 我希望我只是忽略了显而易见的事情 根据规范的变更日志 https github com mustache spec blob maste
  • 比较 ruby​​ 中的两个字符串[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我刚刚开始学习 ruby 这可能很容
  • 根据列中的部分字符串匹配选择数据框行

    我想根据列中字符串的部分匹配从数据框中选择行 例如列 x 包含字符串 hsa 使用sqldf if它有一个like语法 我会做类似的事情 select from lt gt where x like hsa 很遗憾 sqldf不支持该语法

随机推荐

  • 扩展列表并违反开闭原则

    我刚刚在我的一个课程中创 建了以下方法 public static bool Assimilate this List
  • 将非 Rust 存储库声明为 Rust 项目中的依赖项的最佳方法是什么?

    我有一个 Rust 项目 我想使用另一个非 Rust 存储库中存在的 protobuf 定义 我打算下载 protobuf 存储库 创建一个src common protobuf我的主存储库中的模块 使用cargo build将每个 pro
  • 是否可以在 Firebase Analytics 中仅查看过去 30 分钟内的事件?

    正如您在右侧的图片中看到的 我可以看到搜索项的关键字 但似乎我只能跟踪最近 30 分钟的搜索关键字 是否可以只看到最后 30 分钟的事件 我的意思是我想跟踪过去 7 天的情况 怎么做 我在 Android 和 iOS 应用程序上使用它 据
  • 根据浏览器分辨率设置页面内容

    Here is my default browser size And my QR code is at right place When i re size my browser I got this one But here my QR
  • 如何在 Nginx 中将会话/cookie 从主域传递到子域?

    因此 我的主域中有一个子域的 iframe 页面 并且该子域页面需要用户登录并具有要访问的成员资格 基本上我需要将会话变量和 cookie 传递到子域以便加载 iframe 我怎样才能在 Nginx 中实现这一目标 饼干有一个domain属
  • 在 c# .Net 中创建基于索引的类

    我有一些类 想使用索引或类似的东西访问它们的属性 ClassObject 0 或者更好的是ClassObject PropName 而不是这个 ClassObj PropName Thanks 您需要索引器 http msdn micros
  • 如何在VBA中创建n个数组

    我有下面的代码 它可以完美地工作并完成我需要的技巧 但是我希望这段代码运行 n 次并创建 n 个数组 我的数据集是 我的代码是 Option Explicit Private Sub Test Const startRow As Long
  • 在 Drupal 8 中按节点获取分类术语 ID

    我正在尝试按特定节点获取分类数据 如何使用 Node 对象获取分类术语 ID Drupal 版本 8 3 6 你可以这样做 termId node gt get field yourfield gt target id 然后你可以加载该术语
  • 自动引用计数下,为什么不允许retain、release、dealloc?

    当尝试使用时 retain release and dealloc在 Xcode 4 2 中使用自动引用计数构建应用程序时 我收到如下错误 自动引用计数禁止 显式消息发送 dealloc 为什么我会看到这个错误 是 retain relea
  • 只能使用releaseImplementation和debugImplementation从maven添加Kotlin Multiplatform Mobile库

    每次我将 Kotlin Multiplatform Mobile 库发布到 Maven Central 时 我似乎唯一可以在 Android 应用程序中添加 使用 Android 依赖项的方法是添加releaseImplementation
  • 如何在 Ember.js 中指定动态根 URL?

    Ember 允许在路由器上指定根 URL http emberjs com guides routing toc specifying a root url http emberjs com guides routing toc speci
  • Symfony 4. InheritanceType("JOINED") 和 ParamConverter。奇怪的现象

    我已经定义了 CoreCase 类 ORM Entity repositoryClass App Repository CoreCaseRepository ORM InheritanceType JOINED ORM Discrimina
  • 块和保留周期

    一个小问题 为什么 Xcode 会抱怨listing 1会导致保留周期 而在listing 2它不是 在这两种情况下 clients is an int实例变量 在listing 2它被分配了0 in the init method 背景信
  • Powershell命令:rm -rf

    rm是删除item 但是参数是多少 rf做或表示 每当我输入 help rf 时 它都会打印 powershell 中可用命令的完整列表 如果您输入会发生什么rm rf在 powershell 中 通过阅读周围的资料 我发现它会删除驱动器上
  • GitHub Atom - 删除编辑器中的中心线

    我刚刚下载了 GitHub Atom Editor 正在对其进行自定义 但我无法删除编辑器中间的那行 有人帮我看看如何删除那条线吗 该行由wrap guide 包提供 您可以使用以下选项来删除该行 Option 1 禁用换行指南包裹 去At
  • 使用 XML 和 XSLT 生成 SQL

    我有一个 XML 定义 其中包含一个带有子元素的元素 例如 a b b a
  • 可以用宏获取评论吗?

    我试图解析一些代码并重新格式化它们 但似乎引用只会忽略注释 有什么办法可以实现这一点吗 我想我必须深入 erlang 方面 不 您无法在宏内获取代码注释 它们永远不会成为 AST 的一部分 并且仍然被丢弃在 Elixir 的标记器中
  • 使用 CRON 作业执行 PHP 脚本 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想每天午夜运行一个 PHP 脚本
  • JPEG 标头丢失/损坏

    我有一个 130kb jpeg 图像 无法在任何程序中打开 我需要修复它 从我使用的各种图像恢复软件中 我得到的只是 图像头损坏 丢失 当我查找文件的属性时 我什至没有得到任何信息 没有尺寸等 只有文件大小 一旦图像的标头丢失 是否可以恢复
  • 如何在 Ruby 中进行模糊子字符串匹配?

    我发现了很多关于模糊匹配的链接 将一个字符串与另一个字符串进行比较 看看哪个字符串的相似度得分最高 我有一个很长的字符串 一个文档 和一个子字符串 子字符串来自原始文档 但已被转换多次 因此可能会引入奇怪的工件 例如这里有一个空格 那里有一