【问题标题】:Building a lemmatizer: speed optimization构建词形还原器:速度优化
【发布时间】:2012-03-23 17:04:39
【问题描述】:

我正在用 python 构建一个词形还原器。因为我需要它实时运行/处理相当大量的数据,所以处理速度 是本质。 数据:我有所有可能的后缀,这些后缀链接到它们可以组合的所有单词类型。此外,我还有与它们的 wordtype(s) 和 lemma(s) 相关联的引理形式。该程序将一个单词作为输入并输出其引理。 word = lemmafrom + suffix

例如(注意:虽然示例是用英语给出的,但我并没有为英语构建词形还原器):

词:禁止

引理形式:禁止

后缀:ing

引理:禁止

我的解决方案:

我已将数据转换为(嵌套)字典:

suffixdict : {suffix1:[type1,type2, ... , type(n)], suffix2:[type1,type2, ... ,
type(n)]}    
lemmaformdict : {lemmaform:{type1:lemma}}

1) 找到所有可能的后缀和它们所链接的单词类型。 如果最长可能的后缀是 3 个字符,程序会尝试将 'ing'、'ng'、'n' 匹配到 后缀。如果键存在,则返回一个值(一组单词类型)。

2) 对于每个匹配的后缀,从字典中搜索引理形式。 如果 lemmaform 存在,则返回 wordtypes。

3) 最后,程序尝试与步骤 1) 和 2) 中产生的词型相交,如果相交是 成功则返回单词的引理。

我的问题:从速度的角度来看,我的问题是否有更好的解决方案? (忽略在字典中保留常用词和引理的选项) 非常感谢您的帮助。

【问题讨论】:

    标签: python optimization nlp lemmatization


    【解决方案1】:

    这将是有限状态传感器的绝佳应用。为什么?因为它们允许您有效地进行字符串重写(在时间上与输入的大小成线性关系)。考虑以下简单的传感器:

    它将一个字符串作为输入,并根据输入字符序列检查是否存在从初始状态(此处为 0)到最终状态(分别为 10、12 和 17)的路径。如果它达到最终状态,它会产生适当的输出,例如(forbidd, ing) 如果输入是“禁止的”。

    不过,我不知道您是否有任何关于有限状态自动机的背景知识。如果没有,请尝试一下——这将是值得的。 :) Tries 是一种特殊的有限状态自动机(上面的示例转换器是 trie),所以它们可能是一个好的开始。

    【讨论】:

    • (Forgiv, e) 我的画质太差了……有没有办法增强它?
    • +1:谢谢你的想法。我以前没有任何 FST 经验,但我一定会试一试。
    【解决方案2】:

    考虑使用非确定性 trie automaton 覆盖所有已识别的后缀,但向后分析单词。非确定性意味着机器可以同时处于多个状态,并且如果其中任何一个状态正在接受,则机器作为一个整体处于接受状态。

    初始状态将是一个接受状态,因此它不能识别任何后缀(如英语中的be)。例如,从初始状态()('e', 'z', 'i')('e', 'd', 'a')('e', 'v', 'o') 都将到达接受状态,您不必担心在使用 NFA 时会出现冲突的'e's。

    从初始状态开始,每个单词的“字符”被向后输入。每次机器进入接受状态时,都会在您的lemmaformdict 中查找单词的剩余部分,并保留所有结果。然后继续处理,直到机器的状态为空(不仅仅是不接受)。

    在这一点上,沿途指示的所有引理选择导致从上下文中删除的单词的可能解释(并且应该始终是一个小数字)。

    您实施 NFA 的具体方式将决定性能。 NFA 可以在构建后转换为 DFA,因此机器在任何给定时间都只有一个状态,这样可以提高性能而不会使机器的构造复杂化。不利的一面是,您必须在单个字符级别上处理输入,这对于 Python 可能会降低性能。 (但如果性能是那么宝贵,也许你应该切换到 C++。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      • 2018-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-02
      相关资源
      最近更新 更多