代码之家  ›  专栏  ›  技术社区  ›  marcgg

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

  •  4
  • marcgg  · 技术社区  · 16 年前

    我知道这不是一个直截了当的问题,所以如果你需要我提供更多关于范围的信息,请告诉我。有很多问题几乎都是针对同一个问题的(它们在这里有联系),但从来没有一个完全相同的问题具有相同的范围和目标——至少据我所知。

    语境:

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

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

    1. 用户启动脚本
    2. 脚本浏览所有MP3
    3. 剧本上说 “Mikael Jacksonne”“Michael Jackson”是/否
    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 这不是我需要的,因为我不想查整本字典。我也不能真正使用Web服务,因为它很大程度上依赖于我的数据库中已有的内容。如果可能的话,我也想避免与 distances complicated things .


    我可以使用 google api (或类似的事情)这样做,意味着脚本将尝试拼写检查并用数据库测试它,但我觉得可能有更好的解决方案,因为我的数据库可能最终会被一些奇怪的歌曲和艺术家具体化,使拼写检查毫无用处。

    我也可以尝试一些类似的解释 on this post 使用 Soundex for c# .

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


    所以我的问题是:有没有 相当地 做这个的简单方法,如果是的话,是什么?

    任何帮助都将不胜感激。

    谢谢!

    4 回复  |  直到 15 年前
        1
  •  3
  •   Paul Sonier    16 年前

    你想要的是一个相似的因素。本质上,您希望将您的输入(“micheal-jackson”,例如)与您的预期值(“michael-jackson”)进行比较;如果您的期望值与某个期望值的相似性非常高,则可以询问用户。

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

        2
  •  1
  •   Sukasa    16 年前

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

        3
  •  1
  •   No AI now No AI ever    16 年前

    这是一项非常重要的任务。退房 Wikipedia 有关处理此问题的算法的更多信息。你已经找到了Soundex,但是这里还有其他的转换。

        4
  •  1
  •   Graphics Noob    16 年前

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