算法:按字符串从数据库中提取关键字

时间:2014-01-18 02:58:38

标签: algorithm postgresql solr information-extraction

例如我们有以下字符串。 “披头士乐队 - 想象一下” 另外,我们在PostgreSQL中有很多艺术家名字。

鉴于该字符串我想使用我的数据库识别艺术家。

我正在寻找最佳,快速的算法/技术来做到这一点。因此,迭代数据库中的所有记录并查找子字符串是不适用的。

字符串可以是“想象 - 披头士乐队”,“想象一下,甲壳虫乐队”。就像Youtube视频中的歌曲名称一样。

Solr,ElasticSearch或其他技术会对您有所帮助吗? 会喜欢这方面的一些极客建议。

2 个答案:

答案 0 :(得分:2)

这个问题有两个部分。困难的部分是识别艺术家和头衔。你有各种各样的变化:

  • Beatles,The - Imagine
  • 甲壳虫乐队 - 想象一下
  • 想象一下 - 甲壳虫乐队
  • 甲壳虫乐队,想象一下
  • 想象一下,甲壳虫乐队
  • 想象一下 - 披头士乐队,

其他人也将包括专辑:

  • 想象 - 想象 - 披头士乐队

如果你将这些作为一个随机错误,那么你将很难处理 - 将这些数据规范化为字段将需要一个“轨道名称”和“艺术家名称”的数据库来尝试匹配有很多猜测。

我要做的就是忽略整个混乱并把它扔到全文搜索引擎上。

test=> select to_tsvector('simple', 'Beatles, The - Imagine');
           to_tsvector           
---------------------------------
 'beatles':1 'imagine':3 'the':2
(1 row)

test=> select to_tsvector('simple', 'Beatles, The - Imagine') @@ to_tsquery('simple', 'Beatles');
 ?column? 
----------
 t
(1 row)

如果您能够将其转换为以字段分隔的规范化数据,那么您的搜索功能将变得更加强大,因为您可以使用setweightts_ranktsvector对字段进行加权匹配与||等串联。

答案 1 :(得分:0)

原则上,如果数据库中的任何记录都包含您的搜索字符串,那么您将不得不搜索数据库中的每条记录。

你可以做的是使用类似Rabin-Karp algorithm的东西同时搜索你的搜索字符串的许多相同长度的版本:“Beatles The”,“The Beatles”。如果你忽略空格和/或标点符号,那么你可以更多地减少传球次数:“甲壳虫乐队”,“甲壳虫乐队”,“披头士乐队”。如果你只计算字母,Craig Ringer的答案中的所有例子都是相同的长度;您可以使用Rabin-Karp

在单个数据库中找到所有匹配项