自由格式文本再次在数据库中找到

时间:2013-12-10 02:20:04

标签: c# sql-server algorithm tsql

我的任务是将自由格式文本与数据库中的数据相匹配。 我的意思是自由形式,它是一个文本框,有人可以输入任何东西。在大多数情况下,这些条目是有效的。我想从一个类似于输入内容的表中找到一个值列表。 在你提出问题之前,我无法控制所述文本框,也无法控制输入文本框的人。 我在寻找技术,而不是特定的技术。

我尝试过的事情:

  • 清除标准和列表中的常用字词。即(the,of,in等)
  • SOUNDEX函数在sql中,它非常弱,并且不太有帮助。
  • Levenshtein Distance算法,对结果非常满意,但仍需要大量修饰。

例如我有这个清单:

  • 霍比特人:意想不到的旅程
  • 霍比特人:史矛革的荒凉
  • 霍比特人:在那里又回来了
  • 钢铁侠3
  • 卑鄙的我2
  • 快速&愤怒6
  • 怪兽大学
  • 饥饿游戏:着火......
  • 钢铁侠
  • 重力
  • 雷神:黑暗世界
  • The Croods
  • 第二次世界大战

用户输入可以是:

  • hobit意外的journ
    • 'hobit'一词拼写不正确
    • 预期结果:
      • 霍比特人:意想不到的旅程
      • 霍比特人:在那里又回来了
      • 霍比特人:史矛革的荒凉
  • 饥饿游戏
    • 预期结果:
      • 饥饿游戏:着火......

我想我想问的是我可以使用其他方法来计算这些结果。我的堆栈是.Net 4.0和MSSQL 2008 R2

1 个答案:

答案 0 :(得分:1)

我会尝试如下算法:

  • 来自标准和列表的常用词。 (the,of,in等)
  • 对于每个标准词检查它是否包含在列表的条目中
    • 如果已包含,请为此标准字分配一些分数/值
    • 如果不包括在内,请检查标准单词与您要检查的列表的enrty中的任何单词之间的Levenshtein距离
      • 然后为您找到的最低Levenshtein距离指定分数/值(也许最好忽略任何高于3/4的Levenshtein距离)
  • 当您检查了所有标准字时,尊重列表的当前条目,检查当前条目中有多少单词未包含在标准中,并为每个单词分配负分数/值
  • 总结所有得分/值:现在,对于列表中的单个条目,您可以获得这些条件的单个得分/值

对列表中的任何条目重复此操作。

如果您实际分析的数据是电影标题:

  • 你应该添加一些修饰符,比如在最近的电影中使用值/得分的乘数。
  • 你可以通过检查2个列表来加快速度:一个搜索最多/最近的电影,另一个列表包含所有其他标题(如果你通过查看第一个列表获得足够的命中,你可以跳过检查第二个清单)