美赛中学习NLP文本情感分析总结

目录

  • 前提
  • 数据清洗
  • 分词
    • 为什么要分词
    • 英文分词遇到的问题
      • 使用NLTK进行分词
  • 情感分析
  • 局限性
  • 后记

前提

文中基于的论文:《卷烟在线评论的文本情感分析》
杨春晓,张鹤馨,黄家雯,万江平.卷烟在线评论的文本情感分析.中国烟草学报. http://kns.cnki.net/kcms/detail/11.2985.ts.20200121.1622.018.html

美赛过去之后,2020年的B题即用到了这个知识,当时没有深入学习,现在从头学习一下NLP文本情感分析。(完全小白)

论文中基于卷烟的文本评论提炼出有效的消费者体验信息,来供卷烟工商企业改进产品。

首先构建了适用于烟草领域的卷烟在线评论情感词典,并据此建立了卷烟评价文本情感分析模型。然后选取评论较多两款卷烟产品作为研究对象,通过 Python 通用网络爬虫采集了2008 年至 2018 年两个产品的在线评论(但美赛中一般会给数据,所以就不用自己爬虫),经数据清洗处理后,得到有效在线评论数据。将评论数据输入卷烟评价文本情感分析模型,按照产品、时间、地区等维度分别计算出情感指数。通过情感指数变化和比较,可以洞察卷烟在线评论中的情感表达,并给出了相应的对策与建议。

美赛中学习NLP文本情感分析总结_第1张图片

数据清洗

原始文本会包含一些无用或者错误信息,因此我们进行清洗。

英文文本需要的数据清洗内容:

  • 缩略词更改
  • 拼写校正
  • 标点符号
  • 符号替换

引用:https://blog.csdn.net/spring_willow/article/details/80721491

    def clean_text(text):
        """
        Clean text
        :param text: the string of text
        :return: text string after cleaning
        """
        # 更正缩写
        text = re.sub(r"can\'t", "can not", text)
        text = re.sub(r"cannot", "can not ", text)
        text = re.sub(r"what\'s", "what is", text)
        text = re.sub(r"What\'s", "what is", text)
        text = re.sub(r"\'ve ", " have ", text)
        text = re.sub(r"n\'t", " not ", text)
        text = re.sub(r"i\'m", "i am ", text)
        text = re.sub(r"I\'m", "i am ", text)
        text = re.sub(r"\'re", " are ", text)
        text = re.sub(r"\'d", " would ", text)
        text = re.sub(r"\'ll", " will ", text)
        text = re.sub(r" e mail ", " email ", text)
        text = re.sub(r" e \- mail ", " email ", text)
        text = re.sub(r" e\-mail ", " email ", text)

        # 拼写矫正
        text = re.sub(r"ph\.d", "phd", text)
        text = re.sub(r"PhD", "phd", text)
        text = re.sub(r" e g ", " eg ", text)
        text = re.sub(r" fb ", " facebook ", text)
        text = re.sub(r"facebooks", " facebook ", text)
        text = re.sub(r"facebooking", " facebook ", text)
        text = re.sub(r" usa ", " america ", text)
        text = re.sub(r" us ", " america ", text)
        text = re.sub(r" u s ", " america ", text)
        text = re.sub(r" U\.S\. ", " america ", text)
        text = re.sub(r" US ", " america ", text)
        text = re.sub(r" American ", " america ", text)
        text = re.sub(r" America ", " america ", text)
        text = re.sub(r" mbp ", " macbook-pro ", text)
        text = re.sub(r" mac ", " macbook ", text)
        text = re.sub(r"macbook pro", "macbook-pro", text)
        text = re.sub(r"macbook-pros", "macbook-pro", text)
        text = re.sub(r" 1 ", " one ", text)
        text = re.sub(r" 2 ", " two ", text)
        text = re.sub(r" 3 ", " three ", text)
        text = re.sub(r" 4 ", " four ", text)
        text = re.sub(r" 5 ", " five ", text)
        text = re.sub(r" 6 ", " six ", text)
        text = re.sub(r" 7 ", " seven ", text)
        text = re.sub(r" 8 ", " eight ", text)
        text = re.sub(r" 9 ", " nine ", text)
        text = re.sub(r"googling", " google ", text)
        text = re.sub(r"googled", " google ", text)
        text = re.sub(r"googleable", " google ", text)
        text = re.sub(r"googles", " google ", text)
        text = re.sub(r"dollars", " dollar ", text)

        # 标点符号
        text = re.sub(r"\+", " + ", text)
        text = re.sub(r"'", " ", text)
        text = re.sub(r"-", " - ", text)
        text = re.sub(r"/", " / ", text)
        text = re.sub(r"\\", " \ ", text)
        text = re.sub(r"=", " = ", text)
        text = re.sub(r"\^", " ^ ", text)
        text = re.sub(r":", " : ", text)
        text = re.sub(r"\.", " . ", text)
        text = re.sub(r",", " , ", text)
        text = re.sub(r"\?", " ? ", text)
        text = re.sub(r"!", " ! ", text)
        text = re.sub(r"\"", " \" ", text)
        text = re.sub(r"&", " & ", text)
        text = re.sub(r"\|", " | ", text)
        text = re.sub(r";", " ; ", text)
        text = re.sub(r"\(", " ( ", text)
        text = re.sub(r"\)", " ( ", text)

        # 规范化符号
        text = re.sub(r"&", " and ", text)
        text = re.sub(r"\|", " or ", text)
        text = re.sub(r"=", " equal ", text)
        text = re.sub(r"\+", " plus ", text)
        text = re.sub(r"\$", " dollar ", text)

        return text

分词

为什么要分词

  1. 将复杂问题转化为数学问题
    文本都是一些「非结构化数据」,我们需要先将这些数据转化为「结构化数据」,结构化数据就可以转化为数学问题了,而分词就是转化的第一步。
  2. 词是一个比较合适的粒度
    词是表达完整含义的最小单位。粒度太小会损失原本意思;粒度太大,承载的信息量过多,无法复用。

英文分词遇到的问题

词性还原(lemmatization):does,done,doing,did 需要通过词性还原恢复成 do。
词干提取(stemming):cities,children,teeth 这些词,需要转换为 city,child,tooth”这些基本形态

使用NLTK进行分词

NLTK(python的一个库,用来自然语言处理),支持词性还原

情感分析

构造在线评论字典:
然后使用上述分词后得到的结果,人工筛选出常用的情感词汇,建立不同维度的积极和消极情感的词典。

结合构造出的词典,统计产品的情感词词频,然后用Python生成词云。得到高频的前十位情感词,看分别属于哪种维度,则可以看出消费者对产品最关心的维度。

局限性

由于我的学习不够深入,因此我的数据结果有一定局限性:

  1. 不能包含使用反讽等比较复杂的情感。
  2. 一些谚语等可能会被当成停用词过滤掉,无法结合上下文。
  3. 否定词的存在
  4. 一些互联网新词,无法识别到

后记

由于是建模手,所以对NLTK的详细使用不是很了解TT,后续会继续进行学习,到时候再进行更新。

你可能感兴趣的:(NLTK)