【问题标题】:Python Sqlite - Select Only Spans of Rows with Multiple WordsPython Sqlite - 仅选择具有多个单词的行的跨度
【发布时间】:2013-05-22 11:40:47
【问题描述】:

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

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

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

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

进行 1000 次选择调用,例如 'SELECT * IN book WHERE ID BETWEEN ?和 ? AND...' 似乎效率不高。

有没有办法通过单个语句返回命中的跨度,或者使用临时表将它们组合起来?

【问题讨论】:

    标签: python sqlite


    【解决方案1】:

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

    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,这将使以后的查询更容易.您可以利用上面的代码来帮助构建该表。

    【讨论】:

    • 谢谢。让我处理一下这个问题,我会回来的。关于添加带有段落的新表,我想避免这种情况,因为它会大大增加每个段落表的数据库大小。添加 5 个表后,数据库将扩大 5 倍。
    • @Tim 应用了 FTI,它会大五倍多。这是你面临的权衡。
    猜你喜欢
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    相关资源
    最近更新 更多