偷懒若干天后回归。。在上一篇中我们得到了NLPCC2013的中文微博数据,将其按照8:1:1的比例分成了训练集,验证集和测试集。下一步就是对数据进行预处理以及embedding。这是第一次尝试一边写博客一边把自己的想法记录下来,希望有所帮助。

分析:按照体量的大小可以将文本分为字级别->词级别->实体级别->句子级别->段落级别->文章级别。由于我们的任务主要是情感识别,通常情况下可以代表情感的往往只是某些字或词,所以对于数据的预处理最多进行到分词,不许要做NER。只要基于当前数据做出正确的分词并且embedding,即可作为文章的输入。分词工具在这里选择开源并且遵守MIT(个人理解为可以商用)的jieba分词。先看一下数据的分词难点:

#回复@王羊羊的微博:是,要的就是安静的生存环境,而且,到北京五环25分#钟车程,938离我住处只有300米,饮食一条街更是北京饮食街的翻版,应有尽有。#//@王羊羊的微博:廊坊是个好地方,紧邻京津,有点闹中取静的意思。#[抓狂]我竟然被那个考了车牌几个月但一直没有开过车的老妈笑话我笨!#这家位于槟城George Town,Tunes Hotel斜对面的饼家,家庭式作业,她#的咸蛋酥,年糕椰蓉酥,叉烧酥都很不错。[good]#做人原则:⑴能不骂人,就不骂!#联系方式:13810938511 QQ:122095021

以上几条微博可以反映出这个数据存在的某些问题:存在回复标签,存在表情符号,中英混用,全半角符号混用,数字问题。之前也做过推特的情感分类,发现同为社交媒体,中文社交媒体的数据处理要比英文复杂的多。对于这种情况,我首先观察了一下数据特点,然后直接根据每种不同情况作了相应处理,在这里不再赘述,想看的朋友们可以直接看最后放出的代码,写的还算比较清楚,每个功能都写成了一个小函数。

本来想分词之后直接训练embedding的,但是考虑到一共才4w多个样本,而且很多都不符合一般的语言规范,想了想还是用了别人的embedding。链接在此:https://github.com/facebookresearch/fastText/blob/master/pretrained-vectors.md 但是考虑到用了别人的embedding正常情况下就可以开始搭模型了。在这里多做了一步工作就是对数据进行了一个可视化。代码同样在下面。

可视化分为了两个部分:构建词云和词向量的可视化。前者基本可以理解为找到文本中的若干关键词并可视化,后者即为将embedding降维后得到的结果。

先看一下词云:

可以看到由于数据源是网络文本,即使去掉停词后还是有大量的口语/无意义词汇,但是好在从其中一些小字也可以找到一些微博早期大家关注的热点,如果沿时间横向对比的话,应该是可以得到一些有意思的结论的。最直观的一个结论可以看到词云中出现的两个国家美国和日本,代表了网民门讨论的热点国家,还是比较符合实际的。下面一张图做了一些美化,本质上还是这个东西。

做完了词云,再来看一下词向量降维得到的结果。经过统计数据里面实际上有两万多个可以和词向量对应的词语,全部显示基本是不可能了,差点没把我这破air累死。最终选取了其中500个词,尽管这样还是需要截图才能看到一个大概的趋势。其实这样一个统计就类似于聚类的结果统计,只不过使用cosine距离作为度量,具体实现是用的sklearn的tsne模块。看一看哪些和哪些是比较相似的。也检查一下embedding的情况怎么样,是否能反映语义信息。整个图里面的点大概聚成了即堆,挑有代表性的讨论讨论。

可以看到一些平时相关的词语确实距离非常近

这里是第二堆词,其实和第一堆并不能发现什么太大的差别,导致出现两堆的情况很有可能是因为这两堆都是高维空间投射到2维空间的影子。实际上两堆各自内部的词应该还与另一堆有关联。

这一堆基本都是单个字或者标点符号,没有吧标点符号全部去掉的原意主要就是因为像!?...这样的符号其实是很大程度上可以反映情绪的,所以除了一些确实不必要的其他都保留了下来。但是可以看到也有一些小瑕疵,比如/这种符号还是没有去干净。

其实以上这些可视化不仅可以用来做情感分析,还可以做一些舆情分析,本质上是一样的。下面Po出所有源代码,写的不太好还请各路大神多指教~我只是个小白哈哈~

