我正在python中构建一个lemmatizer。因为我需要它来实时运行/处理相当大量的数据处理速度 是至关重要的。 数据:我有所有可能的后缀链接到可以组合的所有单词类型。另外,我有一些与其wordtype(s)和lemma(s)相关联的词形。该程序将一个词作为输入并输出其引理。 word = lemmafrom + suffix
例如(注意:虽然这个例子是用英语给出的,但我没有为英语构建一个lemmatizer):
字:禁止
lemmaform:禁止
后缀:ing
引理:禁止我的解决方案:
我已将数据转换为(嵌套)dicts:
suffixdict : {suffix1:[type1,type2, ... , type(n)], suffix2:[type1,type2, ... ,
type(n)]}
lemmaformdict : {lemmaform:{type1:lemma}}
1)查找链接到的所有可能的后缀和单词类型。 如果最长的后缀长度为3个字符,则程序会尝试将“ing”,“ng”,“n”与键中的键匹配 suffixdict。如果键存在,则返回一个值(一组单词类型)。
2)对于每个匹配的后缀,搜索dict中的引理。 如果存在lemmaform,则返回wordtype。
3)最后,程序尝试交叉步骤1)和2)中产生的单词类型,如果交集是 成功的它会返回单词的引理。
我的问题:从速度的角度来看,我的问题能有更好的解决方案吗? (无视在字典中保留频繁的单词和词条的选项) 帮助很多。
答案 0 :(得分:6)
这对于有限状态传感器来说是一个很好的应用。为什么?因为它们允许您有效地进行字符串重写(与输入的大小成线性关系)。考虑下面的传感器:
它接受一个字符串作为输入,并在给定输入字符序列的情况下检查是否存在从初始状态(此处为0)到最终状态(分别为10,12和17)的路径。如果它达到最终状态,它产生适当的输出,例如(禁止,输入)如果输入是“禁止”。
我不知道你是否有任何关于有限状态自动机的背景知识。如果没有,试一试 - 值得付出努力。 :) Tries是一种特殊的有限状态自动机(上面的样本传感器是一个特里),所以它们可能是一个好的开始。
答案 1 :(得分:2)
考虑使用非确定性 trie automaton覆盖整套已识别的后缀,但向后分析该单词。作为非确定性意味着机器可以同时处于多个状态,并且如果任何这些状态正在接受,则整个机器处于接受状态。
初始状态将是一个接受状态,因此它可以识别无后缀(如英语be
)。从初始状态开始,转换()
,('e', 'z', 'i')
,('e', 'd', 'a')
和('e', 'v', 'o')
都会到达接受状态,您不必担心冲突{ {1}}使用NFA时。
从最初状态开始,每个单词的“字符”都向后输入。每次机器处于接受状态时,在'e'
中查找单词的剩余部分,并保留所有结果。然后处理继续,直到机器的状态为空(不仅仅是不接受)。
在这一点上,一路上指出的引理的总选择导致了从上下文中删除的那个词的可能解释(并且应该总是一个小数字)。
确切地说,如何实施NFA将决定性能。一旦构造,NFA就可以转换为DFA,这样机器在任何给定时间只有一个状态,这样可以帮助提高性能,而不会使机器结构复杂化。在缺点方面,您必须使用单个字符级别的输入,这对Python来说可能会降低性能。 (但如果性能 宝贵,也许你应该切换到C ++。)