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

jon*_*ny3 6 c# t-sql sql-server algorithm

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

我尝试过的事情:

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

例如,我有这个列表:

  • 霍比特人:意外旅程
  • 霍比特人2:史矛革之战
  • 霍比特人:又回来了
  • 钢铁侠3
  • 卑鄙的我2
  • 速度与激情6
  • 怪兽大学
  • 饥饿游戏:星火燎原
  • 钢铁之躯
  • 重力
  • 雷神:黑暗世界
  • 疯狂原始人
  • 第二次世界大战

用户输入可以是:

  • hobit意外的journ
    • "hobit"这个词拼写不正确
    • 预期结果:
      • 霍比特人:意外旅程
      • 霍比特人:又回来了
      • 霍比特人2:史矛革之战
  • 饥饿游戏
    • 预期结果:
      • 饥饿游戏:星火燎原

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

Max*_*Max 1

我会尝试如下的算法:

  • 标准和列表中的常用词。(该、的、在等)
  • 对于每个条件单词检查它是否包含在列表的条目中
    • 如果包含,请为此条件词分配一些分数/值
    • 如果未包含,请检查条件单词与您要检查的列表条目中的任何单词之间的编辑距离
      • 然后为您找到的最小编辑距离分配一个分数/值(也许最好忽略任何高于 3/4 的编辑距离)
  • 当您检查了所有符合列表当前条目的条件单词后,请检查当前条目中有多少单词未包含在条件中,并为每个单词分配一个负分数/值
  • 总结所有分数/值:现在您针对列表中的单个条目获得了这些标准的单个分数/值

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

如果您有效分析的数据是电影标题:

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