-
13-09-2019 - |
题
是否有能够由一个人的姓名的两个不同数据源之间的用于匹配的任何工具或方法
在系统中没有其他公共信息,并在许多情况下,名字已经进入不同。
非完全匹配的实例:
景小,马丁路德=景,马丁(排除后缀),点击 欧文博士J. =欧文,J.(不包括前缀)点击 奥巴马巴拉克·侯赛因=奥巴马,巴拉克(排除中间名)点击 Pufnstuf,H.R. = Pufnstuf,灰羽连盟(匹配的缩写),点击 Tankengine,托马斯= Tankengine,汤姆(比赛常见昵称)点击 个性,瑞克 “的Natureboy”=个性,Natureboy(匹配上昵称)
解决方案
我不得不使用各种技术建议。谢谢指点我朝着正确的方向(S)。我们希望,下面将帮助别人出这种类型的问题需要解决。
<强>去除多余的字符强>
CREATE FUNCTION [dbo].[fn_StripCharacters]
(
@String NVARCHAR(MAX),
@MatchExpression VARCHAR(255)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
SET @MatchExpression = '%['+@MatchExpression+']%'
WHILE PatIndex(@MatchExpression, @String) > 0
SET @String = Stuff(@String, PatIndex(@MatchExpression, @String), 1, '')
RETURN @String
END
用法:的
--remove all non-alphanumeric and non-white space
dbo.fn_StripCharacters(@Value, , '^a-z^0-9 ')
<强>分割名称为部分强>
CREATE FUNCTION [dbo].[SplitTable] (@sep char(1), @sList StringList READONLY)
RETURNS @ResultList TABLE
(
[ID] VARCHAR(MAX),
[Val] VARCHAR(MAX)
)
AS
BEGIN
declare @OuterCursor cursor
declare @ID varchar(max)
declare @Val varchar(max)
set @OuterCursor = cursor fast_forward for (SELECT * FROM @sList) FOR READ ONLY
open @OuterCursor
fetch next from @OuterCursor into @ID, @Val
while (@@FETCH_STATUS=0)
begin
INSERT INTO @ResultList (ID, Val)
select @ID, split.s from dbo.Split(@sep, @Val) as split
where len(split.s) > 0
fetch next from @OuterCursor into @ID, @Val
end
close @OuterCursor
deallocate @OuterCursor
CREATE FUNCTION [dbo].[Split] (@sep char(1), @s varchar(8000))
RETURNS table
AS
RETURN (
WITH Pieces(pn, start, stop) AS (
SELECT 1, 1, CHARINDEX(@sep, @s)
UNION ALL
SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
FROM Pieces
WHERE stop > 0
)
SELECT pn,
LTRIM(RTRIM(SUBSTRING(@s, start,
CASE WHEN stop > 0
THEN stop-start
ELSE 8000
END))) AS s
FROM Pieces
)
RETURN
用法:的
--create split name list
DECLARE @NameList StringList
INSERT INTO @NameList (ID, Val)
SELECT id, firstname FROM dbo.[User] u
WHERE PATINDEX('%[^a-z]%', u.FirstName) > 0
----remove split dups
select u.ID, COUNT(*)
from dbo.import_SplitTable(' ', @NameList) splitList
INNER JOIN dbo.[User] u
ON splitList.id = u.id
<强>常见昵称:强>
我创建的表基于此列表并用它来加入关于通用名等同物。
用法:
SELECT u.id
, u.FirstName
, u_nickname_maybe.Name AS MaybeNickname
, u.LastName
, c.ID AS ContactID from
FROM dbo.[User] u
INNER JOIN nickname u_nickname_match
ON u.FirstName = u_nickname_match.Name
INNER JOIN nickname u_nickname_maybe
ON u_nickname_match.relatedid = u_nickname_maybe.id
LEFT OUTER JOIN
(
SELECT c.id, c.LastName, c.FirstName,
c_nickname_maybe.Name AS MaybeFirstName
FROM dbo.Contact c
INNER JOIN nickname c_nickname_match
ON c.FirstName = c_nickname_match.Name
INNER JOIN nickname c_nickname_maybe
ON c_nickname_match.relatedid = c_nickname_maybe.id
WHERE c_nickname_match.Name <> c_nickname_maybe.Name
) as c
ON c.AccountHolderID = ah.ID
AND u_nickname_maybe.Name = c.MaybeFirstName AND u.LastName = c.LastName
WHERE u_nickname_match.Name <> u_nickname_maybe.Name
<强>语音算法(哈罗温克勒):强>
在惊人制品,超越SoundEx代 - MS SQL Server中的模糊搜索功能,演示了如何安装和使用 SimMetrics 库到SQL Server。这个库可以让你找到字符串之间的相对相似性,包括许多算法。我结束了大多采用哈罗温克勒来的名称一致。
用法:的
SELECT
u.id AS UserID
,c.id AS ContactID
,u.FirstName
,c.FirstName
,u.LastName
,c.LastName
,maxResult.CombinedScores
from
(
SELECT
u.ID
,
max(
dbo.JaroWinkler(lower(u.FirstName), lower(c.FirstName))
* dbo.JaroWinkler(LOWER(u.LastName), LOWER(c.LastName))
) AS CombinedScores
FROM dbo.[User] u, dbo.[Contact] c
WHERE u.ContactID IS NULL
GROUP BY u.id
) AS maxResult
INNER JOIN dbo.[User] u
ON maxResult.id = u.id
INNER JOIN dbo.[Contact] c
ON maxResult.CombinedScores =
dbo.JaroWinkler(lower(u.FirstName), lower(c.FirstName))
* dbo.JaroWinkler(LOWER(u.LastName), LOWER(c.LastName))
其他提示
这是一个非常复杂的问题 - 和正确的也有很多昂贵的工具,这样做结果。 如果你有没有想过,为什么你不能检查在飞行汤姆,迪克和哈里(或草案)点击 或者为什么禁飞名单和恐怖分子监视名单不工作 - 考虑:
(1)卡扎菲结果 (2)Mo'ammar卡扎菲结果 (3)穆阿迈尔Kaddafi结果 (4)卡扎菲结果 (5)穆阿迈尔埃尔卡扎菲结果 (6)穆阿迈尔Gadafi结果 (7)Mu'ammar AL-Qadafi结果 (8)穆阿迈尔埃尔Kazzafi结果 (9)Moamar卡扎菲结果 (10)的Al Mu'ammar结果卡扎菲 (11)穆阿迈尔卡扎菲结果 (12)Mo'ammar EL卡扎菲结果 (13)Moamar埃尔卡扎菲结果 (14)穆阿迈尔·卡扎菲结果 (15)Mu'ammar AL-Qadhdhafi结果 (16)Mu'ammar Qadafi结果 (17)Moamar卡扎菲结果 (18)Mu'ammar Qadhdhafi结果 (19)穆阿迈尔Khaddafi结果 (20)穆阿迈尔Khaddafi结果 (21)Mu'amar AL-卡达菲结果 (22)穆阿迈尔Ghaddafy结果 (23)穆阿迈尔·卡扎菲结果 (24)卡扎菲结果 (25)Muamar Kaddafi结果 (26)穆阿迈尔Quathafi结果 (27)穆阿迈尔Gheddafi结果 (28)Muamar的Al-Kaddafi结果 (29)穆阿迈尔Khadafy结果 (30)穆阿迈尔Qudhafi结果 (31)Mu'ammar卡扎菲结果 (32)Mulazim伊斯兰外交部长Mu'ammar穆罕默德阿布米尼亚尔·卡扎菲
而这只是官方的拼写 - 它不包括错别字
我经常采用的同音型算法这种类型的情况。尝试双音位算法。如果正在使用SQL Server,有一些源代码来创建用户定义的函数。
由于已转置数据,则可能需要正常化它一点,例如,删除所有逗号和由第一个字母所得单词排序。这会给你一些更好的匹配潜力。在词已经在中间加入的情况下,它变得有点艰难。你可以考虑将一个名称的话,有双音位检查是否有相匹配的另一列一个字,然后收集与检索词的,它会告诉你两列的接近程度的总体数量。
我还要滤除像博士,先生,女士,夫人,等常用词,做比较之前。
下面是一些选项:
语音算法...
的Soundex( http://en.wikipedia.org/wiki/Soundex )
双音位( http://en.wikipedia.org/wiki/Double_Metaphone )
编辑距离( http://en.wikipedia.org/wiki/Levenshtein_distance )
哈罗-温克勒距离( http://en.wikipedia.org/wiki/Jaro- Winkler_distance )
另一件事你可以尝试将每个字(分裂的空间,也许连字符),每个字比较其他人的名字,看到的话有多少匹配。也许有更多的模糊匹配语音算法结合这一点。对于庞大的数据集,你想索引的每个单词,并用名称ID匹配。对于缩写匹配可以对比刚刚的第一个字母。你可能想忽略任何东西,但是当你比较的话,以及字母。
许多语音算法具有开放的源极/样品的在线
音位3 是第三代音位算法。 它增加了语音编码的精度从双的89% 音位为 98%下,作为对最常见的数据库测试 英语单词和名称,并在北美熟悉的非英语单词 美国。这产生了一个非常可靠的语音编码 美国发音
音位3是设计和劳伦斯飞利浦,开发谁 设计并开发的原始音位和双音位 算法