Skip to content

Smilencelsy/NLP

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 

Repository files navigation

NLP


0x00.要求

  • 实现一个汉语自动分词系统(Chinese word segmentation) 本题目要求实现一个汉语自动分词系统,并在微博等非规范文本测试集上进行测试分析。如果在本题目中不考虑命名实体识别问题,歧义消解和集外词处理是汉语自动分词中的关键问题

    1. 设计实现一种基于文本内容/情感的文本自动分类方法(Text classification) 依据某种文本分类标准实现文本自动分类,并进行实验分析。针对汉语文本或英语文本均可

在当前流行的游戏中, 无论是MOBA、休闲还是FPS类游戏, 但凡是具有线上交流功能的游戏, 都会存在影响玩家体验的消极语言。其包括但不限于挂机、送人头、投降、辱骂等, 可以说, 消极语言很大程度上影响了游戏环境和风气。准确的识别发出消极语言的玩家, 并且对其进行惩罚, 具有净化游戏环境, 改善玩家体验等重大现实意义。

0x01.数据说明

此数据来源于腾讯某次游戏安全竞赛的自然语言处理方向赛题 train_data.txt 为训练集 validation_data_demo.txt 为输出集的格式

数据格式:qid \t言语数据\t标签(标签为0或者1) 0代表非消极言语,1代表消极言语。

0x02.思路分析

一、情感分类概述
人工智能目前已进入迅猛发展阶段,总体可以分为三个阶段,第一个阶段是计算智能的阶段,这个阶段计算机和人类相比是能存会算,它的超大存储量,超高计算速度完胜人类。第二个阶段是感知智能,以语音识别,图像识别为代表的技术迅猛发展; 第三个阶段是认知智能,这个阶段需要机器能够思考,能够具有情感,也就是说情感在人工智能认知阶段还是非常重要的。

何为情感?严格定义来讲就是情感是人对客观事物是否满足自己需要而产生的态度体验。社会媒体是观察人类情感的有效窗口,也就是说我们每天在社交媒体上的各种活动,包括购物,聊天,社区,资讯,生活等等,这些都流露出人在某些方面的情感资源。从情感分类的角度出发,人类的情感是多种多样的,比如喜极而泣,抱头痛哭,捶胸顿足,七情六欲,五味杂陈等等都表达了不同的情绪。

情感分类可以分为粗粒度和细粒度。粗粒度分类主要用于判断情感倾向,表明一个人对某件事或对某个物体的整体评价。情感计算中大多采用两种,一种是倾向性分类,即褒,贬,中的分类,还有一种是微博中经常出现的情绪分类,表示个人主观情绪的喜,怒,悲,恐,惊。而对于分类任务,传统文本分类的方法是通过训练样本,特征提取+机器学习模型,训练好参数,对未知样本进行分类预测。对于情感分类,考虑到特定的情感资源,相对于传统文本分类,有了更多可利用的知识。细粒度分类即针对评价对象及其属性的情感倾向,比如“iPhone10很不错,除了贵,买不起,新的iWatch可以买一个,跑步就不要带手机了”。这里面有两个评价对象,第一个评价对象的评价是iPhone很不错,但是很贵,在购买不购买上持否定态度,对于iWatch来讲,评价对象认为跑步时可以不用带手机,所以相对于iPhone来讲,更倾向于买iWatch。做细粒度情感分析时就要分别把不同的评价对象抽取出来,把评价词语,情感类别分别判定出来,这样就可以细粒度分析一个产品,服务甚至情感。

当然,这种分类任务要结合文本当中不同的评价对象,所以面向评价对象的情感分类有很多种方法,可以利用上下文信息,神经网络中的注意力机制,使某个评价对象和词语能更好地寻找到搭配,从而来判断。
(来源: 哈工大秦兵:机器智能中的文本情感计算| CCF-GAIR 2018)

在游戏的消极语言识别中,粗粒度识别可能不能很好的判别是否为消极语言。因为在大多数游戏里,玩家的发言中可能并不会带有强烈偏向性的名词。比如 “你送我个皮肤吧” 和 ”你送人头去吧“ ,两者的核心词都是“送”,但前者的谓语是皮肤,后者的谓语是人头,可能在一般的消极语言识别系统里,会笼统的将包含“送”这个字的句子判别为消极的,但实际上需要根据谓语来区分。(但不确定细粒度的是否就可以区分了? 如果只能区分评价对象的话,那送皮肤和送人头的对象都是“你”。但仍可以学习细粒度分类的思想)

