2

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

"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"。我可以使用 regex case-ignore 或 downcase 来缓解大小写问题...

4

3 回答 3

3

以下示例比较所有字符串并计算 leventhtein 差异(使一个字符串适应另一个字符串所需的击键量)。

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

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}
于 2013-08-14T09:46:25.627 回答
2

String#squeeze
String#downcase

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

于 2013-08-14T03:36:27.280 回答
2

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

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

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

这不适用于艰难的缩写。

2.) 如果您使用词干分析器将每个单词标记标准化为通用基本形式,您可以获得更好的结果。词干的几个例子:words=>word,foot=>foot,construction=>construct,... 一旦你得到了词库(也称为 lemas),你可以将它们连接成一个字符串。然后做个对比。通常,词干分析器会为你做小写,所以你可以跳过这一步。

所以这两个字符串:

"Hazard Const. Company"
"hazard construction company"

转换为:

"hazard construct company"

代码取决于实际使用的词干分析器。比如你可以看看这个:https ://github.com/aurelian/ruby-stemmer

词干的实际输出也取决于使用的词干分析器。词干分析器 (lemmatizers) 的工作方式不仅仅是通过某种修剪规则,而且它们还尝试将单词与内部词库 (lemas) 进行匹配。因此,一个好的词形还原器会识别 Const。缩写并将其与构造引理匹配。

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

于 2013-08-14T09:55:54.760 回答