2015-12-07 43 views
3

我有一個語法,說'A'可以用'A','aa','aA','aa','AA'替換。 (梵文語法準確)。基於字典的打破化合物

我想將複合詞分解爲其可能的組成部分,例如, 'samADAna' - >['sam+ADAna','sama+ADAna']

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

我的字典樣品

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

實際字典45萬個單詞列表。

Optionally replacing a substring python已經示出了在所有地方替換'A'之後創建所有可能排列的列表的方式。

可以看出,它會給出25個成員列表。在此之後,我使用Generic Human的代碼How to split text without spaces into list of words?來根據我的字典推斷化合物的中斷。

實際上,代碼必須運行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 

回答

0

我認爲你正試圖從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個案例。