如何生成自定義的逆向檔案頻率(IDF)文字語料庫(二)
阿新 • • 發佈:2018-11-19
一、什麼是IDF文字語料庫
在jieba的TF-IDF模型裡面,當呼叫獲取關鍵詞的函式
jieba.analyse.extract_tags()
的時候,該函式會呼叫預設的IDF語料庫。IDF語料庫就是jieba官方在大量文字的基礎上,通過
計算得到的一個idf字典,其key為分詞之後的每個詞,其value為 每個詞的IDF數值。
二、計算自定義的IDF文字語料庫
程式流程如下:
1、讀取文字檔案,分詞,去停用詞,得到all_dict 字典,字典的鍵是word,字典的值是包含word 的文件的個數。
# 獲取每個目錄下所有的檔案 for mydir in catelist: class_path = corpus_path+mydir+"/" # 拼出分類子目錄的路徑 #print(class_path) seg_dir = seg_path+mydir+"/" # 拼出分詞後語料分類目錄 if not os.path.exists(seg_dir): # 是否存在目錄,如果沒有建立 os.makedirs(seg_dir) #print(seg_dir) file_list = os.listdir(class_path) # 獲取class_path下的所有檔案 for file_path in file_list: # 遍歷類別目錄下檔案 fullname = class_path + file_path # 拼出檔名全路徑 #print(fullname) content = readfile(fullname).strip() # 讀取檔案內容 content = content.replace("\r\n".encode(encoding="utf-8"),"".encode(encoding="utf-8")) # 刪除換行和多餘的空格 content = content.replace(" ".encode(encoding="utf-8"),"".encode(encoding="utf-8")) content_seg = jieba.cut(content.strip()) # 為檔案內容分詞 stopwords = stopwordslist('./stopwords1.txt') outstr = [] for word in content_seg: if word not in stopwords: if word != '\t' and word != '\n': #outstr.append(word) outstr.append(word) for word in outstr: if ' ' in outstr: outstr.remove(' ') temp_dict = {} total += 1 for word in outstr: #print(word) temp_dict[word] = 1 # print(temp_dict) for key in temp_dict: num = all_dict.get(key, 0) all_dict[key] = num + 1 #savefile(seg_dir+file_path,"".join(outstr)) # 將處理後的檔案儲存到分詞後語料目錄
2、計算IDF值並儲存到txt中 idf_dict 字典的鍵是word ,值是對應的IDF數值。
# idf_dict字典就是生成的IDF語料庫 idf_dict = {} for key in all_dict: # print(all_dict[key]) w = key p = '%.10f' % (math.log10(total/(all_dict[key]+1))) if w > u'\u4e00' and w<=u'\u9fa5': idf_dict[w] = p print('IDF字典構造結束') fw = open('wdic.txt', 'w',encoding='utf-8') for k in idf_dict: if k != '\n': print(k) fw.write(k + ' ' + idf_dict[k] + '\n') fw.close()
三、程式中的一些問題記錄
1、readfile函式的返回值是文字內容對應的字串。replace()函式內要使用'utf-8'編碼。
content = readfile(fullname).strip() # 讀取檔案內容
content = content.replace("\r\n".encode(encoding="utf-8"),"".encode(encoding="utf-8")) # 刪除換行和多餘的空格
2、停用詞stopwords 是讀取停用詞文字之後轉換生成的列表。通過for迴圈和if 判斷,去掉停用詞,生成outstr 最終的分詞列表。
for word in content_seg: if word not in stopwords: if word != '\t' and word != '\n': #outstr.append(word) outstr.append(word)
3、word-idf 字典建立。 這裡的key 和p都是字串。通過if判斷語句,保證字典的key 都是漢字。
idf_dict = {}
for key in all_dict:
# print('ok')
# print(all_dict[key])
w = key
p = '%.10f' % (math.log10(total/(all_dict[key]+1)))
if w > u'\u4e00' and w<=u'\u9fa5':
idf_dict[w] = p
#print(idf_dict)
#del idf_dict['']
#del idf_dict[' ']
print('IDF字典構造結束')
4、儲存為txt,這裡必須要‘utf-8’編碼,不然jieba不識別。 fw.wirte()一行行把字典寫入txt。
fw = open('wdic.txt', 'w',encoding='utf-8')
for k in idf_dict:
if k != '\n':
print(k)
fw.write(k + ' ' + idf_dict[k] + '\n')
fw.close()
四、jieba中替換為自定義的IDF語料庫
jieba.analyse.set_idf_path(idf_file_name)
keywords = jieba.analyse.extract_tags(sentence, topK=20, withWeight=True, allowPOS=('n', 'nr', 'ns'))