以下字符串被认为是相同的。我怎么能匹配这样的东西?
"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 ...
答案 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建议)计算它们的相似性,并根据测试数据结果调整可接受的相似性阈值。这是信息检索中的常用方法。您可以越多地自定义和专门化文本处理,您将获得更好的结果。换句话说 - 你尝试构建通用处理的次数越多,它就会越难,结果就会越差。