我有一个语法,说'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个案例。