【问题标题】:Storing n-grams in database in < n number of tables将 n-gram 存储在 < n 个表中的数据库中
【发布时间】:2010-05-17 09:24:42
【问题描述】:

如果我正在编写一个软件,尝试使用用户之前输入的两个词来预测用户将要输入的词下一个,我会创建两个表。

像这样:

== 1-gram table ==
Token | NextWord | Frequency
------+----------+-----------
"I"   | "like"   | 15
"I"   | "hate"   | 20

== 2-gram table ==
Token    | NextWord   | Frequency
---------+------------+-----------
"I like" | "apples"   | 8
"I like" | "tomatoes" | 12
"I hate" | "tomatoes" | 20
"I hate" | "apples"   | 2

按照这个例子,用户输入“I”,软件使用上面的数据库预测用户要输入的下一个词是“hate”。如果用户确实输入了“hate”,那么软件将预测用户将要输入的下一个单词是“tomatoes”。

但是,这种实现需要为我选择考虑的每个附加 n-gram 提供一个表格。如果我决定在预测下一个单词时要考虑前面的 5 或 6 个单词,那么我需要 5-6 个表,并且每 n-gram 的空间呈指数增长。

仅在一个或两个表中表示这一点的最佳方法是什么,我可以支持的 n-gram 数量没有上限?

【问题讨论】:

    标签: database database-design model schema data-modeling


    【解决方案1】:

    试试两列表格 -

    phrase, frequency
    

    一种优化是对短语中的某些单词进行“规范化”,例如“不是”到“不是”。

    第二个优化是使用 MD5、CRC32 或类似的短语哈希作为键。

    【讨论】:

    • +1 表示哈希。如果您使用的是大型语料库或长字符串,则使用散列将 必不可少 以获得足够的性能。由于不可避免的冲突,您仍然需要保留原始字符串,唉。
    【解决方案2】:

    为什么不将它们全部存储在一张表中?

    Token    | NextWord   | Frequency
    ---------+------------+-----------
    "I"      | "like"     | 15
    "I"      | "hate"     | 20
    "I like" | "apples"   | 8
    "I like" | "tomatoes" | 12
    "I hate" | "tomatoes" | 20
    "I hate" | "apples"   | 2
    

    然后由您的软件决定您为“令牌”传递的内容以及插入新值的时间(即不要插入部分键入的单词)。如果你想变得棘手,你可以有一个额外的单词数列,但我认为实际上不需要(空格数+1是单词数)

    【讨论】:

      【解决方案3】:

      实际上,您可以保持原样,只使用一张桌子。一个二元语法不能等于一元语法,因为二元语法中会有一个空格。类似地,没有三元组等于任何二元组,因为三元组将有两个空格。无止境。

      因此,您可以将所有 1-gram、2-gram 等放入 Token 字段,并且不会发生冲突。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-05
        • 1970-01-01
        • 2021-12-22
        • 2018-08-12
        • 2019-04-01
        • 2016-12-14
        相关资源
        最近更新 更多