根据字典分解复合词



我有一个语法,说'A'可以用"'a','aa','aa','aa','aa'代替。(准确地说是梵语语法)。

我想把一个复合词分成它可能的组成部分,例如'samADAna'->['sam+ADAna','sama+ADAna']

lstrep = [('A',('A','aa','aA','Aa','AA'))]

我的字典样本是

['sam','sama','ADAna']

实际的字典是450000个单词的列表。

替换子字符串python显示了一种在所有位置替换'A'之后创建所有可能排列列表的方法。

可以看出,它将提供一份25名成员的名单。在这之后,我在How to split text without space into list of words?根据我的字典推断出复合词中的转折点。

实际上,代码必须运行25次。在这个关键时刻,这不是什么大问题。

但如果我的输入字符串是'samADAnApA',那么排列将是625。代码必须迭代625次。这是一个沉重的记忆和时间成本。

问题-有没有办法将可能的排列限制在字典允许的单词范围内。例如字典没有CCD_ 6。

因此samADAna, samAaDAna, samAADAna等不会被包括在排列中?

我的尝试:

if __name__=="__main__":
    perm = permut(sys.argv[1],lstrep,words) # function permut creates all possible permutations of replacements.
    output = []
    for mem in perm:
        split = infer_spaces(mem) # Code of Generic Human 
        if split is not False:
            output.append(split)
    output = sorted(output,key=len)
    print output

我认为您正在尝试从梵语的joining实现divide规则。(sandhi vichchhed)

现在,据我记忆所及,只有一组规则(这里我们谈论的不是samas,只有sandhi)。就像这里,你说的是:

a/A + a/A = A      //pronounce as if this is hindi/sanskrit

所以,我真的不认为你需要用各种可能的方式来分割单词。拿起你的拆分方程的LHS,例如,你在A拆分单词,新单词的最后一个字符是a/A,下一个字符的第一个是a/A。(或者在这种情况下,由于(小a)音的原因,第一个单词的最后一个字符也不是a)。现在您需要查看字典并查看可能的组合。这可能非常模糊,因为我真的不确定在这种情况下,你将如何区分sam and sama

因此,实际上不需要以所有可能的方式分割单词,只有在适用sandhi-规则的情况下,并且分割的单词在字典中存在。

就像这里,

word = samAdhAna
possible splits:
    sam + adhana      --
    sama + adhana     --
    samA + adhana
    sam + Adhana
    sama + Adhana
    samA + Adhana
    samadh + ana
    samadha + ana
    samadhA + ana
    samadh + Ana
    samadha + Ana
    samadhA + Ana

现在,用--标记的拆分是字典中两个拆分词都存在的拆分。因此,在这个例子中,您实际上总共需要考虑12个案例。

最新更新