以百万行搜索字符串中的任何单词

时间:2015-11-25 15:01:21

标签: sql algorithm

我有一组50k值表示X.每个值我想要与一组10k值比较说Y.如果X出现在它匹配的字符串Y中的任何位置。

因此X中的每个值都要检查Y中的每个值,如果匹配则分配X.

完成此任务的最佳方法是什么。它是数据挖掘项目所必需的。

我将数据加载到MS Access数据库中。 然后使用vba程序   拿每个X.如果匹配则更新Y(例如'%X%')但它是一个永无止境的过程。列已编制索引但无效。

是否有任何算法或步骤将其简化为逐步过程并更快地完成映射?

如果除了下面给出的答案之外还有其他可用选项,请告知我们。我将更多地解释情景

Table1.Data

sentense1
sentense2
sentense3
sentense4
sentense5
sentense6
-
-
-
Sentense100k

Table2.Phrase(表示多个单词)

Phrase1
Phrase2
Phrase3
Phrase4
Phrase5
-
-
-
Phrase 100k

要检查Phrase1是否有Sentense1 to Sentense100k完全匹配的短语,短语匹配,Phrase1中的最大单词匹配等等,并根据最佳匹配创建地图(理想情况下)在句子中任何地方都可以使用的确切短语)

表3输出

   Data                    Best Possible Phrase    Second Best Phrase(Optional)
    Sentense1               Phrase1000             Phrase50k 
    Sentense2               Phrase10               Phrase70k

请让我知道执行此操作的任何工具和逻辑。我在SQL中尝试的逻辑 1.

Select A.Data,B.Phrase from Table1 A left join Table2 B on A.Data Like '%' + B.Phrase + '%'

2

检查sentense中可用短语中的任何单词。所以用%word替换所有空格,如word1%word2%word3。然后查询为

A.Data Like '%' + B.Phrase + '%' which is
A.Data Like '%word1%word2%word3%'

但完成这么多数据的任务需要几天时间。

任何易于使用的工具,索引方法,查询都会有所帮助。下面给出的答案对我来说似乎太技术化了。请指导

1 个答案:

答案 0 :(得分:1)

您可以在线性时间内构建后缀树(您可以在线查找后缀树),在X和Y中所有字符串的串联中,使用特殊的唯一符号结束每个字符串。

然后对于X中的每个字符串Xi,在后缀树(Xi的线性时间长度)中查找它,并将Xi分配给Y中的每个字符串,该字符串位于以Xi结尾的子树中的某个位置。

这是Xi指定给Y的字符串数的线性时间。

因此,您可以获得最佳的O(N + k)时间算法,其中:

  • N是X和Y中所有字符串的总长度,
  • 和k是X中查询字符串与Y中目标字符串之间的匹配总数。