【问题标题】:Find common patterns across strings and group them based on the pattern [duplicate]跨字符串查找常见模式并根据模式对它们进行分组[重复]
【发布时间】:2015-06-12 18:14:14
【问题描述】:

如何从一组输入字符串中自动提取常用字符或常用字符串?有没有这样的算法?

我正在尝试弄清楚如何解析 1000 个输入字符串并根据最大匹配模式自动创建字符串组。

是否有 ruby​​ 中的库可以执行此操作?

Sample Input

What is your name?
Who wrote this book?
Your name starts with ABC
Is this book good?
Why is your name so long?
Have you read this book?



Expected Output.

your name
——————
What is your name?
Your name starts with ABC
Why is your name so long?

this book
————
Who wrote this book?
Have you read this book?
Is this book good?

根据 luqui 的评论进行了编辑以澄清和修复错误。

  1. 大小写无关紧要。

【问题讨论】:

  • 您需要指定什么是“匹配模​​式”。是共同的单词数量,共同的子字符串的大小,还是什么?大小写或标点符号重要吗?请通过编辑您的问题进行澄清。
  • 这是一个有趣的算法挑战;我不知道任何标准解决方案。想到的第一个:制作一个包含所有子字符串的字典。所以在第二行之后我们会有字典{ "W" => 2, "Wh" => 2, "Wha" => 1, "Who" => 1, "What " => 1, "Who w" => 1, "hat" => 1, "ho " => 1 } 等等。遍历字符串列表,计算子字符串。然后在最后寻找超过一定长度的最大值(显然单个字符的计数最高,所以你需要一些额外的约束)
  • 顺便说一句,“这本书”肯定是第二套的匹配模式。

标签: ruby algorithm pattern-matching


【解决方案1】:

您可以使用核心 Ruby 库:

["your name", "book"].map do |substring|
  [substring, text.lines.map(&:downcase).select { |line| line[substring] }]
end.to_h

# => {
#      "your name" => ["What is your name?", "Your name starts with ABC", ...],
#      "book" => [...]
#    }

【讨论】:

  • 我认为OP想自动识别“你的名字”和“书”
  • 我认为OP不想指定要匹配的特定单词或字符串;相反,它是在某种程度的共性上对字符串进行分组。
  • @Andrew - 我想自动识别常用字符串。我事先不知道“你的名字”和“书”
  • 我明白了。那你的策略是什么?例如:1)获取所有现有的单词序列(可能不包括每行中的第一个单词) 2)压缩它们并接收短语字典 3)为所有字典运行我的算法(这会很慢 ~ L^2在最坏的情况下)4)按每个短语的行数降序对它们进行排序 5)要么取前 x 个短语,要么取多于 y 行的短语我认为这是一个关于你需要的算法的故事,而不是关于选择的故事图书馆的
猜你喜欢
  • 2016-11-18
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 2020-10-05
  • 2015-01-27
  • 2014-03-24
相关资源
最近更新 更多