我是靠谱客的博主 震动电话,最近开发中收集的这篇文章主要介绍如何生成自定义的逆向文件频率(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("rn".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("rn".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'))

 

 

最后

以上就是震动电话为你收集整理的如何生成自定义的逆向文件频率(IDF)文本语料库(二)的全部内容,希望文章能够帮你解决如何生成自定义的逆向文件频率(IDF)文本语料库(二)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部