字符串匹配技术

时间:2013-08-14 03:32:31

标签: ruby regex string string-matching

以下字符串被认为是相同的。我怎么能匹配这样的东西?

"Hazard Const. Company"
"hazard construction company"

"PETERSON-CHASE GENERAL ENGINEERING CONSTRUCTION INC"
"peterson-chase general  engineering construction inc"

"TRAFFIC DEVELOPMENT SERVICES "
"traffic development services"

我的环境很糟糕,但我只是想知道匹配字符串的一般原则。由于空白问题和缩写,上面的例子不适用于基本的“a”==“b”。我可以缓解套接字问题w / regex case-ignore或downcase the strings ...

3 个答案:

答案 0 :(得分:3)

以下示例比较了所有字符串并计算了levensthtein差异(将一个字符串调整到另一个字符串所需的击键次数)。

根据定义的最大差异并对字符串的长度进行补偿,然后将字符串放入哈希值作为键,并显示出现次数的值。

require 'levenshtein'

MAX_DISTANCE, COMPENSATION = 3, 5

strings = [
    "Hazard Const. Company",
    "hazard construction company",
    "PETERSON-CHASE GENERAL ENGINEERING CONSTRUCTION INC",
    "peterson-chase general  engineering construction inc",
    "TRAFFIC DEVELOPMENT SERVICES ",
    "traffic development services"
]

result = {}
strings.each do |s|
    s.downcase!
  similar = result.keys.select { |key| Levenshtein.distance(key, s) < MAX_DISTANCE+(s.length/COMPENSATION) }
  if similar.any?
    result[similar.first] += 1
  else
    result.merge!({s => 1})
  end
end

puts result.inspect
# {"hazard const. company"=>2, "peterson-chase general engineering construction inc"=>2, "traffic development services "=>2}

答案 1 :(得分:2)

字符串#挤压
串#downcase

对于第一个,你必须计算levenshtein距离或类似距离。

答案 2 :(得分:2)

一个有趣的问题,属于文本挖掘和信息检索的主题。通常,您可以使用词干化(词形还原)算法或甚至通过更简单的启发式算法来实现所描述的匹配。

1。)后一种情况是处理两个字符串以获得每个字符串的规范化版本,然后进行比较。我们可以用一个空格替换更大的空格,并用两个字符串替换所有字符。字符串规范化的示例:

string.gsub(/\s+/, ' ').downcase

这对缩写很难有用。

2。)如果使用词干分析器将每个单词标记规范化为公共基本形式,则可以获得更好的结果。词干的几个例子:words =&gt; word,feet =&gt; foot,construction =&gt; construct,...一旦你得到单词base(也称为lemas),你可以将它们连接成一个字符串。然后进行比较。通常,词干分析器会为你做一个小写,所以你可以跳过这一步。

所以这两个字符串都是:

"Hazard Const. Company"
"hazard construction company"

转换为:

"hazard construct company"

代码取决于使用的实际词干分析器。例如,您可以查看以下内容:https://github.com/aurelian/ruby-stemmer

词干词的实际输出也取决于使用的词干分析器。词干(词形除词器)的工作方式不仅仅是通过某种修剪规则,而且还试图将词语与词库(lemas)的内部库相匹配。因此,一个好的变形器将识别Const。缩写并与构造lema匹配。

由于并非所有缩写都可以识别(但例如只有90%),最好不要匹配确切的字符串。但是尝试通过距离计算(如@ 7stud建议)计算它们的相似性,并根据测试数据结果调整可接受的相似性阈值。这是信息检索中的常用方法。您可以越多地自定义和专门化文本处理,您将获得更好的结果。换句话说 - 你尝试构建通用处理的次数越多,它就会越难,结果就会越差。