如何实现简单的“你输入ACB,你的意思是ABC吗?”

时间:2009-07-07 17:35:15

标签: nlp spell-checking

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

背景:

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

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

  1. 用户启动脚本
  2. 脚本浏览所有MP3
  3. 剧本上写着“是'Mikaell Jacksonne''Michael Jackson'是/否
  4. 用户选择我们重新开始
  5. 系统可以找到的示例:

    在数据库中......

    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读了一些文档,这不是我需要的,因为我不想检查整个字典。我也不能真正使用Web服务,因为它在很大程度上依赖于我在数据库中已有的东西。如果可能,我还想避免处理distances和其他complicated things


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

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

    使用常规拼写检查功能无效,因为我不会使用单词而是使用名称和“标题”。


    所以我的问题是:是否有相对这样做的简单方法,如果有,那是什么?

    任何形式的帮助都将受到赞赏。

    谢谢!

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

一个相当简单但相对不准确的系统是比较字符串的字符,并测量用户字符串中不同/缺失/添加的字符数。如果字符数足够少(您可以尝试根据键距离[查找表]或某些情况来加权差异),那么询问用户它们是否意味着特定的给定字符串

答案 2 :(得分:1)

这是一项非常重要的任务。查看Wikipedia以获取有关处理此问题的算法的更多信息。你已经点击了soundex,但是你还在寻找其他的转换。

答案 3 :(得分:1)

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