我在Sqlite表中有一本书,每行有一句话。有超过30k行/句子,这个表的格式不能改变(它会破坏太多的其他东西)。
我还有几个不同的I跨度,或多或少地将这本书分成了几个段落。它们是列表中的元组,即(0,2),(3,6),(7,10) ...或(0,3),(4,9),(10,13) ...等。
我需要能够返回包含两个或更多单词的跨度。也就是说,在相同的跨度/段落中找到“水”和“土”在一起。
我查看了使用GROUP_CONCANT组合句子的每组跨度来制作视图,但无法找到方法,因为视图不能被附加。
进行数千次select调用,如“SELECT* IN book WHERE ID BETWEEN ? AND ?AND...”似乎效率不高。
有没有一种方法可以用一条语句返回命中的跨度,或者使用临时表组合它们?
发布于 2013-05-22 20:35:45
如果它们是连续的(或者您可以强制按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您将需要修改它如何拆分单词和选择匹配的内容,但它仍然是一个可能的选项。
如果您经常这样做,您可能希望考虑创建一个额外的表,其中包含表示段落(而不是句子)的单个列,并在该列上应用full text index,这将使以后的查询更容易。您可以利用上面的代码来帮助构建该表。
https://stackoverflow.com/questions/16690814
复制相似问题