基于字典

时间:2015-12-07 04:28:02

标签: python algorithm dictionary nlp

我的语法表明'A'可以替换为“' A' aa'' aA'' ;了Aa'' AA&#39 ;. (准确地说是梵语语法)。

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

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

我的字典样本是

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

实际字典是450,000个单词列表。

Optionally replacing a substring python已经展示了一种在所有地方替换'A'后创建所有可能排列的列表的方法。

可以看出,它会给出25个成员名单。在此之后,我在How to split text without spaces into list of words?使用Generic Human的代码根据我的字典推断出化合物的中断。

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

但是如果我的输入字符串是'samADAnApA' - 排列将是625.代码将需要625次。记忆和时间都是沉重的代价。

问题 - 有没有办法可以限制字典允许的单词的可能排列。例如字典没有'samA'

因此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

1 个答案:

答案 0 :(得分:0)

我认为您正在尝试在梵语中实施cc中的divide规则。 (变调-vichchhed)

现在,据我记忆,只有一套规则(我们这里不是joining,而是samas)。就像在这里,你说的是:

sandhi

所以,我真的不认为你需要以各种可能的方式分词。拿起你的分裂方程的LHS,例如。您正在a/A + a/A = A //pronounce as if this is hindi/sanskrit 分割单词,新单词是新单词的最后一个字符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个案例。