• 机器学习作业12--朴素贝叶斯-垃圾邮件分类


    1. 读邮件数据集文件,提取邮件本身与标签。

    列表

    numpy数组

    实验代码为:

    1 import csv
    2 file_path = r"C:Users23625Desktop机器学习项目dataSMSSpamCollection"
    3 sms = open(file_path, 'r', encoding='utf-8')
    4 csv_reader = csv.reader(sms, delimiter='	')
    5 for r in csv_reader:
    6     print(r)
    7 sms.close()

    实验结果为:

    2.邮件预处理

    1. 邮件分句
    2. 句子分词
    3. 大小写,标点符号,去掉过短的单词
    4. 词性还原:复数、时态、比较级
    5. 连接成字符串

    2.1 传统方法来实现

    实验代码为:

     1 sep = '.,:;?!-_'  # 标点符号
     2 exclude = {'a', 'the', 'and', 'i', 'you', 'in'}  # 无意义的词
     3 file_path = r"C:Users23625Desktop机器学习项目dataSMSSpamCollection"
     4 
     5 
     6 def getxx():
     7     txt = open(file_path, 'r', encoding='utf-8').read().lower()  # 大小写
     8     for ch in sep:
     9         txt = txt.replace(ch, '')  # 标点符号
    10     return txt
    11 
    12 
    13 bigstr = getxx()  # 获取待统计字符串
    14 biglist = bigstr.split()  # 英文分词列表
    15 bigdict = {}
    16 for word in biglist:
    17     bigdict[word] = bigdict.get(word, 0) + 1  # 词频统计字典
    18 for word in exclude:
    19     del (bigdict[word])  # 无意义的词
    20 print(bigdict)
    21 bigitems = list(bigdict.items())
    22 bigitems.sort(key=lambda x: x[1], reverse=True)  # 按词频排序
    23 print("出现次数最多的10个单词:")
    24 for i in range(10):
    25     w, c = bigitems[i]
    26     print('{0:>10};{1:<5}'.format(w, c))  # TOP10

    实验结果为:

    2.2 nltk库的安装与使用

    pip install nltk

    import nltk

    nltk.download()     # sever地址改成 http://www.nltk.org/nltk_data/

    https://github.com/nltk/nltk_data下载gh-pages分支,里面的Packages就是我们要的资源。

    将Packages文件夹改名为nltk_data。

    网盘链接:https://pan.baidu.com/s/1iJGCrz4fW3uYpuquB5jbew    提取码:o5ea

    放在用户目录。

    ----------------------------------

    安装完成,通过下述命令可查看nltk版本:

    import nltk

    print nltk.__doc_

    实验结果为:

     

    2.1 nltk库 分词

    nltk.sent_tokenize(text) #对文本按照句子进行分割

    nltk.word_tokenize(sent) #对句子进行分词

    2.2 punkt 停用词

    from nltk.corpus import stopwords

    stops=stopwords.words('english')

    *如果提示需要下载punkt

    nltk.download(‘punkt’)

    或 下载punkt.zip

    https://pan.baidu.com/s/1OwLB0O8fBWkdLx8VJ-9uNQ  密码:mema

    复制到对应的失败的目录C:UsersAdministratorAppDataRoaming ltk_data okenizers并解压。

    2.3 NLTK 词性标注

    nltk.pos_tag(tokens)

    2.4 Lemmatisation(词性还原)

    from nltk.stem import WordNetLemmatizer

    lemmatizer = WordNetLemmatizer()

    lemmatizer.lemmatize('leaves') #缺省名词

    lemmatizer.lemmatize('best',pos='a')

    lemmatizer.lemmatize('made',pos='v')

    一般先要分词、词性标注,再按词性做词性还原。

    2.5 编写预处理函数

    def preprocessing(text):

    sms_data.append(preprocessing(line[1])) #对每封邮件做预处理

     实验代码为:

     1 import csv
     2 import nltk
     3 from nltk.corpus import stopwords
     4 from nltk.stem import WordNetLemmatizer
     5 
     6 
     7 # 词性还原
     8 def get_wordnet_pos(treebank_tag):
     9     if treebank_tag.startswith('J'):  # 形容词
    10         return nltk.corpus.wordnet.ADJ
    11     elif treebank_tag.startswith('V'):  # 动词
    12         return nltk.corpus.wordnet.VERB
    13     elif treebank_tag.startswith('N'):  # 名词
    14         return nltk.corpus.wordnet.NOUN
    15     elif treebank_tag.startswith('R'):  # 副词
    16         return nltk.corpus.wordnet.ADV
    17     else:
    18         return
    19 
    20 
    21 # 预处理
    22 def preprocessing(text):
    23     tokens = [word for sent in nltk.sent_tokenize(text) for word in nltk.word_tokenize(sent)]  # 将所有单词形成列表
    24     stops = stopwords.words('english')  # 停用词
    25     tokens_stop = [token for token in tokens if token not in stops]  # 去掉停用词
    26     lemmatizer = WordNetLemmatizer()
    27     tag = nltk.pos_tag(tokens_stop)  # 词性标注,标出是不是形容词等等
    28     newtokens = []
    29     for i, token in enumerate(tokens_stop):
    30         if token:
    31             pos = get_wordnet_pos(tag[i][1])
    32             if pos:
    33                 word = lemmatizer.lemmatize(token, pos)
    34                 newtokens.append(word)
    35     return newtokens
    36 
    37 
    38 file_path = r"C:Users23625Desktop机器学习项目dataSMSSpamCollection"
    39 sms = open(file_path, 'r', encoding='utf-8')
    40 sms_data = []
    41 sms_lable = []
    42 csv_reader = csv.reader(sms, delimiter='	')
    43 for r in csv_reader:
    44     sms_lable.append(r[0])
    45     sms_data.append(preprocessing(r[1]))  # 对每封邮件做预处理
    46 sms.close()
    47 
    48 print("邮件标签为:
    ", sms_lable)
    49 # 将sms_data换行输出,方便查看
    50 print("邮件标签为:")
    51 for i in sms_data:
    52     print(i, end="
    ")

    实验结果为:

    3. 训练集与测试集

    4. 词向量

    5. 模型

  • 相关阅读:
    assembly 基础
    自定义编写0号内中断除法错误的中断处理程序
    Codeforces Round #573 (Div. 2) D. Tokitsukaze, CSL and Stone Game (博弈,思维)
    Codeforces Round #573 (Div. 2) E. Tokitsukaze and Duel (博弈)
    Schedule HDU
    牛客假日团队赛5 F 随机数 BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数 (dfs记忆化搜索的数位DP)
    洛谷 P2866 [USACO06NOV]糟糕的一天Bad Hair Day 牛客假日团队赛5 A (单调栈)
    「BZOJ1669」D 饥饿的牛 [Usaco2006 Oct] Hungry Cows 牛客假日团队赛5 (LIS,离散化树状数组)
    树状数组求LIS模板
    牛客OI周赛11-普及组 B Game with numbers (数学,预处理真因子)
  • 原文地址:https://www.cnblogs.com/m2362563619/p/12890052.html
Copyright © 2020-2023  润新知