ICTCLAS代碼學習筆記之CsegGraph類

CsegGraph類的相關筆記,這個類爲詞圖類,主要是詞的有向圖。提供兩個核心函數,一個是原子切分,一個是生成詞圖。爲了保存相關的信息,有三個成員變量m_sAtom,m_nAtomLength和m_nAtomPOS分別存儲句中的詞(字符串)、每個詞的長度(字符串長度)及該詞的詞性。由於都是預定義大小的buffer,因此還需要一個無符號整型變量m_nAtomCount來記錄切分後詞的個數。另外,在粗分時可能產生的多個切分結果存儲在一個動態數組CdynamicArray類的對象m_segGraph中。
這裏的三個成員變量都是預定義大小的buffer。句子長度不超過2000個字符,而且詞長不超過200。如果改用vector來存儲則可以避免這種預定義在某些極端情況下造成訪問越界的情況。可以考慮用一個vecotr<struct{}>來存儲,其中結構體只需要兩個變量,一個是string類型的詞串,一個是其詞性
nPOS,而原來需要的詞長這個屬性string本身就可以提供了。
詞圖要求爲行優先存儲。原子切分這個環節,原始的版本判斷比較簡單,將句子起始符號和結束符號當作一個整體切開,如果讀入的類型是漢字(CT_CHINESE)、索引(CT_INDEX)、分割符(CT_DELIMITER)或者其他(CT_OTHER)則切開成一個單獨的結點。否則(就是數字、單字節字符或者字母),如果類型相同則連在一起,否則就切開成單獨的原子結點。將這些粗分好的結果分別存入三個成員變量中,而詞性一行的值就直接爲charType函數返回的結果,只是一個初步的判斷。目前版本的函數中只會重置m_sAtom和m_nAtomLength而m_nAtomPOS在結束位沒有相應置空,目前不會引起bug。
需要說明的是,原子切分這個環節,對於由漢字組成的數詞串都切開了而在後面並不一定都能很好的合起來,一方面是概率競爭不過一方面是判斷數詞串的函數有不全面的部分。另外,由於我修改的版本引入了兩個新的類型,因此在原子切分時需要特別處理一下。
GenerateWordNet函數根據核心詞典將原始的句子生成詞圖並存儲在m_segGraph中。首先會將句子進行原子切分,然後利用詞典中的詞及詞性詞頻信息來置相應的權重值。第三個參數bOriginalFreq的默認取值爲flase,當這個值爲false時爲非原始的頻率值,一般採用默認值最大的或者0來設置,具體規則見後。如果爲true則是利用詞典中獲取的頻率值來做相應的設置。
對於粗切好的每個原子結點,在非原始頻率的情況下,如果類型爲漢字,則設置詞圖,其value值取log最大頻率,詞性爲0即未知狀態,詞本身也不需要存儲;如果爲其他類型,則需要額外判斷一下是不是一些特別的類型,比如說CT_INDEX、CT_NUM和CT_SINGLE_NUM都被判斷爲未處理數,設置相應的詞性-27904及value值(0),分割符爲30464而value值爲最大頻率等,不一一列舉。value值爲0而詞性爲修改後結果。
第二步詞圖生成是根據已有的詞典,會有一個規則是不要把“月”和“份”切開,這個不太合時宜,呵呵。然後對於粗分後的每個詞,如果在詞典中找到最大匹配,則需要重新估算其頻率值,同樣的有一個對於組合數詞的判斷。如果生成的結果只有一個詞性則更新value值時同時置這個明確的詞性,否則只更新value。這一步是個最大匹配的過程,而且每個匹配的中間部分都會被記錄下來。(粗分結果),在其中還會有一個關於時間詞串的擴展規則,也不太合時時宜,主要是針對類似“1年內、1999年末”這種詞,將末尾的諸如“末內中底前間初”的詞處理一下。
詞圖類CSegGraph的總結:
根據論文,這是第五層和第四層、第三層的HMM過程,非常重要,是後續工作的基礎。針對數詞串的處理還不夠完美,考慮是換個地方處理還是重新完善一下規則。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章