数据库中的名字变体

时间:2009-02-22 15:31:50

标签: sql sql-server algorithm database-design data-structures

我正在尝试确定在数据库中查找名字变体的最佳方法。例如,我搜索比尔史密斯。显然,我希望它回归“比尔史密斯”,但我还希望它能归还“威廉史密斯”,或“比利史密斯”,甚至“威利史密斯”。我最初的想法是建立一个名字层次结构,但我不知道在哪里可以获得这样的数据,如果它甚至存在。

由于用户可以搜索目录,我认为这将是一个关键功能。例如,我上学的人叫我乔,但我现在总是去约瑟夫。因此,我正在寻找使用NYSIIS或Double Metaphone对姓氏进行语音搜索,然后使用此名称heirarchy搜索名字。有没有更好的方法来做到这一点 - 也许某种分级相关性使用全名搜索全名而不是对名字和姓氏进行两部分搜索?我的一部分认为,如果我将名称存储为单个值而不是多个值,则可能会以更多搜索选项为代价,但代价是能够通过名字对用户进行寻址。

就平台而言,我正在使用SQL Server 2005 - 但是,我没有将一些匹配转移到代码中的问题;例如,为用户预先播种语音键,因为它们不会改变。

任何想法或指导都将不胜感激。无数的搜索几乎空了。谢谢!

编辑:似乎功能上有两个截然不同的阵营,我现在肯定坐在中间位置。我可以看到全文搜索的论点 - 很可能是缺乏数据规范化,而且是一个多部分方法,它对名称的不同部分使用不同的标准。

问题最终归结为用户意图。比尔/威廉的例子很好,因为它根据使用的形式显示了名字的变异。我认为构建名称层次结构是更准确(和可扩展)的解决方案,但会更加复杂。模糊搜索方法以牺牲准确性为代价更容易实现。这是一个公平的比较吗?

解决方案:在做了一些测试后,我决定采用一种方法,初始注册将采用全名,我会将其拆分为多个字段(forename,surname,middle,suffix等)。 )。由于我确信它不会很完美,我将允许用户编辑“部件”,包括添加首页或备用名称。就搜索而言,无论是在数据库表中还是作为同义词库,我都需要使用任一解决方案来维护存在的变体。在这种情况下,两者都没有优势。我认为它将取决于性能,我将不得不实际运行一些基准来确定哪个是最好的。感谢大家的投入!

9 个答案:

答案 0 :(得分:3)

在我看来,你应该做一个功能正确并使其完成,或者你应该将其关闭以避免在计算机程序中建立一个半智能的智能大部分时间仍然出错("Looks like you're writing a letter",有人吗?)。

如果是人名,计算机大部分时间都会出错,正确完成并且完成是不可能的,恕我直言。也许你可以破解一些最常见的英文名字。但实际上,寻找“比尔”和“威廉”的情报几乎都是建立在说英语的人身上 - 我会留给他们连接点。

答案 1 :(得分:1)

我认为你的基本方法很扎实。我认为全文不会对你有所帮助。对于播种,behindthename.com似乎有大量你想要的数据。

答案 2 :(得分:1)

您是否正在使用带有高级服务的SQl Server 2005 Express,听起来您可以从全文索引中受益,更具体地说,您可以使用包含和可以在此处使用特定说明的Containstable链接以使用Containstable:< / p>

http://msdn.microsoft.com/en-us/library/ms189760.aspx

以下是带有高级服务的SQL Server 2005的下载链接:

http://www.microsoft.com/downloads/details.aspx?familyid=4C6BA9FD-319A-4887-BC75-3B02B5E48A40&displaylang=en

希望这有帮助,

安德鲁

答案 3 :(得分:1)

您可以使用SQL Server全文搜索并进行屈折搜索。

基本上像:

SELECT ProductId,ProductName 来自ProductModel 在哪里包含(CatalogDescription,'FORMSOF(THESAURUS,metal)')

退房: http://en.wikipedia.org/wiki/SQL_Server_Full_Text_Search#Inflectional_Searches http://msdn.microsoft.com/en-us/library/ms345119.aspx http://www.mssqltips.com/tip.asp?tip=1491

答案 4 :(得分:1)

不确定您的应用程序是什么,但如果您的用户在注册时知道他们过去的人可能正在搜索数据库,那么您可以在用户配置文件中为他们提供定义其他名称的机会被称为(包括姓氏,女性一直在改变这些,并使得发现它们更加困难!)并且他们希望人们能够搜索。将它们存储在单独的相关表中。然后搜索那个。只需创建一个结构,您就可以定义一个名称作为主要名称(除搜索之外的所有名称)。

答案 5 :(得分:1)

你会发现你正在涉及一个被称为“自然语言处理”的领域,你需要做几件事,其中大部分都可以在stemming的主题下找到。

简单的词干简单地将这个词分开,但更高级的算法将词语联系起来意味着同样的事情 - 例如Google可能会使用词干将“猫”和“小猫”转换为“猫”并搜索所有三个,称重用户提供的实际单词稍微重一些,因此完全匹配在词干匹配之前返回。

这是一个已知问题,并且open source stemmers可用。

- 亚当

答案 6 :(得分:1)

你正在寻找的术语是Hypocorism:

http://en.wikipedia.org/wiki/Hypocorism

维基百科列出了其中许多内容。您可以敲出一些Python或Perl来抓取该页面并将其放入数据库中。

我会选择这样的结构:

create table given_names (
  id int primary key,
  name text not null unique
);

create table hypocorisms (
  id int references given_names(id),
  name text not null,

  primary key (id, name)
);

insert into given_names values (1, 'William');
insert into hypocorisms values (1, 'Bill');
insert into hypocorisms values (1, 'Billy');

然后你可以写一个函数/ sproc来规范化一个名字:

normalize_given_name('Bill'); --returns William

你将面临的一个问题是,不同的名字可能具有相同的主张(Albert - &gt; Al,Alan - &gt; Al)

答案 7 :(得分:0)

不,全文搜索无助于解决您的问题。

我想你可能想看看下面的一些链接:(有趣的是,到现在为止没人提到SoundEx)

基本上,SoundEx允许您评估类似发声单词的相似程度。该功能也可以在SQL 2005上使用。

作为一个副作用,不是返回类似的结果,用户可能会更直观地使用基于AJAX的脚本在用户启动他/她的搜索之前提供类似的声音名称。这样你就可以向用户显示“相似的名字”或“你的意思......”这类数据。

答案 8 :(得分:0)

这是一个自动查找“名字同义词”的想法,比如Bill / William。这个问题已经在一般同义词的更广泛的背景下进行了研究:从像Web这样的大型文本语料库中通常出现在相同上下文中的统计数据中引出它们。您可以尝试将该方法与Moby Names等名称列表相结合;我不知道以前是否已经完成。

Here are some pointers.