【问题标题】:Hyphenation algorithm using Bloom filter使用布隆过滤器的断字算法
【发布时间】:2019-11-14 15:46:37
【问题描述】:

hyphenation algorithms 中可以看到 Bloom 过滤器大放异彩的经典示例。甚至是original paper on Bloom filters中给出的例子。

我不明白如何在断字算法中使用布隆过滤器。

断字算法被定义为接受一个输入词并返回该词可以断字的可能方式。

布隆过滤器是否会同时包含hyph-enationhyphena-tion,并且客户端代码会查询过滤器以查找h-yphenationhy-phenationhyp-henation、...?

原论文是这样说的:

断字示例应用分析

[...] 让我们假设大约有 500,000 个单词要被程序断字,其中 450,000 个单词可以通过应用一些简单的规则来断字。其他 50,000 个单词需要参考字典。可以合理地估计,使用传统的散列编码方法平均需要至少 19 位来表示这 50,000 个单词中的每一个。如果我们假设时间因子 T = 4 是可以接受的,我们从 eq. (9) 散列区域的大小为 2,000,000 位。这对于包含实际核心的哈希区域来说可能太大了。通过使用方法 2,允许的错误频率为 P = 1/16,并通过 T = 2 使用尽可能小的散列区域,我们从等式中看到。 (22) 这个问题可以用小于 300,000 位的散列区域来解决,这个大小很可能适合核心散列区域。如果选择 P 为 1/16,则需要访问磁盘驻留词典,以便在 500,000 个要连字的单词中,大约有 50,000 + 450,000/16 ~ 78,000 个单词,即大约 16% 的情况。与使用完全驻留在磁盘的哈希区域和字典的典型传统方法相比,磁盘访问次数减少了 84%。

【问题讨论】:

    标签: bloom-filter hyphenation


    【解决方案1】:

    对于这种情况,

    • 字典存储在磁盘上,包含所有带有正确断字的单词,
    • Bloom 过滤器只包含需要特殊连字符的键,例如可能是hyphenation 本身,
    • Bloom 过滤器以“可能”或“否”响应。

    那么找出一个单词可能的连字符的算法是:

    word = "hyphenation"; (or some other word)
    x = bloomFilter.probablyContains(word);
    if (x == "probably") {
        lookupInDictionary(word).getHypenation();
    } else {
        // x == "no" case
        useSimpleRuleBasedHypenation(word);
    }
    

    如果 Bloom 过滤器以“可能”响应,则算法必须在字典中执行磁盘读取。

    如果实际上没有特殊规则,布隆过滤器有时会响应“可能”,在这种情况下磁盘 I/O 是不必要的。但这没关系,只要不经常发生(误报率很低,例如 1/16)。

    Bloom 过滤器没有误报,不会因为 有特殊连字符的情况而以“否”响应。

    【讨论】:

    • 好的,所以如果我理解正确的话,Bloom 过滤器本身基本上与实际的连字符无关。它只是用来防止不必要地执行昂贵的操作。
    • 是的,这就是我对这一段的理解。
    猜你喜欢
    • 2012-10-18
    • 1970-01-01
    • 2015-10-25
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多