已遷移到我新博客,閱讀體驗更佳token:NLP之詞形還原
完整代碼實現放在我的github上:click me
一、任務描述
- 形態還原算法:
- 輸入一個單詞
- 如果詞典里有該詞,輸出該詞及其屬性,轉4,否則,轉3
- 如果有該詞的還原規則,並且,詞典里有還原后的詞,則輸出還原后的詞及其屬性,轉4,否則,調用<未登錄詞模塊>
- 如果輸入中還有單詞,轉(1),否則,結束。
二、技術路線
- 加載dic_ec.txt詞典,詞典存儲着英到漢的映射,對於輸入的單詞,如果dic_ec.txt詞典中包含這個單詞的映射則直接輸出。下面給出dic_ec.txt內容的基本形式:
//gbk編碼,以\t分隔
homokaryosis none. 同核性, 同核現象
homokaryotic adj. 同核體的
homokurtic none. 等峰態性
homolanthionine none. 高羊毛氨酸
- 考慮到有些單詞本身就是原形,也是其它單詞的形態變換,所以在設計時決定把所有可能的結果都輸出。在完成詞典映射后再檢查該單詞是否能通過變換規則轉換得到。我們知道英文單詞的形態變換存在有規律的和無規律的變換,首先看有規律的變換,動詞的規律變換形式有下面4條規則:
規則1. *ves --> *f/*fe
規則2. *ies --> *y
規則3. *es --> *
規則4. *s --> *
名次的規律變換形式有下面9條規則:
//第三人稱單數
規則5. *ies --> *y
規則6. *es --> *
規則7. *s --> *
//現在進行時
規則8. *??ing --> *?
規則9. *ying --> *ie
規則10. *ing --> */*e
//過去時、過去分詞
規則11. *??ed --> *?
規則12. *ied --> *y
規則13. *ed --> */*e
通過在程序中寫入這些規則來對單詞形態進行還原,而無規則的形態變換只能通過預先建立好的詞庫來完成詞形形態映射。在程序中通過加載irregualr nouns.txt對名詞進行還原,加載irregualr verbs.txt對動詞進行還原。下面分別給出這兩文件中的內容形式:
irregular nouns.txt的內容形式:
//gbk編碼,每行的第一個詞是原形,后面的是變換形態,以\t分隔
grief griefs
roof roofs
gulf gulfs
grief griefs
irregualr verbs.txt的內容形式:
//gbk編碼,每行的第一個詞是原形,后面的是變換形態,以\t分隔
bear bore borne born
alight alighted alit alighted alit
arise arose arisen
awake awoke awaked awoken awoke awaked
如果找到了還原映射,則在dic_ec.txt詞典中查找還原后的單詞並輸出結果。
- 若最終該單詞沒有檢索到結果則把他登記到單詞缺失詞典missing words.txt中。
三、數據說明
- 英漢詞典dic_ec.txt,名詞的不規律變換詞典irregualr nouns.txt,動詞的不規律變換詞典irregualr verbs.txt,這幾個數據詞典的編碼以及內容形式都已在技術路線中給出,此處不再贅述。
四、遇到的問題及解決方案
- 程序實現過程中唯一遇到的問題就是文件編碼和分隔符的問題,最后用vim把用到的3個數據詞典統一設置成gbk編碼,以\t進行分隔,方便程序統一讀入處理。
五、性能分析
- 下面是性能單詞查詢的耗時截圖,平均不超過0.001s:
六、運行環境
- 將token.exe與dic_ec.txt,irregualr nouns.txt,irregualr verbs.txt,missing words.txt放在同一個目錄下,然后點擊token.exe即可正確運行程序。