?? read me.txt
字號:
語言模型訓練:
類HMM
Add_delta_train 第一個參數為訓練函數名,第二個函數為lambda數
先對訓練語料統計所有狀態跳轉、狀態到輸出的出現頻率。再對它們進行Add_delta平滑。在計算概率前,需要先對概率矩陣初始化為一個最小值。
Hold_out_train 第一個參數為訓練函數名,第二個為訓練集占整個訓練語料的比例
分別對訓練集和留存集的數據統計狀態跳轉、狀態到輸出的出現頻率。然后統計訓練集中某個狀態跳轉(或狀態到輸出)的頻率,用一個map<int,vector<node>>來儲存。Int是出現頻率,node是該點在訓練集中的位置。然后對照map,在留存集中找到相應的點,并計算概率。
但是這里有一點值得注意:留存平滑求得的是共現概率,而不是HMM所假設的條件概率。嘗試用p(w,pos)/p(pos)來取代。
AllSeg 全切分函數,參數為要切分的句子
typedef struct { typedef struct{
int Pre_NodeId; string str;
int Pre_TagId; int start; //該詞在整個句子中的起始位置
double Score; int end; //該詞在整個句子中的結束位置
}TagNode; TagNode * tagnode;
}WordNode;
用兩個for循環嵌套找到所有在詞典中存在的詞的切分,把每個詞都按照WordNode的格式儲存。
ViterbiDecoder 韋特比解碼
對于AllSeg分割產生的Words向量,通過找到每個點的后繼點,同時計算它們之間的跳轉概率以及狀態到輸出的概率。并將每個前驅到該點的某一個狀態的概率最大值及路徑予以保留。在到達終點<EOS>后,再從后往前走,按照最大的概率得到找到最優路徑,保留在向量RWList里。
其中最優路徑保留的每個點結構為:
typedef struct {
string str;
string curTag;
int start;
int end;
int preNode;
int preTag;
}ResultWord;
test 第一個參數是標準答案,第二個參數是要輸出的文件流
測試時,先把標準答案進行處理,壓入一個向量Answer里,和RWList結構一樣。再對兩個向量進行比較。比較時,對于某一個測試生成的詞,利用最長公共子串匹配原則,判斷是否分割正確。只有在分割正確的前提下,再判斷POS是否標注正確。
Bigram訓練:
Bigram訓練和HMM訓練過程相似,而且只有一個狀態跳轉概率需要計算。只是由于它的狀態跳轉是一個詞到詞的轉換,如果直接建立一個大矩陣,要消耗相當大的內存。所以主要是考慮如何儲存頻率和模型的問題。
解碼過程和HMM也很相近,而且還要簡單。因為沒有了詞性標注這一塊,對每個點只需要保留該點的前驅到它的最大的概率得分和路徑即可。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -