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

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

 

在基於TF-IDF進行特徵提取時,因為文字背景是某一具體行業,不適合使用通用的IDF語料庫,我覺得應該使用自定義的基於該行業背景的IDF語料庫。請問如何生成自定義IDF語料庫呢?

我現在有的資料是幾十萬個該行業的文件,初步想法是:對每個文件分詞去重,把所有文件分詞結果彙集去重後形成一個分詞集,然後對於分詞集裡的每一個詞語w,按idf=log(該行業文件總數/(含有w的文件數量+1))**公式求出詞語w的IDF值f,最後txt檔案裡每一行放一個(w, f)。

一、逆向檔案頻率

逆向檔案頻率 (inverse document frequency, IDF) 是一個詞語普遍重要性的度量。某一特定詞語的IDF,可以由總檔案數目除以包含該詞語之檔案的數目,再將得到的商取對數得到。

line 是單個文件

all_dict = {}
for line in lines:
    temp_dict = {}
    total += 1
    cut_line = jieba.cut(line, cut_all=False)
    for word in cut_line:
        temp_dict[word] = 1
    for key in temp_dict:
        num = all_dict.get(key, 0)
        all_dict[key] = num + 1
for key in all_dict:
    w = key.encode('utf-8')
    p = '%.10f' % (math.log10(total/(all_dict[key] + 1)))
用法:jieba.analyse.set_idf_path(file_name) # file_name為自定義語料庫的路徑

 

自定義的IDF文字語料庫會覆蓋jieba自帶的語料庫,因為載入IDF語料庫時候只能是自定義路徑OR預設。

class TFIDF(KeywordExtractor):

    def __init__(self, idf_path=None):
        self.tokenizer = jieba.dt
        self.postokenizer = jieba.posseg.dt
        self.stop_words = self.STOP_WORDS.copy()
        self.idf_loader = IDFLoader(idf_path or DEFAULT_IDF)
        self.idf_freq, self.median_idf = self.idf_loader.get_idf()

...

    self.idf_loader = IDFLoader(idf_path or DEFAULT_IDF)