0

我在 Sqlite 表中有一本书,每行有一个句子。有超过 30k 行/句子,并且此表的格式无法更改(它会破坏太多其他内容)。

我也有几个不同的 ID 跨度,或多或少将书分成几段。它们在列表中的元组中,即 [(0,2), (3,6), (7,10) ...] 或 [(0,3), (4,9), (10,13) ...], ETC。

我需要能够返回包含两个或更多单词的跨度。也就是说,在同一跨度/段落中同时找到“水”和“地”。

我查看了使用 GROUP_CONCANT 组合句子的每组跨度来制作视图,但由于无法附加视图,因此找不到任何方法。

拨打 1000 次选择电话,例如 'SELECT * IN book WHERE ID BETWEEN ? 和 ?和...' 似乎没有效率。

有没有办法用一条语句返回命中的跨度,或者使用临时表来组合它们?

4

1 回答 1

1

如果它们是顺序的(或者您可以强制按 ID 排序以与您的跨度相关联),那么您可以使用 Python 进行分组,只需将任意键应用于每个组,然后将其用作 groupby 的一部分。例如:

from itertools import repeat, izip, chain, groupby
from operator import itemgetter

testdata = [str(i) for i in range(10)]

spans = [(0,2), (3,6), (7,10)]    
groups = chain.from_iterable(repeat(idx, e - s + 1) for idx, (s, e) in enumerate(spans))

for k, g in groupby(izip(testdata, groups), itemgetter(1)):
    words = set(chain.from_iterable(el[0].split() for el in g))
    if words.issuperset(['3', '6']): 
        print words

您将需要修改它如何拆分单词并选择匹配的内容,但它仍然是一种可能的选择。

如果您经常这样做,您可能希望考虑创建一个包含表示段落(而不是句子)的单个列的额外表,并在该列上应用全文索引,这将使将来的查询更容易。您可以利用上面的代码来帮助构建该表。

于 2013-05-22T12:35:44.757 回答