importjiebaimportreimportgensimimportcollectionsimportmatplotlib.pyplot as pltfrom wordcloud importWordCloudfrom wordcloud importSTOPWORDSimportnumpy as npfrom PIL importImagefrom gensim.models importKeyedVectorsfrom sklearn.manifold importTSNEimporttqdmimportmatplotlibfrom matplotlib importfont_manager#matplotlib.use('qt4agg')
input_file= open("data_all.txt")
counter=0
corpora=[]
real_vocab=[]"""第一部分,预处理和分词"""
def chn_tokenize(sentence): #使用jieba分词实现完整的中文数据集分词line_list = jieba.lcut(sentence, HMM=True)returnline_list#print(line_list)defdel_reply_mark(sentence):output= re.sub('@.*?:', '', sentence).strip("回复").strip("//")output= re.sub('@.*?', '', output)if output == "":output= "***"#print(output)returnoutputdefrep_chn_punc(sentence):table= {ord(f): ord(t) for f, t inzip(u',。!?【】()%#@&1234567890①②③④⑤、·:[]():;',u',.!?....%#@&123456789012345,........')}output= sentence.translate(table).replace("...", "").replace("", "").replace("", "").replace("", "")\.replace("——", "").replace("..", "").replace("", "").replace("", "").replace("....", "")\.replace(".....", "").replace(".", "").replace(",", "").replace("-", "").replace("T T", "TT")\.replace("T_T", "TT")returnoutputdefclean_pun(sentence):strip_special_chars= re.compile("[^A-Za-z0-9]+")output= re.sub(strip_special_chars, "", sentence)returnoutputfor i intqdm.tqdm(input_file.readlines()):sen=rep_chn_punc(i)sen= del_reply_mark(sen).strip("\n").strip("\t").strip(".")counter+= 1#print(sen)word_list =chn_tokenize(sen)try:while word_list.index(" "):del word_list[word_list.index(" ")]exceptValueError:#print(word_list)
corpora.append(word_list)for j inrange(len(word_list)):if word_list[j] not inreal_vocab:real_vocab.append(word_list[j])print(counter)"""第二部分,"""defword_freq(text):corpora_in_line=[]for line inrange(len(text)):corpora_in_line.extend(text[line])frequency=collections.Counter(corpora_in_line)print(frequency)defword_cloud(text, path):stopwords=set(STOPWORDS)weibo=np.array(Image.open(path))stopwords.add("一个")corpora_in_str= ""for line inrange(len(text)):str_text= " ".join(text[line])#print(str_text)corpora_in_str +=str_textmy_wordcloud= WordCloud(font_path='SimHei.ttf', stopwords=STOPWORDS, width=1500, height=750, background_color="black").generate(corpora_in_str)plt.imshow(my_wordcloud)plt.axis("off")plt.show()def plot_with_labels(low_dim_embs, labels, filename='tsne.pdf'):#from matplotlib import rcParamsmyfont = font_manager.FontProperties(fname='SimHei.ttf')#matplotlib.rcParams['font.family'] = 'sans-serif'matplotlib.rcParams['font.family'] = ['SimHei']#matplotlib.rcParams['axes.unicode_minus'] = Falseassert low_dim_embs.shape[0] >= len(labels), "More labels than embeddings"plt.figure(figsize=(18, 18))  #in inchesprint("flag2")for i, label inenumerate(labels):x, y=low_dim_embs[i, :]plt.scatter(x, y)plt.annotate(label,xy=(x, y),xytext=(5, 2),textcoords='offset points',ha='right',va='bottom')plt.savefig(filename)#wiki.zh.vecdefembedding(model_path, vocab):zh_model=KeyedVectors.load_word2vec_format(model_path)embedding=np.array([])show_vocab=[]for m inrange(len(vocab)):if vocab[m] inSTOPWORDS:continueif len(show_vocab) > 499:breakif vocab[m] inzh_model.vocab:show_vocab.append(vocab[m])embedding=np.append(embedding, zh_model[vocab[m]])print(len(show_vocab))embedding= embedding.reshape(len(show_vocab), 300)tsne=TSNE()print("flag0")low_dim_embedding=tsne.fit_transform(embedding)print("flag1")plot_with_labels(low_dim_embedding, show_vocab)#word_freq(corpora)#word_cloud(corpora, "weibologo.jpg")
embedding("wiki.zh.vec", real_vocab)

如果你看到了这里并且喜欢这篇博客,希望你可以给EST凌晨4点还在写博客的博主一点支持~鼓励我写出更多更好的博客~谢谢啦~

转载于:https://www.cnblogs.com/yunke-ws/p/9734432.html

