在文字的特徵選擇中學習到的東西——構建詞典
這一段時間在學習從以標註好的文字中生成詞典。
今天讀到的這段程式碼,真的學習到了很多。
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值。