在基于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)