tn文字分析語言 四 實現自然語言計算器

2021-09-08 18:10:13 字數 4085 閱讀 1705

tn是desert和tan共同開發的一種用於匹配,轉寫和抽取文字的語言。直譯器使用python實現,**不超過1000行。

三平方加上四平方

如果2乘以3大於4的平方且3>8,那麼輸出5+4,否則輸出12

如果今天下雨,則傳送微博

3.4的7次方加上五分之一

3.4*2.7

二百八十除以五分之一

三點五乘以三十七

二十七+15*15

十四點五的平方加上八十三除以三點五

基本的思路,是將整個文字,轉換為乙個python的表示式,傳遞給python的eval函式執行。這是一種取巧的辦法,如果需要,可以修改引擎,實現自定義的指令碼解析器。

下面的**定義了計算符,非常容易理解:

#%include% rules/cnext

add = (/加上?|\+|+/ : /+/) ;

sub = (/減去?|\-|-/ : /-/);

mul = (/乘以?|\*|×/ : /*/);

div = (/除以?|/|÷/ : ///);

pow2 = (/的?平方/ : /**2/);

pow3 = (/的?立方/ : /**3/);

pown= (/的?/ : //) $(digit) (/次方/ : /**/) : $3 $2 $1;

divpow = $(digit) $(divpow0) $(digit) ;

powx= $(pow2) | $(pow3) | $(pown);

pow = $(digit) $(powx);

#%include% rules/cnext引入了外部的乙個規則檔案,這個檔案定義了中文和數字的表達方法。因此在本規則中,可直接引用cnext檔案中定義的規則。

順便指出,只要保證規則名稱一致,通過更換為英語或其他語言的數字表達,就可以在不修改本指令碼的情況下方便地讓規則支援其他語言的計算功能

or = (/或/ : / or /);

and = (/且/ : / and /);

not = (/不是/ : / not /);

equal = (/等於|=/ : /=/);

bigger = (/大於|>/ : />/);

less = (/小於|

值得一提的是,我們將邏輯轉換成了or and 和not, 這是為了能夠轉寫

addsub0=  $(add) | $(sub) ; 

logic0 =$(or) | $(and) ;

divpow0 = $(mul) | $(div);

equalcheck = $(bigger) |$(less) | $(noequal);

operator= $(addsub0) | $(equalcheck) | $(logic0);

低優先順序的表示式可以表示如下:

addsub= $(noterminator) $(operator) $(noterminator);

由於乘除和n次方的的優先順序比加減和邏輯運算子優先順序高,所以我們將運算子分為兩類:

終結符

terminator   = $(digit) | $(ifelse) | $(pow) | $(divpow);
非終結符

#%order% 28

noterminator = $(terminator) : "eval(m.rstr)" | $(addsub) : "eval(m.rstr)";

此處需要解釋指令碼的含義,

三平方加上四平方

匹配路徑如下

todo

最後eval(32+42),結果為5

如果希望支援計算類似'3加5的和乘以3'的表示式,那麼terminator表示式需要這樣寫:

terminator   = $(digit) | $(ifelse) | $(pow) | $(divpow) | $(function)

| $(noterminator) $(add) $(noterminator) $(addresult)

| $(noterminator) $(sub) $(noterminator) $(subresult);

但是,注意第二條子表示式

$(noterminator) $(add) $(noterminator) $(addresult)

$(noterminator)又引用了terminator,因此會導致無窮遞迴。

目前還沒有找到合適的方法解決這個問題。

#計算引擎

#嘗試解決 三點五乘以八點三的功能

#%include% rules/cnext

add = (/加上?|\+|+/ : /+/) ;

sub = (/減去?|\-|-/ : /-/);

mul = (/乘以?|\*|×/ : /*/);

div = (/除以?|/|÷/ : ///);

pow2 = (/的?平方/ : /**2/);

pow3 = (/的?立方/ : /**3/);

pown= (/的?/ : //) $(digit) (/次方/ : /**/) : $3 $2 $1;

result= (/的?結果/);

addresult0= (/的?和/);

subresult0= (/的?差/);

addresult = $(result) $(addresult0);

subresult = $(result) $(subresult0);

addsub0= $(add) | $(sub) ;

logic0 =$(or) | $(and) ;

divpow0 = $(mul) | $(div);

equalcheck = $(bigger) |$(less) | $(noequal);

operator= $(addsub0) | $(equalcheck) | $(logic0);

divpow = $(digit) $(divpow0) $(digit) ;

powx= $(pow2) | $(pow3) | $(pown);

pow = $(digit) $(powx);

#functions

print = (/列印/ : /print/);

send = (/傳送/ : /send/);

functions = $(print) | $(send);

function = $(functions) $(noterminator) : "invoke(m[0].rstr,m[1].rstr)";

addsub= $(not) $(noterminator)

| $(noterminator) $(operator) $(noterminator);

terminator = $(digit) | $(ifelse) | $(pow) | $(divpow) | $(function);

#暫時無法分析 3加5的和乘以3,因為會造成迴圈遞迴,從左向右推導不可行

# | ) $(add) $(noterminator) $(addresult)

# | $(noterminator) $(sub) $(noterminator) $(subresult);

#%order% 28

noterminator = $(terminator) : "eval(m.rstr)" | $(addsub) : "eval(m.rstr)";

or = (/或/ : / or /);

and = (/且/ : / and /);

not = (/不是/ : / not /);

equal = (/等於|=/ : /=/);

bigger = (/大於|>/ : />/);

less = (/小於|

tn文字分析語言 四 實現自然語言計算器

tn是desert和tan共同開發的一種用於匹配,轉寫和抽取文字的語言。直譯器使用python實現,不超過1000行。三平方加上四平方 如果2乘以3大於4的平方且3 8,那麼輸出5 4,否則輸出12 如果今天下雨,則傳送微博 3.4的7次方加上五分之一 3.4 2.7 二百八十除以五分之一 三點五乘...

tn文字分析語言 四 實現自然語言計算器

tn是desert和tan共同開發的一種用於匹配,轉寫和抽取文字的語言。直譯器使用python實現,不超過1000行。三平方加上四平方 如果2乘以3大於4的平方且3 8,那麼輸出5 4,否則輸出12 如果今天下雨,則傳送微博 3.4的7次方加上五分之一 3.4 2.7 二百八十除以五分之一 三點五乘...

統計自然語言處理 文字分類

文字表示有向量空間模型,片語表示法,概念表示法 目前文字通常採用向量空間模型表示 向量空間模型 vsm 給定乙個文件d t1,w1 t2,w2 tn,wn d符合以下兩條約定 1 各個特徵項tk 1 k n 互異 即沒有重複 2 各個特徵項tk無先後順序關係 即不考慮文件的內部結構 在以上兩個約定下...