代码之家  ›  专栏  ›  技术社区  ›  Joseph Ferris

数据库中的名字变体

  •  10
  • Joseph Ferris  · 技术社区  · 16 年前

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

    因为用户可以搜索目录,所以我认为这是一个关键特性。例如,和我一起上学的人叫我乔,但我现在总是和约瑟夫在一起。所以,我想做一个姓氏的语音搜索,要么用纽约证券交易所或双隐喻,然后用这个名字搜索第一个名字的继承权。有没有更好的方法可以做到这一点——也许是在全名上使用全文搜索,而不是在名和姓上使用两部分搜索来进行分级关联?我的一部分人认为,如果我将一个名称存储为单个值而不是多个值,那么它可能有助于提供更多的搜索选项,但代价是不能用名字来称呼用户。

    就平台而言,我使用的是SQL Server 2005——不过,我在将某些匹配项转换为代码时不会遇到问题;例如,为用户预先设定拼音键,因为它们不会改变。

    任何想法或指导都会受到赞赏。无数的搜索结果几乎都是空的。谢谢!

    编辑:看起来功能上有两个截然不同的阵营,我现在肯定坐在中间。我可以看到全文搜索的论据——很可能是在缺乏数据规范化的情况下完成的,以及对名称的不同部分使用不同标准的多部分方法。

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

    解决方法:在做了一些测试后,我决定采用一种方法,在这种方法中,初始注册将采用全名,并将其分为多个字段(名字、姓氏、中间名、后缀等)。因为我确信它不会是完美的,我将允许用户编辑“部分”,包括添加一个处女或备用名称。就搜索而言,无论是使用哪种解决方案,我都需要维护数据库表或同义词库中存在的变化。在这种情况下,两者都没有优势。我认为这将取决于性能,我必须实际运行一些基准来确定哪一个最好。谢谢大家的意见!

    9 回复  |  直到 7 年前
        1
  •  0
  •   Cerebrus    16 年前

    不,全文搜索对解决您的问题没有帮助。

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

    基本上,Soundex允许您评估相似发音词的相似程度。该函数在SQL 2005上也可用。

    作为一个附带问题,在用户开始搜索之前,使用基于Ajax的脚本来传递类似的发音名称,而不是返回类似的结果,这可能会让用户更加直观。这样,您就可以向用户显示“相似的名称”或“您的意思是……”之类的数据。

        2
  •  3
  •   Tomalak    16 年前

    在我看来,你要么做一个特写 正确的 并使之成为 完成 或者你应该放弃它以避免把一个半途而废的智能构建到一个大多数时候仍然出错的计算机程序中。( "Looks like you're writing a letter" 有人吗?).

    如果是人的名字,电脑大部分时间都会出错,不可能做到正确和完整。也许你可以破解一些最常见的英文名字。但事实上,寻找“比尔”和“威廉”的智慧几乎是建立在任何一个讲英语的人身上的——我会让他们把它联系起来。

        3
  •  1
  •   chaos    16 年前

    我认为你的基本方法是可靠的。我不认为全文本能帮助你。对于种子设定,behindtename.com似乎有大量您想要的数据。

        4
  •  1
  •   REA_ANDREW    16 年前

    您是否将SQL Server 2005 Express与高级服务配合使用?听起来,您将从全文索引中获益,更具体地说,它包含和包含不稳定内容,您可以使用这些内容和具体说明。下面是一个链接,用于包含不稳定内容:

    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

    希望这有帮助,

    安得烈

        5
  •  1
  •   Andrew Barrett    16 年前

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

    基本上像:

    选择ProductID、ProductName 从ProductModel 其中包含(目录说明,'formsof(同义词库,金属)')

    退房: 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

        6
  •  1
  •   HLGEM    16 年前

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

        7
  •  1
  •   Community CDub    7 年前

    你会发现你正在涉足一个被称为“自然语言处理”的领域,你需要做一些事情,其中大部分可以在 stemming .

    简单的词干只会将单词分开,但更高级的算法会将意思相同的单词关联起来——例如,Google可能会使用词干将“cat”和“kitten”转换为“feline”,并搜索所有这三个词,将用户提供的实际单词称为稍重,以便在词干匹配之前返回精确的匹配。

    这是一个已知的问题 open source stemmers 可用。

    -亚当

        8
  •  1
  •   Neil McGuigan    7 年前

    你要找的术语是“疑病症:

    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');
    

    然后可以编写函数/存储过程来规范化名称:

    normalize_given_name('Bill'); --returns William
    

    你将面临的一个问题是,不同的名字可能有相同的疑点(阿尔伯特-艾尔,艾伦-艾尔)

        9
  •  0
  •   Darius Bacon    16 年前

    这里有一个自动查找“名字同义词”的想法,比如比尔/威廉。这个问题已经在同义词的更广泛的背景下进行了研究:从统计数据中归纳出同义词通常出现在像网络这样的大型文本语料库的相同背景中。你可以尝试将这种方法与一系列的名字结合起来,比如 Moby Names 我不知道以前有没有做过。

    Here are some pointers.