【问题标题】:Fast way to search based on non-literal comparison基于非字面比较的快速搜索方法
【发布时间】:2012-12-05 18:03:03
【问题描述】:

基于非文字比较的快速搜索方法

我正在对相当大的数据集(基本上所有字符串)进行小型搜索。表字段之间的关系很简单,尽管比较不能是字面的。即它应该能够关联“filippo”、“philippo”、“filipo”等等。

我找到了一些可以做到的方法,经常在 Levinstein 距离上绊倒(thisherehere),但我不确定它在我的具体情况下是否实用。

简而言之,我有两个表,一个带有“搜索键”的小表和一个更大的表,应该在其中执行搜索。两个表具有相同的字段,并且它们都具有相同的“含义”。例如

KEYS_TABLE
# | NAME  | MIDNAME | SURNAME | ADDRESS         | PHONE
1 | John  | Fake    | Doe     | Sesame St.      | 333-12-32
2 | Ralph | Stue    | Michel  | Bart. Ghost St. | 778-13000
...

SEARCH_TABLE
#   | NAME     | MIDNAME | SURNAME | ADDRESS         | PHONE
...
532 | Jhon     | F.      | Doe     | Sesame Street   | 3331232
...
999 | Richard  | Dalas   | Doe     | Sesame St.      | 333-12-32

我想要做的就是获取某种度量,或者为KEYS_TABLE 上的每个给定记录排名,报告来自SEARCH_TABLE 的所有记录高于某个相关性(由度量定义或只是一些“KNN”类似方法)。

我说莱文斯坦距离可能不实用,因为它需要计算KEYS_TABLE x SEARCH_TABLE 中每一行中的每个字段。考虑到SEARCH_TABLE 有大约 4 亿条记录,KEYS_TABLE 从 100k 到 100 万条记录不等,结果数字太大了。

我希望有一些方法可以让我之前丰富这两个表,或者一些更简单(更便宜)的方法来执行搜索。

值得一提的是,我可以随意转换数据。例如将St. 标准化为st,将Street 标准化为st,删除特殊字符等等。

我的选择是什么?

【问题讨论】:

    标签: algorithm search-engine string-comparison levenshtein-distance text-analysis


    【解决方案1】:

    我能想到的一种方法(启发式!)是:

    除了表中的原始字段外,对于每个字段,还存储了其通过某种stemming算法得到的规范化形式。如果您使用的是 java,lucene 的EnglishAnalyzer 可能会帮助您完成这一步。

    使用标准方法进行精确比较,为table1 中的每个条目查找候选列表。 table2 中的条目 e2 将成为 table1 中的条目 e1 的候选对象,如果它们具有规范化形式与常规形式匹配的一些公共字段。这可以使用一些允许快速字符串搜索的数据结构有效地完成 - 有很多这样的。

    对于e1 中的每个条目 - 使用您选择的确切指标(例如您建议的 leneshtein 距离)在列表中为其找到“最佳”候选者

    如果有问题,您可能需要进行一些后期处理,以确保您没有将 table1 中的两个元素映射到 table2 中的同一元素。

    【讨论】:

      【解决方案2】:

      根据可能出现的拼写错误,您可以使用 Soundex 或 Metaphone 进行搜索。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-20
        • 1970-01-01
        • 2016-02-21
        • 1970-01-01
        • 2011-05-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多