1. 程式人生 > >如何生成自定義的逆向檔案頻率(IDF)文字語料庫(二)

如何生成自定義的逆向檔案頻率(IDF)文字語料庫(二)

一、什麼是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'))