NLPCC2013中文微博细粒度情感识别(二)相关推荐

  1. NLPCC2013中文微博细粒度情感识别(一)

    既然是找到了不错的工作,自然不敢怠慢,作为入职前的准备自己找了个任务干,再熟悉一下语义识别&文本分类的整个过程. 数据使用的是NLPCC2013的第二个任务,中文微博细粒度情感识别,现在在官网 ...

  2. 基于pytorch的文本情感识别(LSTM,CNN)

    文章目录 前言 一.数据处理与Word2vec词向量训练 二.创建神经网络的输入batch 三.神经网络模型 1.LSTM 2.CNN 四.训练与测试 六.实验结果 七.完整代码 1.LSTM 2.C ...

  3. 学习微博中情感分类的句子表达(NLPCC2013)

    学习微博中情感分类的句子表达(NLPCC2013) Learning sentence representation for emotion classification on microblogs ...

  4. Moodlens:一个基于表情符号的中文微博情感分析系统(A3, SIGKDD2012)

    Moodlens: an emoticon-based sentiment analysis system for chinese tweets Moodlens:一个基于表情符号的中文微博情感分析系 ...

  5. java对微博评论进行分析_微博上分析情感的_中文情感分析java_中文微博情感分析...

    目前,社会正处于一个微博崛起的时代,一切有关于微博的问题都被社会广泛关注,并得到了工业界和学术界的高度重视.微博从出现以来,取得了良好的发展,并拥有大众的普遍关注和应用.微博的超大信息量和高速度的更新 ...

  6. 【毕业设计_课程设计】基于各种机器学习和深度学习的中文微博情感分析

    文章目录 前言 项目介绍 实验结果 舆情分析 工程结构 前言 基于各种机器学习和深度学习的中文微博情感分析 提示:适合用于课程设计或毕业设计,工作量达标,源码开放 项目介绍 1.用FastText在语 ...

  7. 论文笔记:语音情感识别(二)声谱图+CRNN

    一:An Attention Pooling based Representation Learning Method for Speech Emotion Recognition(2018 Inte ...

  8. 中文OCR光学字符检测与识别二:用最先进的DBNet训练自己的数据集检测中文文本

    中文OCR光学字符检测与识别二:用最先进的DBNet训练自己的数据集检测中文文本 本文介绍 中文OCR光学字符检测与识别二:用最先进的DBNet训练自己的数据集检测中文文本 中文OCR光学字符检测与识 ...

  9. Unity发布UWP,Hololens调用外部dll识别二维码,获得中文拼音简码

    识别二维码用的是zxing,下载ZXing.Net.0.16.0.0 打开Unity文件夹,把zxing.unity.dll放在Plugins文件夹下,Plugins文件夹下新建WSAPlayer,把 ...

最新文章

  1. 一场由金山词霸引起的车祸 Process finished with exit code -1073741819 (0xC0000005)
  2. python开发pc软件_程序员带你十天快速入门Python,玩转电脑软件开发(二)
  3. 访问vue实例中的数据
  4. MySQL迁移过程中遇到的问题
  5. 迷你图标集大集合:5000+ 30套免费的图标
  6. toad dba suite for oracle 12,Toad DBA Suite 和Toad Development Suite的区别
  7. WEB安全基础-PHP中GET与POST实践
  8. 基于云原生2.0,华为云沃土云创计划全面使能伙伴创新升级
  9. ios微内核和鸿蒙微内核,华为发布基于微内核、面向全场景的分布式操作系统:鸿蒙OS...
  10. php取汉字拼音首字母,php获取汉字拼音首字母的函数(真正可以使用的)
  11. 一起谈.NET技术,Linq学习笔记
  12. android 电平信号状态识别View平局
  13. 地铁票务管理系统_地铁票务管理工作总结
  14. 如何用js判断浏览器中是否安装有flash插件
  15. 深度剖析5款主流杀毒软件
  16. mysql休假管理系统_课内资源 - 基于JSP和MYSQL数据库实现的请假管理系统
  17. 迅雷下gho文件变成php,GHO格式文件转换成WIM格式文件
  18. 聊聊运营商对UDP的QoS限制和应对
  19. 第三方支付牌照会改变在线支付现状吗?
  20. 分享20个增长黑客经典案例。

热门文章

  1. 30分钟学会js新特性
  2. mysql 基础语法3
  3. 集大计算机与科学的研究生,明天,我是研究生丨感谢集大,我遇见了更好的自己...
  4. revit二开之关联族参数的实现
  5. 【教程】Ubuntu20.04 + VirtualBox 各种软件环境安装
  6. Spring Boot - Thymeleaf模板简介以及集成
  7. httpClient笔记
  8. Android Pie源码阅读 -----深入理解init(一)
  9. HNU暑假程序设计训练 0419
  10. linux mysql 命令行查询 乱码_mysql命令提示行连接乱码的解决