【发布时间】:2015-07-04 06:42:21
【问题描述】:
我有一个带标签的文本语料库,存储在如下 SQL 表中:
id tag1 tag2 token sentence_id
0 a e five 1
1 b f score 1
2 c g years 1
3 d h ago 1
我的任务是在表格中搜索满足特定条件的标记序列,有时每个标记之间存在间隙。
例如:
我希望能够搜索类似于以下的序列:
- 令牌在
tag1列中的值为a,并且 - 第二个标记与第一个标记相距一到两行,并且在
tag2中具有值g或在tag1中具有b,并且 - 第三个标记应至少相隔三行,并且在
token列中包含ago。
在 SQL 中,这将类似于以下内容:
SELECT * FROM my_table t1
JOIN my_table t2 ON t1.sentence_id = t2.sentence_id
JOIN my_table t3 ON t3.sentence_id = t1.sentence_id
WHERE t1.tag1 = 'a' AND (t2.id = t1.id + 1 OR t2.id = t1.id + 2)
AND (t2.tag2 = 'g' OR t2.tag1 = 'b')
AND t3.id >= t1.id + 3 AND t3.token = 'ago'
到目前为止,每次我在序列中指定一个新标记(例如JOIN my_table t4)时,我只能通过自行加入表来实现这一点,但是对于数百万行,这会变得非常慢。有没有更有效的方法来做到这一点?
【问题讨论】:
-
我认为您的问题过于笼统,您应该将其限制为一两个典型查询,并展示您针对此查询的解决方案。
-
另外:为什么你使用不同DBMS的标签?你不使用特定的系统?
-
@Renzo 已修改,感谢您的建议!
-
非常有趣的问题。如果您在
tag1、tag2和token上有索引,您可能使用(SELECT * FROM my_table WHERE token = 'ago') AS ago之类的子查询并使用您现有的连接方法(看起来真正 对我)在这些上。
标签: sql postgresql