• 提取txt文本有效内容


    原理:
        1.使用足够多的垃圾邮件和非垃圾邮件的内容作为训练集
        2.读取全部训练集
            删除其中的干扰字符
            【 】 ,* 。 
            进行分词 
            删除长度为 1 的单个字符
        3.统计全部训练集中每个有效词汇的出现次数,截取出现次数最多的前 N 个
            注:N 可以自己指定
        4.根据每个经过第 2 步预处理后的垃圾邮件和非垃圾邮件内容生成特征向量
            统计第 3 步中得到的 N 个词语分别在该邮件中的出现频率
                每一个邮件对应一个特征向量,特征向量长度为 N 
            每个分量的值 表示对应的词语 在本邮件中出现的次数
                [3,0,0,5] 第一个词语出现 3 次,第四个词出现了 55.根据第 4 步中得到的特征向量和已知邮件分类创建并训练朴素贝叶斯模型
            注:明确哪些是垃圾邮件,哪些不是垃圾邮件
        6.读取测试邮件,参考第 2 步,对邮件文本进行预处理,提取特征向量 
        7.使用第 5 步中训练好的模型,根据第 6 步提取的特征向量对邮件进行分类
    
    程序要点:
    1.使用 re 模块下的 sub 替换干扰的符号
        from re import sub
    2.使用 os 模块下的 listdir 列出所有的记事本文件 .txt 
        from os import listdir
    3.使用 collections 模块下的 Counter 对邮件中字符出现的次数进行统计
        from collections import Counter
    4.使用 itertools 模块下的 chain 对邮件中字符出现的次数进行统计
        from itertools import chain
    5.使用 numpy 模块下的 array 将数据输入到模型中,使用数组
        from numpy import array
    6.使用 jieba 模块下的 cut 对内容进行分词
        from jieba import cut
    7.使用 sklearn.naive_bayes 模块下的 MultinomialNB 导入朴素贝叶斯
        from sklearn.naive_bayes import MultinomialNB
    8.删除字符串两边的空白字符(空格,制表符,换行符)
        line = line.strip()
    9.将其他字符替换为空白字符
        line = sub(r'[.【】 0-9、-。,!~*]','',line)
    10.对文本进行分词
        line = cut(line)
    11.过滤长度为 1 的单个字
        line = filter(lambda word:len(word) > 1,line)
            filter 函数将大于 1 的保存下来
    12.列表添加元素使用 extends 
        words.extends(line)
    
    程序:
    from re import sub 
    from os import listdir 
    from collections import Counter 
    from iteratools import chain 
    from numpy import cut 
    from sklearn.naive_bayes import MultinomialNB
    
    def getWordsFromFile(txtFile):
        # 获取每一封邮件中的所有词语
        words = [] 
        # 将所有存储邮件文本内容的记事本文件都使用 UTF8 编码
        with open(txtFile,encoding = "utf8") as fp:
            for line in fp:
                # 遍历每一行,删除两端的空白字符
                line = line.strip()
                # 过滤掉干扰字符
                line = sub(r'[.【】 0-9、-。,!~*]','',line)
                # 对 line 进行分词
                line = cut(line)
                # 过滤长度为 1 的词
                line = filter(lambda word:len(word) > 1 ,line)
                # 将文本预处理得到的词语添加到 words 列表中
                words.extend(line)
            return words

    2020-04-11

  • 相关阅读:
    树的遍历
    动态规划之背包问题
    Dijkstra算法
    最短路径
    关于数学公式Markdown
    子集数
    O、Θ、Ω
    AT212 P-CASカードと高橋君
    vector的使用方法
    P3512 [POI2010]PIL-Pilots 单调队列的应用
  • 原文地址:https://www.cnblogs.com/hany-postq473111315/p/12680021.html
Copyright © 2020-2023  润新知