2015-02-10 59 views

回答

1

Stemmer能夠處理人工不存在的單詞。你是否願意將它們作爲一組所有可能單詞的元素返回?你怎麼知道這個詞不存在,不應該被退回?

作爲選項:查找所有單詞及其形式的詞典。爲他們每個人找一個幹。將此投影保存爲地圖:(詞幹,所有單詞形式的列表)。所以你可以得到一個給定詞幹的所有單詞形式的列表。

UPD: 如果你需要的所有可能的話,包括不存在的話,我可以提供這樣的算法(它不檢查,只是一個建議):

Porter stemming algorithm。我們需要一個顛倒的版本。

如果直接算法中的規則有一個形式(m>1) E ->(刪除最後一個E),那麼反向規則就是「fork with E」,這意味着我們需要嘗試其他方法。例如,在直接算法probate -> probat中,反過來,我們有兩個備選方案:probat -> { probat, probate }。這些替代方案應分別進一步處理。請注意,這是一個設置的替代品,所以我們將只處理不同的單詞。這樣的規則將具有以下形式:A -> { , B, C },這意味着「用三種替代方式取代結尾A:保持原樣,用B和C」。

Step 5b: (m>1) *L -> { , +L } // Add L if there's L at the end. 
Step 5a: (m>1) -> { , +E } 
     (m=1 and not *o) -> { , +E } // *o is a special condition, it's not *O. 
Step 4: (m>1) *S or *T -> { , +ION } 
     (m>1) -> { , +AL, +ANCE, +ENCE, ..., +IVE, +IZE } 
Step 3: (m>0) *AL -> { , +IZE } 
     (m>0) *IC -> { , +ATE, +ITI, +AL } 
     (m>0) -> { , +ATIVE, +FUL, +NESS } 
Step 2: (m>0) *ATE -> { , ATIONAL } // Replace ATE. 
     (m>0) *TION -> { , +AL } // Add AL at the end. 
     (m>0) *ENCE -> { , ENCI } // Replace ENCE. 
     ... 
     (m>0) *BLE -> { , BILITI } // Replace BLE. 
Step 1c: (*v*) *I -> { , Y } // Replace I. 
Step 1b: (m=1 and *oE) -> { , +D, delete last E and add ING } // *o is a special condition. 
     (*v*c and not (*L or *S or *Z)) -> { , add last consonant +ED, add last consonant + ING } 
     *IZE -> { , IZING, +D } 
     (*v*BLE) -> { , +D, delete last E and add ING } 
     *ATE -> { , ATING, +D } 
     (*v*) -> { , +ED, +ING } 
     (m>0) *EE -> { , +D } 
Step 1a: *I -> { , +ES } 
     *SS -> { , +ES } 
     not *S -> { , +S } 

直線算法不得不選擇第一長的規則。顛倒的算法應該使用所有的規則。

例(直):

Input: PLAYING 
Step 1a doesn't match. 
PLAYING -> PLAY (Step 1b) 
PLAY -> PLAI (Step 1c) 
m=0, so the steps 2-5 don't match. 
Result: PLAI 

反轉:

Input: PLAI 
m=0, so the steps 2-5 are skipped 
Step 1c: 
PLAI -> { PLAI, PLAY } 
Step 1b: 
PLAI -> { PLAI, PLAIED, PLAIING } 
PLAY -> { PLAY, PLAYED, PLAYING } 
Resulting set: { PLAI, PLAIED, PLAIING, PLAY, PLAYED, PLAYING } 
Step 1a: 
PLAI -> { PLAI, PLAIS, PLAIES } 
PLAIED -> { PLAIED, PLAIEDS } 
PLAIING -> { PLAIING, PLAIINGS } 
PLAY -> { PLAY, PLAYS } 
PLAYED -> { PLAYED, PLAYEDS } 
PLAYING -> { PLAYING, PLAYINGS } 
Resulting set: { PLAI, PLAIS, PLAIES, PLAIED, PLAIEDS, PLAIING, PLAIINGS, PLAY, PLAYS, PLAYED, PLAYEDS, PLAYING, PLAYINGS } 

我已經檢查了所有這些話在Michael Tontchev的鏈接。每個人的結果都是「plai」(請注意,該網站不接受大寫輸入)。

+0

感謝您的回答。我在哪裏可以得到這樣一本字典。我正在用PHP編碼 – 2015-02-11 05:59:47

+1

@ eddard.stark,看看[here](http:// stackoverflow。com/questions/741003/a-text-file-with-a-list-of-words)或[here](http://stackoverflow.com/questions/2213607/how-to-get-english-language-word -數據庫)。你只需要一個大的文本文件,該文件將被處理一次以獲得用於將它們存儲在任何本地數據庫(或者像Patricia樹或DAWG的數據結構)中的'(詞幹,單詞列表)對。 – Qualtagh 2015-02-11 07:06:34

+0

非常感謝你 – 2015-02-11 07:34:06

2

顯然不是。許多不同的單詞在被阻止之後可以變成plai:包括玩耍和玩耍。

嘗試在這裏:http://9ol.es/porter_js_demo.html

所以,如果給定普拉伊,它可能來自任何字,這是不確定的。或者你想獲得所有可能的單詞集合嗎?

更新: Qualtagh提到了一些好主意。

+0

是否有可能得到一組可能的單詞來plai? – 2015-02-11 04:31:15

相關問題