【问题标题】:How to implement a SIMPLE "You typed ACB, did you mean ABC?"如何实现一个简单的“你输入了 ACB,你是说 ABC 吗?”
【发布时间】:2010-11-08 18:51:13
【问题描述】:

我知道这不是一个直截了当的问题,所以如果您需要我提供有关其范围的更多信息,请告诉我。有一堆问题几乎解决了相同的问题(它们在这里链接),但从来没有完全相同的问题具有相同的范围和目标 - 至少据我所知。

上下文:

  • 我有一个带有 ID3 标签的 MP3 文件 艺术家姓名和歌曲名称。
  • 我有两张表 Artists 和 Songs
  • ID3 标签可能略有偏差(例如 Mikaell Jacksonne)
  • 我正在使用 ASP.NET + C# 和 MSSQL 数据库

我需要将 MP3 与数据库同步。含义:

  1. 用户启动脚本
  2. 脚本浏览所有 MP3
  3. 剧本说“'Mikaell Jacksonne' 'Michael Jackson' YES/NO
  4. 用户选择,我们重新开始

系统可以找到的示例:

在数据库中...

SONGS = {"This is a great song title", "This is a song title"}
ARTISTS = {"Michael Jackson"}

输出...

"This is a grt song title" did you mean "This is a great song title" ?
"This is song title" did you mean "This is a song title" ?
"This si a song title"  did you mean "This is a song title" ?
"This si song a title"  did you mean "This is a song title" ?
"Jackson, Michael" did you mean "Michael Jackson" ?
"JacksonMichael" did you mean "Michael Jackson" ?
"Michael Jacksno" did you mean "Michael Jackson" ?

等等

我从/how-do-you-implement-a-did-you-mean 中阅读了一些文档,这并不是我所需要的,因为我不想检查整个字典。我也不能真正使用网络服务,因为它很大程度上取决于我数据库中已有的内容。如果可能的话,我还想避免与distances 和其他complicated things 打交道。


我可以使用google api(或类似的东西)来执行此操作,这意味着脚本将尝试拼写检查并使用数据库对其进行测试,但我觉得可能有更好的解决方案,因为我的数据库最终可能会对奇怪的歌曲和艺术家非常具体,使拼写检查毫无用处。

我也可以尝试使用Soundex for c# 解释on this post 的内容。

使用常规拼写检查器不起作用,因为我不会使用单词,而是使用名称和“标题”。


所以我的问题是:有没有一种相对简单的方法来做到这一点,如果有,它是什么?

我们将不胜感激。

谢谢!

【问题讨论】:

  • 您正在寻找一个复杂问题的简单答案。鉴于您列出的限制,我怀疑您会找到答案。
  • 我也怀疑,但谁知道...

标签: nlp spell-checking


【解决方案1】:

您想要的是相似性因子。本质上,您希望将您的输入(例如“迈克尔杰克逊”)与您的预期值(“迈克尔杰克逊”)进行比较;如果您对某个期望值的相似度值非常高,则可以询问用户。

这样做的一种方法是将预期值散列到一个完全打包的散列表中。如果你的散列算法正确(是的,这是棘手的一点),每个输入都会散列到最接近的期望值;一旦找到最接近的期望值,您就可以对输入和该期望值运行相似性评估;如果您超过某个阈值,请询问用户。

【讨论】:

  • 我没有想到哈希,但这是真的而且非常聪明!你有关于在哪里寻找这种哈希算法的指示吗?
  • @marcgg:你可以试试谷歌这样的哈希算法;但是,您可能需要针对预期的数据集对其进行大量自定义。我不知道有什么好的参考资料可以从我的脑海中浮现出来……
【解决方案2】:

一个相当简单但相对不准确的系统是比较字符串的字符,并测量用户字符串中不同/缺失/添加的字符数。如果字符数足够少(您可以尝试根据键距离 [查找表] 或类似的方法对差异进行加权),然后询问用户他们是否指的是特定的给定字符串

【讨论】:

  • 这可以作为最后的手段。这意味着我尝试查找完全匹配,然后是其他可能更准确的东西,然后是这个。我敢肯定会有 30% 的匹配,也许更少,但这仍然是一个有趣的想法,谢谢!
  • 这里最大的问题是你如何比较字符,因为“ABCDE”应该与“ACDE”只有一个字符,而不是我的一次旧尝试给出的 4 个字符(可以你知道为什么吗?)
  • 这样做是因为您正在测试字母的确切位置。我想像“相同字母-相同位置:+10,相同字母-不同位置:+1”这样的混合可以提供更强大的东西。或者不。
  • 是的,当我遍历字符串时,我并没有检查是否添加或删除了一个字母。当然,您无法真正判断用户可能偏离了多少个字母。
【解决方案3】:

这是一项不平凡的任务。查看Wikipedia 了解有关处理此问题的算法的更多信息。您已经使用 soundex,但您正在这里寻找其他转换。

【讨论】:

    【解决方案4】:

    这听起来与创建拼写检查器非常相似,最好使用ternary search tree 来完成。该链接使用 Java 作为示例,但数据结构是重要部分。数据结构的行为类似于具有 McWafflestix 提到的属性的哈希。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 2019-12-17
      • 2021-12-01
      • 2011-05-08
      • 1970-01-01
      • 2017-02-02
      相关资源
      最近更新 更多