【问题标题】:Any way to compare/match sentences with only a different word order?有什么方法可以比较/匹配仅具有不同词序的句子?
【发布时间】:2011-08-03 00:05:31
【问题描述】:

我有 2 个 MySQL 表,每个表中都有公司的地址数据。一张桌子较新,但没有电话,也没有网站数据。现在我想将这些表合并为 1 个最近的完整表。

但是对于一些公司来说,单词的顺序是不同的,像这样:

'Bakery Johnson' 在表 1 中,'Johnson Bakery' 在表 2 中。

现在我需要找到一种方法来比较这些值,因为它们显然是同一家公司。

我想我将不得不先拆分这些名称,然后按字母顺序排列不同的部分。

有没有人以前做过类似的事情,并愿意分享一些代码或功能?

更新: 我找到了一个对字符串中的单词进行排序的函数。如上所述,我可以使用它来检测名称交换。虽然速度很慢......

见:MySQL: how to sort the words in a string using a stored function?

【问题讨论】:

  • “他们显然是同一家公司”我不同意。我听说过的每个国家/地区的法律也是如此。
  • 嗯,这些值来自 2 个不同的黄页之类的来源,它们之间存在类似的差异...有些指南更喜欢使用不同的名称以便于排序,我猜...
  • 这非常模棱两可。是什么定义了这两个字符串实际上是否代表同一个实体?在跳到这样的要求之前,我想对每个数据源的表示语义进行一些分析。
  • 我还比较了邮政编码。一张桌子没有电话号码,否则这当然是比较的最佳方式......我认为比较邮政编码时的误差范围也很低

标签: mysql function compare


【解决方案1】:

如果你的表是MyISAM,你可以运行这个查询:

SELECT  *
FROM    mytable
WHERE   MATCH(name) AGAINST ('+bakery +johnson')

这将找到包含单词bakeryjohnson(可能还有其他单词)的所有记录。

在表上创建FULLTEXT 索引:

CREATE FULLTEXT INDEX
        fx_mytable_name
ON      mytable (name)

将加快此查询。

【讨论】:

  • 谢谢,他们是 InnoDB,但我可以转换... InnoDB 中没有全文搜索?
  • “根本不是约翰逊面包店”哎呀
  • @Tomalak: 可能还有其他一些词
  • 我承认这有点危险。但我也可以检查它们是否相同长度(同时删除空格等)
  • @Dylan:不,MATCHInnoDB 中不起作用。即使没有FULLTEXT 索引,它也可以在MyISAM 中工作。
【解决方案2】:

回到您的解决方案,您可以采用与现代手机解决重复名称冲突类似的方式

当他发现可疑的东西时,您向用户提供选项:

Is this a duplicate? Use our [ Merge ] option

您正在合并 Bakery Johnson,请选择来源/原始项目:

[ Johnson Bakery v ](我的惊人下拉菜单!)

Johnson Bakery 中尚未出现的所有内容都被移植到 Bakery Johnson(例如订单),您还可以显示一个中间屏幕,显示将要合并的内容,或者让用户选择,例如,他想要 Johnson Bakery 的地址信息以及来自两者的订单

这不是你问的自我纠正,但来自用户的协作可能比这里的 AI 更准确。我也喜欢这样的低技术解决方案,所以请告诉我们您最终做了什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多