二、隐式情感 无论是你听别人的话,还是自己表达情感时,可能未必会使用情感词。情感表达中有20%-30%是没有情感词的,它属于隐式情感,而隐式情感多使用事实型陈述和语言修辞表达,从隐式情感分布来讲,有事实型,有比喻型,有反问型,其中事实型情感占72%。采用事实型情感,比如一个人住到酒店,他在发微博时说“桌子上有一层灰”,这没有任何情感词,但实际上已经表达了他的不满,这就是事实型表述。再看褒义描述,“从下单到收到货不到24小时”,表明他称赞快递速度很快,但没有明显的表达词,这些都属于事实型表述。

这种事实型描述怎么挖掘?这种事实型表述出现很频繁,时候这个我们可以采用上下文,比如我说“桌子上有一层灰,很不高兴”,就可以把“桌子上有一层灰”定义为贬义的。在找不到上下文时,可以在其他文当中找到跟它匹配的形容词再判定情感。同时也可以借助外部知识,比如快递多长时间算快,或者说这个人身高1.8米,我们有个常识,一米几以上就算高个儿,类似这样的知识可以帮助我们进行隐式情感分析。除了事实型之外,还有一种是修辞型的,修辞型的更难区分,“拿机器人和人相比,‘你咋这么聪明呢?’平常你可以听到别人这么夸你或者这么讽刺你,但有的时候光看语言的话,我们很难判定是夸你聪明还是笨。从资源的角度来讲,理工大连大学林鸿飞老师有一些隐喻语料库,大学山西王素格老师有一些隐式情感语料库,分别对事实型和修辞型隐式情感提供了一定帮助。当然,语料库只是提供某些支持,隐式情感是一种含蓄的表达方式,隐式情感表达因为缺少情感词的指引,所以需要寻找新的表示方法。
(来源: 哈工大秦兵:机器智能中的文本情感计算| CCF-GAIR 2018)

隐式情感也是消极语言判定中的一个大问题。尤其是挂机、送人头之类消极比赛的语言,往往不会有强烈的语气词汇。

对于消极语言的识别可以归类为情感分析, 通过提取对话/文本中的情绪特征, 对玩家的语言进行情感评级, 以更高的分数表示正面的情感, 以较低的分数表示负面情绪, 可以通过设定阈值来调整提醒/警告/封禁的范围。

基于百度AI开放平台的代码进行应用 (https://github.com/baidu/Senta)
例: http://ai.baidu.com/tech/nlp/sentiment_classify (百度开放AI平台的情感计算接口 基于百度自己的深度学习框架PaddlePaddle)

注意: 数据中是按读音来划分的, 有很多生僻字体, 最好换成拼音再进行处理

0x03.具体实现

  • 中文分词
    用jieba测试了一下分词效果, 不是特别理想, 结果在data/all_model_segm.txt中。 主要是因为有些敏感字被屏蔽以后, 玩家用其他的字来替代, 导致分词识别不出来。另一方面口语化比较严重,有些省略/简写可能无法识别。

    Python常用的分词工具: 结巴分词 Jieba / Pymmseg-cpp / Loso / smallseg

    改进:

    • 基于百度的LAC(https://github.com/baidu/lac) 再做一次
    • 换一个词典
    • 拼音分词? / 先字音转换 再音字转换 重点:词义消歧
  • 词典
    所有王者荣耀的英雄名字和简称
    常用的网络用语和简写
    常用的消极语言

  • 消极语言分类
    挂机类、送人头类、辱骂队友类(可以上lol客户端的举报界面看一看)

这个博客写的不错,可以复现一遍: https://www.jianshu.com/p/4cfcf1610a73

0x04.评价标准

score = 4PR / ( P + 3R ) * 100%
P为验证集验证结果整体的准确度
R表示验证集结果被判为消极语言在真实消极言语中的覆盖度


参考文献

About

The homework of NLP class.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published