自然语言处理本身是为了让计算机能够处理、理解以及运用人类语言,从而达到人与计算机之间的有效通讯,为了研究信息检索、情感分析、文本分类、智能问答、摘要提取、文本挖掘,舆情分析、知识图谱等方面的问题,解决在词态、句法、语义上的歧义性,这里主要是介绍我个人在使用相关算法学习时使用的开源标注工具和标注平台,以供参考。
文本研究领域:
从几大领域中不难从中看出NLP是围绕着四个模块展开的:分类、序列标注、文本匹配、文本生成。
NLP分类/聚类:
NLP分类的算法总结:
1.基于规则的方法(常用于未有规则设定过的特殊场景)
一般来说,使用规则的场景特殊,很难扩展到其他场景们,需要一些专业知识来形成规则,维护成本较高,需要人工在由于训练导致的规则变化或者更新时重新总结规则,但面对非规范性的特殊场景,还是需要有选择的人工标注一定规模的数据,用于模型的评价和训练。
2.传统的机器学习文本分类:主要是获得基于词级层面的TF-IDF特征,n-gram特征,放入分类器训练,在文本的特征提取上,基于词级层面的TF-IDF特征,n-gram特征,主题词和关键词特征。基于句子级别的有句式,句子长度等特征。基于语义层面的特征也可以使用word2vec/GloVe/ELMo预训练语料库得到词向量,使用词向量合理的构造出文本的词向量作为文本的语义特征。
传统的机器学习分类优点在于其在训练速度快,易于理解中占据优势。TF-IDF的主要思想是:如果某一个词或短语在一篇文章中出现的频率高,并且在其他文章中很少出现,则认为此词或短语具有很好的类别区分能力,适合用于分类。TF-IDF=TF*IDF,ngram 主要思想是将可在源文本中找到的长度为 n 的相邻词的所有组合。所以传统机器学习分类的思路是要利用自然语言处理中的n-gram概念对文本进行特征提取,并且使用TFIDF对n-gram特征权重进行调整,然后将提取到的文本特征输入到Logistics回归、SVM等分类器中进行训练。但是,上述的特征提取方法存在数据稀疏和维度爆炸等问题,这对分类器来说是灾难性的,并且使得训练的模型泛化能力有限。因此,往往需要采取一些策略进行降维:停用词过滤,低频n-gram过滤,LDA等,fastText 是 facebook 于 2016 年开源出来的进行词与序列分类的模型. 就契合了传统机器学习分类的相关内容,非常适合做文本分类的机器学习处理,https://github.com/facebookresearch/fastText/blob/master/tutorials/supervised-learning.md 中有关于 fastText 项目的使用例程. 处理使用官方工具外, 还可以使用 keras 实现 fastText 模型.如果想从前往后做一遍的话,推荐https://www.analyticsvidhya.com/blog/2017/01/ultimate-guide-to-understand-implement-natural-language-processing-codes-in-python
这篇文章主要是讲解了从文本预处理的如何噪音消除、词汇规范化、对象标准化的概念和相关代码,并对如何在从句法分析中的语法进行解析、实体提取,并对常用模型TF-IDF,ngram,LDA,word2vec有相关的解析,后续分类使用的是textblob的朴素贝叶斯分类器和SVM。
3.深度学习文本分类:基于深度学习的文本分类方法,显然模型的结构和模型的参数将会对分类效果起到至关作用。在模型结构上常用的神经网络模型有CNN,RNN,GRU,Attention机制,Dropout等。
基础模型如CNN/RNN/GRU的各种组合模型,这里推荐原版:https://www.ahmedbesbes.com/blog/benchmarking-sentiment-analysis-models中文翻译版:https://zhuanlan.zhihu.com/p/39054002这篇文章主要是做了在嵌入预训练模型前后和传统机器学习分类与深度学习文本模型的对比,并包含这些相关模型的代码。如果对N vs N,N vs 1、1 vs N、N vs M四种经典的RNN模型有所疑问的话,https://zhuanlan.zhihu.com/p/28054589会是个很好的选择,基本上全部公式和推理过程都是用图像来表示,且对每个模型的应用领域,适合处理的情况都有说明。其他模型:Dropout、attention机制:注意力模型通常是应用在经典的 Encoder-Decoder 框架下的,也就是 RNN 中著名的 N vs M 模型,seq2seq 模型正是一种典型的 Encoder-Decoder 框架,关于这个模型着力推荐https://www.jianshu.com/p/004869fce12c 探索 Seq2Seq 模型及 Attention 机制,这篇文章对其计算步骤和概念讲解清楚,难得的是有个小任务且有详细的解决思路,非常值得推荐,注意的是其小任务的代码不在全文中,而在https://blog.csdn.net/qq_18603599/article/details/80581115,
当然除此之外,在模型参数的调节上,一方面需要设定好模型的参数学习率,另一位方面需要根据模型的使用特点和要分析的文本内容进行调节。
NLP分类相关数据集:THUCNews中文文本分类,74万篇新闻文档(2.19 GB)http://thuctc.thunlp.org/message 数据量大
Kesci平台短文本分类:https://www.kesci.com/home/dataset/5dd645fca0cb22002c94e65d/files
复旦大学计算机信息与技术系国际数据库中心自然语言处理小组:只找到一个百度云链接,未下
剩下的算法模型和数据集会在二的时候整理,说一下NLP文本标注工具吧
NLP的前期处理,特别是实体标注的前期处理,固然是有相关的训练包做为支持,但有些时候遇到的文本一段时间调研后发现定的方向没有公开数据集,所以必要的基于规则方法的训练也不可或缺。
文本标注工具和标注平台:
1.prodigy:演示在线演示demo 看着挺好的,比较坑的在于收费啊,而且不便宜,有一说一,我没找到中文版的地方(简直是一顿操作猛如虎,最后只能捂脸的代表)
2.YEDDA:只支持python2.7,比较吸引人的点是可以直接导入txt且开源,而且标注员界面用于给句子做标注,管理员界面提供针对同一文件的不同人员标注结果的对比等功能。作为一个开源工具还是很不错的,不过快捷键设置有点麻烦,没有情感类别或分类类别的标记功能,可标记种类数只有7种,对于不需要以上功能的来说,是非常好的选择。下载地址:https://github.com/jiesutd/YEDDA
3.BRAT在安装配置和情感方向可以参考https://blog.csdn.net/owengbs/article/details/49780225,可以自定义标注特殊区域,不过仅支持Linux系统,该工具只能生成.ann后缀的标注文件,还需要转换。
其他工具的话:https://blog.csdn.net/m0epNwstYk4/article/details/79083806,https://zhuanlan.zhihu.com/p/64745990两篇文章推荐,第一篇文章介绍市面上的标注工具,有工具截图和一些基本功能,比较节省选择时间,第二篇文章比较了诸多工具的优劣,只不过第二篇知乎我只找到了二、三,没找到一。
现在主流的是yedda和brat,各有优劣,不过我这次文本量比较多,有些好友没有linux,有些不愿意安python,而且YEDDA的快捷键确实有点难设,没有办法,看了http://www.mamicode.com/info-detail-2502570.html推荐京东众智,试了试,实体方面做的还是不错的,可以设置多级标签、支持预打标,导出和YADDA一样各个格式都支持,不过没有分词,操作也很简单,而且非常便宜,网址:https://biao.jd.com/wise
样例图: