5

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

语境:

  • 我有一个带有 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 中阅读了一些文档,这并不是我所需要的,因为我不想检查整个字典。我也不能真正使用网络服务,因为它很大程度上取决于我数据库中已有的内容。如果可能的话,我也想避免处理距离和其他复杂的事情


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

我也可以尝试使用Soundex for c#来尝试类似这篇文章中解释的内容。

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


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

任何形式的帮助将不胜感激。

谢谢!

4

4 回答 4

3

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

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

于 2009-07-07T17:43:22.883 回答
1

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

于 2009-07-07T17:47:04.157 回答
1

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

于 2009-07-07T18:02:37.947 回答
1

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

于 2009-07-07T18:31:58.497 回答