1. 程式人生 > >在文字的特徵選擇中學習到的東西——構建詞典

在文字的特徵選擇中學習到的東西——構建詞典

這一段時間在學習從以標註好的文字中生成詞典。
今天讀到的這段程式碼,真的學習到了很多。
indexes=[1]表示要訓練的指標項,預設為1,也可以是其他,如[3,4,5]等等。
首先讀到的這段程式碼(python):

f= file(filename,'r')
    for line in f.readlines():
        sample = line.strip().split(tc_splitTag)
        #print indexes[len(indexes)-1]
        if len(sample)<=indexes[len(indexes)-1
]: #if len(sample)<=len(indexes): continue

filename表示已經分好詞的文字所在的檔名
將分好詞的文字逐行讀出,然後,用line.strip()去除收尾的空格,包括\n\r\t,然後用line.strip().split(tc_splitTag)分成列表,其中tc_splitTag表示的是製表符\t

下面是文字的第一行:-4 昨天^晚上^吃^了^最^窩火^的^飯^
這樣,經過line.strip().split(tc_splitTag)去除首尾空格,然後再用製表符進行分割之後,sample中存放的是[-4,”昨天^晚上^吃^了^最^窩火^的^飯^”]這樣一個列表,存有兩項。
這個時候需要判斷一下sample是否符合標準:一個標註項“-4”,還有就是訓練的文字項。
indexes中存放了要訓練的指標項,也就是要訓練的資料在這個樣本sample中位於哪個位置。如:現在是位於1位置。

len(indexes)表示了訓練指標項的個數,即一共要訓練多少資料項。indexes中的最後一個數據表示了訓練項的最大位置資訊,所以樣本sample是否符合標準的評判條件就是 sample中有沒有那麼多訓練的資料項 白話一點:我現在要訓練3,4,5三個資料項,但是你給我的樣本中只有0,1,2,3,4項,沒有第五項,那麼就不是合格的樣本。

if len(sample)<=indexes[len(indexes)-1]:
這條語句中len(indexes)-1表示了最大訓練資料項的值所在的位置(在indexes中),如果len(sample)小於這個值,不行,等於也不行(因為有標註項,標註項是0,所以sample的長度要大於這最大訓練指標項的位置)。
所以下面那句語句
if len(sample)<=len(indexes):是錯誤的,因為(3,4,5),自己想想,不多解釋了。

樣本如果不符合,略過(continue)。

#統計不同賦值樣本的個數
        label = int(float(sample[0]))
        if cat_num_dic.has_key(label) is True:
            cat_num_dic[label]+=1.0
        else:
             cat_num_dic[label]=1.0

其中sample[0]就是表示的標註項。
這段程式碼的意思:統計不同樣本的個數
將標註項從string型別轉換為int型別的label,cat_num_dic是一個字典,如果標註項有0,1,2,3,則分別統計型別為0的樣本有多少項,為1的多少……等等。最後存在字典裡。

最後給與我深刻學習的是最後這段程式碼:!!!!!!

#組合所有的內容,這段程式碼太好了!!
        string =""
        string = sample[indexes[0]]##高明,如果訓練的指標項是3,4,5,indexs是【3,4,5】,則indexs[0]=3!!!
        if len(indexes)>1:##訓練的指標項多於兩項
            for i  in range(1,len(indexes)):
                string += str_splitTag+sample[indexes[i]]
        #計算包含term的樣本數      
        temp_dic = dict() 
        for term in string.strip().split(str_splitTag):
            if len(term.strip())==0:
                continue
            term = term.strip()
            if stop_words_dic.has_key(term) is True:
                continue
            #print term
            #print temp_dic####此處是字典,並不是列表
            temp_dic[term]=1.0 #只要出現一次就代表著該樣本包含該詞。

        for key in temp_dic.keys():
            if dic.has_key(key) is True:
                if dic[key].has_key(label):
                    dic[key][label]+=1.0
                else:
                    dic[key][label]=1
            else:
                dic[key]={}
                dic[key][label]=1

首先,最後的詞典的形式:{term:{label:n(term)}} 每個term對應的是一個詞典,其中詞典中儲存了每個類別中包含該term 的樣本數。label 為int型
之前說過indexes中存放的是訓練指標項的位置資訊,如果indexes中有很多需要訓練的指標項,那麼需要將其組合起來。string = sample[indexes[0]] 就是組合的第一項,然後進行判斷,如果需要訓練的專案不止一個,那麼就需要把剩下的都連線起來。

temp_dic 字典作為一個構建詞典的中間跳板,首先將樣本拆分成詞,然後過濾掉停用詞之後,將樣本中剩下的片語成一個很簡單的詞典。temp_dic[term]=1.0 #只要出現一次就代表著該樣本包含該詞。
temp_dic給最後要建造的字典dic提供了key值。
按照上述的詞典的形式開始構造字典dic.

for key in dic.keys():
        for cat in cat_num_dic.keys():
            if dic[key].has_key(cat) is False:
                dic[key][cat]=0.0

最後,需要補充上沒有出現的label,並給這個詞沒有出現的label複製為0.0

值得一提的是,cat_num_dic和dic都是全域性變數(相對的),只是在不斷地補充和完善,而temp_dic 是會在執行過程中不斷變為空,不斷給dic提供key值。