jieba 如何生成自定义的逆向文件频率(IDF)文本语料库?

e37o9pze  于 2023-02-04  发布在  其他
关注(0)|答案(8)|浏览(264)

在基于TF-IDF进行特征提取时,因为文本背景是某一具体行业,不适合使用通用的IDF语料库,我觉得应该使用自定义的基于该行业背景的IDF语料库。请问如何生成自定义IDF语料库呢?

我现在有的数据是几十万个该行业的文档,初步想法是:对每个文档分词去重,把所有文档分词结果汇集去重后形成一个分词集,然后对于分词集里的每一个词语w,按**f=log(该行业文档总数/(含有w的文档数量+1))**公式求出词语w的IDF值f,最后txt文件里每一行放一个(w, f)

是这样吗?谢啦~

fnvucqvd

fnvucqvd1#

还有2个问题:假设通用IDF语料库里有A B C三个词语及其idf值,我自定义IDF语料库里有A B D及其idf值,那么请问,在添加自定义的IDF语料库后:

  1. 自定义IDF语料库里的A和B及其相应idf值就直接覆盖通用IDF语料库里的A和B吧?
  2. 通用IDF语料库里原先的C及其idf值,现在还有吗?

(其实问题只有就1个:添加自定义IDF语料库后,是整个文件替换,还是说只有那些重复的词语才被替换?)

8fq7wneg

8fq7wneg2#

求助求助求助,没有朋友知道吗???

btqmn9zl

btqmn9zl3#

我也想做一个词库,满足自己的需求,自带的字库里有很多类似一一二/一一分/一三六八之类意义不大的词

pcrecxhr

pcrecxhr4#

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)))
r3i60tvu

r3i60tvu5#

@M2shad0w 非常感谢!还有一个问题:

假设通用IDF语料库里有A B C三个词语及其idf值,我自定义的IDF语料库里有A B D及其idf值,那么请问,在添加自定义的IDF语料库后:

  1. 自定义IDF语料库里的A和B及其相应idf值就直接覆盖通用IDF语料库里的A和B吧?
  2. 通用IDF语料库里原先的C及其idf值,现在还有吗?
mec1mxoz

mec1mxoz6#

@siberiawolf61
我看了一下 结巴库中 load idf path 的代码
https://github.com/fxsjy/jieba/blob/master/jieba/analyse/tfidf.py#L65

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)

应该是覆盖了,c值的 idf 也没有了

uurity8g

uurity8g7#

@M2shad0w 好的,谢谢啊!

相关问题