首先是一些背景。我在SAS中使用proc sql,并且需要获取数据集中的所有条目(具有几百万个条目),其变量“Name”等于(比如说)“Massachusetts”。当然,由于数据曾经由人类手动输入,因此接近所有可能出现的拼写错误(“Amssachusetts”,“Kassachusetts”等)。
我发现很少有条目错误地超过两个字符,所以代码
Name like "__ssachusetts" OR Name like "_a_sachusetts" OR ... OR Name like "Massachuset__"
会选择我要查找的条目。但是,我希望必须有一种更方便的方式来编写
Name that differs by at most 2 characters from "Massachusetts";
有吗?或者是否有其他策略来获取这些条目?我尝试搜索stackoverflow和网络但是不成功。我也是SQL和SAS的初学者。
一些额外的信息:数据库不是英文的(实际的字符串不是“马萨诸塞州”)所以使用SOUNDEX实际上并不可行(如果有的话)。
提前致谢。
(编辑:改进标题)
答案 0 :(得分:13)
SAS具有内置函数COMPGED和COMPLEV来计算字符串之间的距离。这是一个示例,显示如何选择Levenshtein编辑距离小于或等于2的那些。
data typo;
input name $20.;
datalines;
massachusetts
masachusets
mssachusetts
nassachusets
nassachussets
massachusett
;
proc sql;
select name from typo
where complev(name, "massachusetts") <= 2;
quit;
答案 1 :(得分:4)
还有其他语音算法,如Hamming distance,应该可以更好地运作。 您可以在Google上搜索特定数据库引擎的此算法实现。
答案 2 :(得分:3)
您要找的是“Approximate string matching”。为此,可以使用“Levenshtein distance computing algorithm”。我不确定,但希望this answer will help
答案 3 :(得分:1)
您可以实现此类型的存储函数(Oracle语法,转换为您的RDBMS):
CREATE FUNCTION distance(one VARCHAR2, two VARCHAR2) RETURN NUMBER IS
DETERMINISTIC
BEGIN
-- do some comparison here
END distance;
然后在SQL中使用它:
SELECT * FROM table WHERE distance(name, 'Massachusetts') <= 2
当然,这些事情往往很慢......
答案 4 :(得分:0)
我知道这已经太晚了四年,但因为它也可能会给正在搜索此主题的其他人提供想法: 您正在考虑的是一个语义分层设计,您需要为这些不同的文本比较实现一些条件逻辑,使用像Jaro-Winkler这样的Lenvenschtien距离来比较不同长度的文本和Hamming用于您想要的相同长度的文本简单的文本转换定位。现在所有各种文本挖掘程序都不是什么新鲜事。 这是一篇在我看来非常好的帖子; Jaro-Winkler string comparison function in SAS