精华内容
下载资源
问答
  • 文本处理开源工具包
    2020-11-26 04:29:34

    ainlp-qun-r2l.png

    曾经因为NLTK的缘故开始学习Python,之后渐渐成为我工作中的第一辅助脚本语言,虽然开发语言是C/C++,但平时的很多文本数据处理任务都交给了Python。离开腾讯创业后,第一个作品课程图谱也是选择了Python系的Flask框架,渐渐的将自己的绝大部分工作交给了Python。这些年来,接触和使用了很多Python工具包,特别是在文本处理,科学计算,机器学习和数据挖掘领域,有很多很多优秀的Python工具包可供使用,所以作为Pythoner,也是相当幸福的。其实如果仔细留意微博,你会发现很多这方面的分享,自己也Google了一下,发现也有同学总结了“Python机器学习库”,不过总感觉缺少点什么。最近流行一个词,全栈工程师(full stack engineer),作为一个苦逼的创业者,天然的要把自己打造成一个full stack engineer,而这个过程中,这些Python工具包给自己提供了足够的火力,所以想起了这个系列。当然,这也仅仅是抛砖引玉,希望大家能提供更多的线索,来汇总整理一套Python网页爬虫,文本处理,科学计算,机器学习和数据挖掘的兵器谱。

    一、Python网页爬虫工具集

    一个真实的项目,一定是从获取数据开始的。无论文本处理,机器学习和数据挖掘,都需要数据,除了通过一些渠道购买或者下载的专业数据外,常常需要大家自己动手爬数据,这个时候,爬虫就显得格外重要了,幸好,Python提供了一批很不错的网页爬虫工具框架,既能爬取数据,也能获取和清洗数据,我们也就从这里开始了:

    Scrapy, a fast high-level screen scraping and web crawling framework for Python.

    鼎鼎大名的Scrapy,相信不少同学都有耳闻,课程图谱中的很多课程都是依靠Scrapy抓去的,这方面的介绍文章有很多,推荐大牛pluskid早年的一篇文章:《Scrapy 轻松定制网络爬虫》,历久弥新。

    You didn't write that awful page. You're just trying to get some data out of it. Beautiful Soup is here to help. Since 2004, it's been saving programmers hours or days of work on quick-turnaround screen scraping projects.

    读书的时候通过《集体智慧编程》这本书知道Beautiful Soup的,后来也偶尔会用用,非常棒的一套工具。客观的说,Beautifu Soup不完全是一套爬虫工具,需要配合urllib使用,而是一套HTML/XML数据分析,清洗和获取工具。

    Html Content / Article Extractor, web scrapping lib in Python

    Goose最早是用Java写得,后来用Scala重写,是一个Scala项目。Python-Goose用Python重写,依赖了Beautiful Soup。前段时间用过,感觉很不错,给定一个文章的URL, 获取文章的标题和内容很方便。

    二、Python文本处理工具集

    从网页上获取文本数据之后,依据任务的不同,就需要进行基本的文本处理了,譬如对于英文来说,需要基本的tokenize,对于中文,则需要常见的中文分词,进一步的话,无论英文中文,还可以词性标注,句法分析,关键词提取,文本分类,情感分析等等。这个方面,特别是面向英文领域,有很多优秀的工具包,我们一一道来。

    继续阅读 →

    更多相关内容
  • 文本清洗是一个繁琐复杂的工作,不论是对于NLP 的开发者,还是其它领域工作者。这部分工作可以由 JioNLP 工具包一键搞定!!! ⭐ 源码戳这里 => JioNLPhttps://github.com/dongrixinyu/JioNLP ⭐ (在线文本...

    文本清洗是一个繁琐复杂的工作,不论是对于NLP 的开发者,还是其它领域工作者。这部分工作可以由 JioNLP 工具包一键搞定!!!

    ⭐ 源码戳这里 => JioNLPhttps://github.com/dongrixinyu/JioNLPicon-default.png?t=L892https://github.com/dongrixinyu/JioNLP

    ⭐ (在线文本清洗)戳这里 => 在线文本清洗使用

    工具包安装 Installation

    • python>=3.6 github 版本略领先于 pip
    $ git clone https://github.com/dongrixinyu/JioNLP
    $ cd ./JioNLP
    $ pip install .
    
    • pip 安装
    $ pip install jionlp
    
    • 可能存在的问题
    # 如安装失败,遇到安装时提示的 pkuseg、Microsoft Visual C++、gcc、g++ 等信息,
    # 则说明是 pkuseg 安装失败,需要在相应系统中安装 C 和 C++ 编译器,重新安装。
    # pip install pkuseg

     工具包使用 Usage

    清洗文本,主要步骤包括去除 html 标签、去除异常字符、去除冗余字符、去除括号补充内容、去除 URL、去除 E-mail、去除电话号码,将全角字母数字空格替换为半角,一般用于将其当做无关噪声,处理分析数据。

    >>> text = '''<p><br></p>       <p><span>创历史!张帅美网女双夺冠创6纪录 大满贯双打2冠并列中国金花第1(号外)</span></p><p><span>fds</span></p><p><span>北京时间9月13日,2021年美网女双决赛展开角逐,跨国组合张帅/斯托瑟对决美国组合高芙/麦克纳莉。张帅/斯托瑟以总比分2-1击败高芙/麦克纳莉,三盘具体比分是6-3、3-6和6-3,从辛辛那提赛开始豪取一波11连胜,成功夺得美网女双冠军,张帅生涯首次夺得美网女双冠军,也是生涯第2次夺得大满贯双打冠军。(责任编辑:唐小林)联系电话:13302130583,邮箱:dongrixinyu.89@163.com~~~~'''
    >>> res = jionlp.clean_text(text)
    >>> print(res)
    >>> print(jionlp.clean_text.__doc__)
    
    # '创历史!张帅美网女双夺冠创6纪录 大满贯双打2冠并列中国金花第1fds北京时间9月13日,2021年美网女双决赛展开角逐,跨国组合张帅/斯托瑟对决美国组合高芙/麦克纳莉。张帅/斯托瑟以总比分2-1击败高芙/麦克纳莉,三盘具体比分是6-3、3-6和6-3,从辛辛那提赛开始豪取一波11连胜,成功夺得美网女双冠军,张帅生涯首次夺得美网女双冠军,也是生涯第2次夺得大满贯双打冠军。联系电话:,邮箱:~ '
    
    • 去除异常字符主要指由于非 UTF-8 编码造成的异常字符,如“板簳浠?拷涔”等
    • 去除冗余字符主要指文本中有多个连续的空格,“~~~~”等重复冗余信息,缩减为1个字符。
    • 该方法中的所有关键字参数均为 bool 型,支持选择控制是否去除相应类型的数据
    • 所有选项都可以自己控制调控。搞明白之后,来 在线文本清洗使用 试试吧。

    如果觉得好用请点个 Star 赞吧 

    展开全文
  • 接下来将会分别介绍中英文预处理中的重点环节,结合实际介绍和使用包括jeba,NLTK 等工具包,实现分词和词干提取等步骤,最后展示完成一个(词频统计)实际任务。 一般来说,文本数据预处理的第一步是文本清洗,这个环节...
  • 深度学习之文本分类总结

    千次阅读 2022-03-21 22:21:00
    一、文本分类概况 二、文本分类的发展 三、文本分类常用的模型结构 四、文本分类模型实际中遇到的问题(Q&A)

    一、文本分类概况

    文本分类是NLP中的最基础的一个任务,很多场景中都涉及到,比如对话机器人、搜索推荐、情绪识别、内容理解,企业风控,质量检测等方向。在对话机器人中,一般的文本分类任务主要是解决 用户query 的意图,确定相关domain.在确定的 domain中进行 NLU的语义理解,进而下游更多的任务。针对 内容理解 或者风控,质检方向都是针对于用户的query进行理解和意图识别,确定是否是涉黄涉爆,等非法的输入,进而进行控制,由于本人主要是做对话NLU 相关的,具体的其他的场景 不做过多叙述,主要分为以下两种情况:

    多分类(Multi-Class)

    1.二分类, 如邮件垃圾分类,0-1分类,只有两种情况,也可以使用于据识模型中

    2.三分类,情感分类,【正面,中立,负面】,情绪识别

    3.多分类,意图识别,domain领域识别,新闻类别识别,财经、体育、娱乐等

    以上统称为多分类领域,每一个类别是独立的

    多标签分类(Multi-Lable)

    1.多领域类别,比如说,帮我打开导航、并播放一首歌曲、此时刻的domain 属于 musicX音乐 、mapU 导航领域

    2.文本段落,可能即属于金融领域 也属于政治领域

    多标签分类,主要的区别是 每一个类别不是独立的,每一个文本可以有多个标签

    区别

    1.多分类任务中一条数据只有一个标签,但这个标签可能有多种类别。比如判定某个人的性别,只能归类为"男性"、"女性"其中一个。再比如判断一个文本的情感只能归类为"正面"、"中面"或者"负面"其中一个。

    2.多标签分类任务中一条数据可能有多个标签,每个标签可能有两个或者多个类别(一般两个)。例如,一篇新闻可能同时归类为"娱乐"和"运动",也可能只属于"娱乐"或者其它类别。

    二、文本分类常见的方法

    文本分类主要是分为两种,一种是前几年兴起的 传统的机器学习方案,其次是近几年的深度学习模型(https://github.com/649453932/Chinese-Text-Classification-Pytorch)https://github.com/649453932/Chinese-Text-Classification-Pytorch

    传统的机器学习模型(浅层学习模型)

    1.以统计模型占主导,如朴素贝叶斯分类(NB), K近邻(KNN),支持向量机(SVM) 、以及树模型结构 XGBoost和LightGBM

    上文提到的模型,与早期的基于规则的方法相比,该方法在准确性和稳定性方面具有明显的优势。但是,这些方法仍然需要进行功能设计,这既耗时又昂贵。此外,它们通常会忽略文本数据中的自然顺序结构或上下文信息,这使学习单词的语义信息变得困难

    2.浅层学习模型,词袋子模型,tf-idf统计等

    浅层学习模型,主要是忽略掉了文本的语法和语序,用特定的一些符号表示一个文本或者段落。

    词袋子模型(BOW)用一组无序的单词序列来表达一段文字或者一个文档, 把整个文档集的所有出现的词都丢进袋子里面,然后 无序去重 地排出来(去掉重复的)。对每一个文档,按照词语出现的次数来表示文档

    以下例子(来源于网络):

    句子1:我/有/一个/苹果
    
    句子2:我/明天/去/一个/地方
    
    句子3:你/到/一个/地方
    
    句子4:我/有/我/最爱的/你

     统计所有的词语,放到一个袋子中,得到10个单词: “我,有,一个,苹果,明天,去,地方,你,到,最爱的“

    得到4个句子的特征如下:

    • 句子 1 特征: ( 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 )
    • 句子 2 特征: ( 1 , 0 , 1 , 0 , 1 , 1 , 1 , 0 , 0 , 0 )
    • 句子 3 特征: ( 0 , 0 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 )
    • 句子 4 特征: ( 2 , 1 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 1 )

    通过以上方案,亦能得到句子的浅层语义表达,可以进行基本的下游任务,如相似度计算,文本分类等任务

    缺点就是:语义表达非常稀疏,容易造成维度灾难 只能表示词语本身 ,无法体现单词语义信息,以及单词之间的关系

    TF-IDF模型:

    主要是使用词汇统计的词频特征来 作为句子的语义表征,TF表示的(Term frequency,词频) IDF 表示的是(Inverse document frequency ) 逆文档频率 。

    TF即词频(Term Frequency),每篇文档中关键词的频率(该文档单词/该文档单词总数),TF体现的是词语在文档内部的重要性,举个例子,有两篇文档 d_{1} 和d_{2},

    d1 = (A,B,C,D,A),一共是5个单词,d2 = (B,E,A,B), 一共是4个单词。得到如下的TF计算结果:

     IDF即逆文档频率(Inverse Document Frequency),文档总数/关键词t出现的文档数目,即  IDF= log(\frac{D}{1+D_{i}})          D代表文档的总体数目,分母部分D_{i} 表示的是  包括该词语的文档数目,原始公式是分母没有 +1 的,这里是采用了拉普拉斯平滑,避免了有部分新的词没有在语料库中出现而导致分母为零的情况出现。IDF体现的是 词语在文档中的重要性,如果某个词语在 文档中出现的次数越少,表示的  idf 数值越大,越重要。得到如下的,IDF 数值:

     d1 文档的向量化表示(最终的结果是 tf * idf):

    后面再通过向量的余弦相似度计算,得到语义的相似度

    深度学习模型时代(文本分类模型)

    1.Fasttext 模型

    论文:https://arxiv.org/abs/1607.01759
    代码:https://github.com/facebookresearch/fastText

    fastText是Facebook于2016年开源的一个词向量计算和文本分类工具,包含文本分类和词向量训练两个功能。把输入转化为词向量,取平均,再经过线性分类器得到类别。输入的词向量可以是预先训练好的,也可以随机初始化,跟着分类任务一起训练。最终的embedding 也是分类的产物。

     上图为模型结构图,目前多数人也在使用 fastText模型,主要是由于:

     1.模型本身比较简单,能快速的产生baseLine

     2.采用char-level(字符级别)的 n-gram作为附加特征,这里举个例子,apple 这个单词,bigram 是:[ap,pp,pl,le]  ,trigram结果是[app,ppl,ple],最终的模型输入,是把apple转化为embedding 和  bigram 、trigram也转成embedding , 最终拼接一起 作为输入。

    2.TextCNN 模型

    TextCNN是Yoon Kim小哥在2014年提出的模型,相关论文和仓库如下:

     论文:https://arxiv.org/abs/1408.5882
     代码:https://github.com/yoonkim/CNN_sentence

    TextCNN 使用的是一维的卷积操作,图像中多数使用的是二维卷积.参考代码如下:

    CNN网络结构不清楚的,可以看另一篇Blog,其中有详细的解释CNN网络结构。

    大致的步骤如下

    1.输入query 经过embedding 得到,[batch_size,seq_len,embedding_dim]

    2.设置卷积核的大小为 [filter_size * embedding_dim],filter_size一般为滑动窗口的大小(先不理解没关系),假设一共有N个卷积核,得到N个长度为,seq_len - filter_size + 1 大小的一维feature_map,比如句子长度为10,filter_size的长度为2,最终得到的feature_map的长度为10-2+1= 9

    3. feature_map进行max-pooling 得到N个 1*1的数值,最终为N维向量,作为句子的表达,最终得到 [batch_size,N]的结果,如果 batch_size = 64, N = 256 ,那么最终得到的向量为[64,256]

    4.最终结果 经过 全连接网络,线性变化,最后进行softmax分类

    相关解释

    卷积核大小为2的时候,一次处理2-gram,也就是2个单词,卷积核大小为3-gram,一次处理三个大小的单词。 所以卷积核在对文本进行卷积的操作,更像是对在提取文本在n-gram上的特征。

    取不同卷积核大小进行卷积操作的原因,可以理解为提取这个句子中多个维度不同的信息,使得特征更加的丰富。所以上文中使用了 不同filter_size  的 卷积层 进行 conv1,conv2,conv3来进行提取特征

    这个其中有些需要注意的优化的点,可以参考以下博客(一个大神写的):

    https://mp.weixin.qq.com/s?__biz=MzAxMTk4NDkwNw==&mid=2247485854&idx=1&sn=040d51b0424bdee66f96d63d4ecfbe7e&chksm=9bb980faacce09ec069afa79c903b1e3a5c0d3679c41092e16b2fdd6949aa059883474d0c2af&token=793481651&lang=zh_CN&scene=21#wechat_redirect

    CNN模型主要是 基于上下文token的编码,然后pooling出句子再进行分类,池化时候,max-pooling表现效果最好,文本分类颗粒度比较高,只需要关注部分的关键词即可

    3. Rnn+ Attention 模型

    论文:https://www.aclweb.org/anthology/P16-2034.pdf
    代码:https://github.com/649453932/Chinese-Text-Classification-Pytorch

    RNN 模型现在主流的都是LSTM模型、GRU类型的,针对颗粒度比较细的语义表征,需要使用attention进行

     H表示的是LSTM模型输出的 hidden信息,其中 w是context vector,随机初始化并随着训练更新。最后得到句子表示r ,再进行分类。

    attention 的作用 主要是 寻找句子中,对句子含义最重要,贡献最大的词语找出来

     

     4. Bert模型

    1. 不同的预训练模型,比如ELECTRA、RoBERT、WWM、ALBERT

    2. 除了 [CLS] 外还可以用 avg、max 池化做句表示,也可以各种组合起来

    3. 在领域数据上增量预训练,结合多任务的预训练

    4. Boosting的思想,使用集成蒸馏,训多个大模型集成起来后蒸馏到一个,理论上会有一定的提升(涉及到知识蒸馏)

    5. 先用多任务训,再迁移到自己的任务

    三、文本分类模型实际中遇到的问题(Q&A)

    1.模型的选择问题

    • 短文本,可以尝试下 TextCNN 模型,fastText模型,作为一个基线baseLine的效果
    • 长文本,可以尝试使用RNN 模型,如BiLSTM模型、GRU模型,后接上一个attention注意力机制

    无脑使用Bert模型  但是,要是模型上线 还是需要考虑下模型的推理性能,使用模型的知识蒸馏,或者使用多个大模型的集成,再去蒸馏到一个小模型

    2.样本类别不均衡问题   

        样本不均衡问题,对于Nlp任务来说,基本上都是老生常谈的问题,不管是在分类还是NER中经常会出现,针对这些问题的解决办法,网上也是一大堆,知乎博客,到处都是,这里只是做一个简单的整理吧。这里提一点,样本数量不均衡的本质,还是样本难易程度不一样,本质上还是一个 hard example的问题 。通常是两种方案,一个是样本数据上修改(重采样),另一个是train的时候 Loss部分的修改(重加权)

    • 重采样
      • 欠采样,去掉一些case
      • 过采样,可能会导致一些过拟合现象
      • 数据增强非常常用的方案,较为常见的方法为,EDA(增加,删除,同义词替换)、回译、Masked LM(借鉴预训练语言模型(如BERT)中的自编码语言模型,可以启发式地Mask词汇并进行预测替换)、句法交换、SIMBERT 等预训练模型生成相似度句子,等等
    • 重加权,重加权就是改变分类loss。相较于重采样,重加权loss更加灵活和方便。其常用方法
      • loss类别加权,通常根据类别数量进行加权,加权系数\alpha与类别数量成反比  
      • Focal Loss, 上述loss类别加权主要关注正负样本数量的不平衡,并没有关注难易不平衡。Focal Loss主要关注难易样本的不平衡问题,可根据对高置信度(p)样本进行降权 
        loss类别加权
                                       
      focal loss

    3.数据相关问题

    • 任务定义:先和产品定义好场景和分类任务,初略看看数据,是否有些歧义的数据,挑选出来找产品定义好,尽量规避那些歧义的定义说法,不管是去掉该类说法,还是说统一规定为某一个分类label ,总之人都区分不了的问题,别想着让模型去解决
    • 数据清洗
      • 标注错误问题,模型测试集错误的case,拿出来,规则筛选一遍,同时检查下训练集中的 case,是否有case标注错误的例子,就是训练集中是否存在同样类似的case,标注存在不一致性。
      • 去掉文本强pattern, 很多对文本无意义,出现频次较高的pattern去掉,如,对一段文本进行 意图识别,属于“财经、体育、政治”等Label,文本中出现大量的 xx报道说法,对于文本无意义的说法。
    • 大量无标注数据使用(挖掘无标注数据的价值,利用自监督和半监督学习)
      • 自监督学习,目前火热的预训练模型(Pre-model) 充分利用无标注数据,展现强大能力,进行任务级别的预训练,如,设计分类任务时候,我们在预训练时候 ,MLM的loss 可以和分类的loss一起 进行多任务学习
      • 半监督学习,使用baseLine模型 学习去预测 无标注数据,然后利用数据蒸馏知识生成大量带标签的 数据

    4.分类的损失函数选择

            

    •  sigmod分类
      • 使用于二分类,类似于常用的0、1分类,Torch版本 是 BCELoss()函数
    • softmax分类 
      • lable标签的多分类,torch版本使用的是 nn.CrossEntropyLoss()函数  

       由上图所示,对于多分类的任务,可以定义为,多个二分类,如N分类的任务,我们可以定义N个 sigmoid二分类。优点

            1.每个分类domain 单独维护不同的fc解码层,可以后续支持多意图的输出,解码空间相对于之前的softmax 扩大

            2.新分类domain增加,维护成本较小,只需要更新 fc层就可以,减少对其他的domain的干扰

            3.实际上,每一个domain的fc层,就是一个据识模型,后续可以修改训练策略,灵活的对定义的domain进行据识                                                        

    展开全文
  • 文本分类1.1 文本分类方法基于传统机器学习的文本分类1.2 文本分类的一般流程2. 基于向量空间模型(VSM)的文本表示方法2.1 one-hot表示2.2 VSM① 文档(Document)② 项(Term)2.3 特征选择常用方法① 文档频率DF②...

    1. 文本分类

    Text Categorization/Text Classification/TC

    是根据给定文本的内容,将其判别事先确定的若干个文本类别中的某一类或某几类的过程

    给定:
    • 一个实例的描述, x ∈ X x∈X xX, X X X是实例空间
    • 一个固定的文本分类体系: C = c 1 , c 2 , … c n C={c1, c2,…cn} C=c1,c2,cn
    • 由于类别是事先定义好的,因此分类是有指导的(或者说是有监督的)
    确定:
    • 实例x的类别 c ( x ) ∈ C c(x)∈C c(x)C c ( x ) c(x) c(x)是一个分类函数,定义域是X,值域是C

    例如中图分类法:
    image-20210422100523051

    1.1 文本分类方法

    基于传统机器学习的文本分类

    随着统计学习方法的发展,在90年代后解决大规模文本分类问题的主要套路是人工特征工程+浅层分类模型。整个文本分类问题拆分成特征工程和分类器两部分

    image-20210330090918041

    这里的特征工程也就是将文本表示为计算机可以识别的、能够代表该文档特征的特征矩阵的过程。我们通常将特征工程分为文本预处理、特征提取、文本表示等三个部分。

    1.2 文本分类的一般流程

    1. 收集训练集和测试集,对文本进行预处理
      • 数据清洗,去除指定无用的符号
      • 让文本只保留汉字
      • 对文本进行分词(词性标注)
      • 去除停用词
    2. 对文本类别进行人工标注
    3. 对文本进行特征提取、文本表示
    4. 训练(学习)
    5. 评价:精确率、召回率、F1;宏平均、微平

    对于特征工程中的文本表示,有下面几个方法:

    2. 基于向量空间模型(VSM)的文本表示方法

    对于下面两个文本,人类是如何区别的?

    A. 中信证券建筑首席分析师罗鼎认为,发改委加大对重大基础设施建设项目审批力度,凸显逆周期调节重要性。
    B. 2018年5月,太原国际马拉松赛被国际田联认定为银标赛事,成为全国第八个获得这项荣誉的马拉松赛

    显然,在人的意识里,是通过几个关键词来区分文本的,这对于我们有一定的启发

    2.1 one-hot表示

    对一个语料库S中的所有句子 s ∈ S , s = w 1 w 2 … w n s∈S,s=w_1w_2…w_n sSs=w1w2wn。抽取其中包含的所有词汇 w i w_i wi,因为语气词对于文本的主题分类一般不起作用,所以去除其中的停用词(的、了、在、呢、啊等等),记为集合W。

    对任意 w i ∈ W w_i ∈W wiW统计其在S中出现文档频次的文档频次 d f ( w ) df(w) df(w),依照频次大小降序排列,取排序前 N − M N-M NM位或前 N N%-M%(N<M) N的词汇作为描述这个语料库S的特征集合 W d f W_{df} Wdf

    image-20210407102554635

    W d f W_{df} Wdf为基础可将一个文本表示为一个k维0-1向量V, k = ∣ W d f ∣ k = | W_{df}| k=Wdf,称之为one-hot表示或者词袋模型表示。

    V i = { 1 , w i ∈ W d f , w i  in  s 0 , w i ∈ W d f , w i  not in  s (1) V_{i}=\left\{\begin{array}{c}1, \quad w_{i} \in W_{d f}, w_{i} \text { in } s \\ 0, \quad w_{i} \in W_{d f}, w_{i} \text { not in } s\end{array}\right. \tag{1} Vi={1,wiWdf,wi in s0,wiWdf,wi not in s(1)

    One-hot模型是VSM的一种简化形式

    例如:

    A. 中信证券建筑首席分析师罗鼎认为,发改委加大对重大基础设施建设项目审批力度,凸显逆周期调节重要性。
    B. 2018年5月,太原国际马拉松赛被国际田联认定为银标赛事,成为全国第八个获得这项荣誉的马拉松赛。

    假设有特征词集Wtf = {证券,分析师,发改委,审批,马拉松,田联,赛事}。那么例句A、B分别表示为:
    A = [ 1 , 1 , 1 , 1 , 0 , 0 , 0 ] B = [ 0 , 0 , 0 , 0 , 1 , 1 , 1 ] A = [1, 1, 1, 1, 0, 0, 0] B=[0, 0, 0, 0, 1, 1, 1] A=[1,1,1,1,0,0,0]B=[0,0,0,0,1,1,1]

    2.2 VSM

    向量空间模型,VSM,Vector Space Model,由Salton等人于20世纪70年代提出

    VSM把对文本内容的处理简化为向量空间中的向量运算,并且它以空间上的相似度表达语义的相似度(当文档被表示为文档空间的向量,就可以通过计算向量之间的相似性来度量文档间的相似性 )。

    VSM包括:

    • 用于表征文档语义的特征
    • 这些特征的组织方式

    可以说,自然语言处理的核心是文本的向量化表示

    ① 文档(Document)

    泛指一般的文献或文献中的片断(段落、句子组或句子),一般指一篇文章。

    ② 项(Term)

    当文档的内容被简单地看成是它含有的基本语言单位(字、词、词组或短语等)所组成的集合时,这些基本的语言单位统称为项,即文档可以用项集(Term List)表示为 D ( T 1 , T 2 … , T n ) D(T_1,T_2…,T_n) D(T1,T2,Tn)

    注意:标点符号可以应用到文档的语体分类,在反动信息过滤中也有重要的作用 。

    TF:一个词在一个文档出现次数

    DF:一个词出现在几个文档中

    2.3 特征选择常用方法

    ① 文档频率DF

    文档频率(Document frequency ) 指在训练语料中出现某词条的文档数

    选取的DF在某个范围内。因为出现太少,没有代表性,出现太多,没有区分度。

    ② 信息增益IG

    对于特征词条t和文档类别c,IG考察c中出现和不出现t的文档频数来衡量t对于c的信息增益

    I G ( t ) = − ∑ i = 1 m P ( c i ) lg ⁡ P ( c i ) + P ( t ) ∑ i = 1 m P ( c i ∣ t ) lg ⁡ P ( c i ∣ t ) + P ( t ˉ ) ∑ i = 1 m P ( c i ∣ t ˉ ) lg ⁡ P ( c i ∣ t ˉ ) (2) I G(t)=-\sum_{i=1}^{m} P\left(c_{i}\right) \lg P\left(c_{i}\right)+P(t) \sum_{i=1}^{m} P\left(c_{i} \mid t\right) \lg P\left(c_{i} \mid t\right) +P(\bar{t}) \sum_{i=1}^{m} P\left(c_{i} \mid \bar{t}\right) \lg P\left(c_{i} \mid \bar{t}\right) \tag{2} IG(t)=i=1mP(ci)lgP(ci)+P(t)i=1mP(cit)lgP(cit)+P(tˉ)i=1mP(citˉ)lgP(citˉ)(2)
    其中 P ( C i ) P(C_i) P(Ci)表示类文档在语料中出现的概率, P(t)表示语料中包含特征词条 t 的文档的概率, P ( C i ∣ t ) P(C_i|t) P(Cit) 表示文档包含特征词条 t 时属于类的条件概率, P ( t ˉ ) P(\bar{t}) P(tˉ)表示语料中不包含特征词条 t 的文档的概率, P ( C i ∣ t ˉ ) P(C_i|\bar{t}) P(Citˉ)表示文档不包含特征词条 t 时属于类的条件概率, m 表示文档类别数。

    如果选择一个特征后,信息增益最大(信息不确定性减少的程度最大),那么我们就选取这个特征。

    • 优点:考虑了词条未发生的情况,即虽然某个单词不出现也可能对判断文本类别有贡献。
    • 缺点:非平衡问题下表现差(在类分布和特征值分布是高度不平衡的情况下其效果就会大大降低了)

    ③ 互信息(MI)

    通过计算特征词条t和类别c之间的相关性来完成提取的 :

    M I ( t , c ) = log ⁡ P ( t c ) P ( t ) × P ( c ) (3) MI( t , c ) = \log \frac { P ( t c ) } { P ( t ) \times P ( c ) } \tag{3} MI(t,c)=logP(t)×P(c)P(tc)(3)

    如果用A表示包含特征词条t且属于类别c的文档频数,B为包含t但是不属于c的文档频数,C表示属于c但不包含t的文档频数,N表示语料中文档的总数,t和c的互信息可由下式计算 :

    M I ( t , c ) ≈ lg ⁡ A × N ( A + C ) × ( A + B ) (4) M I(t, c) \approx \lg \frac{A \times N}{(A+C) \times(A+B)} \tag{4} MI(t,c)lg(A+C)×(A+B)A×N(4)

    在这里插入图片描述

    χ 2 \chi^{2} χ2统计量

    度量特征词条t和文档类别c之间的相关程度,并假设t和c之间符合具有一阶自由度的分布 。(特征词条对于某类的统计值越高,它与该类之间的相关性越大,携带的类别信息也越多,当的值为0时,属性t与类别c完全独立 )

    令N表示训练语料中的文档总数 ,D是既不属于c也不包含t的文档频数 ,可用下式表示:

    χ 2 ( t , c ) = N ( A D − C B ) 2 ( A + C ) ( B + D ) ( A + B ) ( C + D ) (5) \chi^{2}(t, c)=\frac{N(A D-C B)^{2}}{(A+C)(B+D)(A+B)(C+D)} \tag{5} χ2(t,c)=(A+C)(B+D)(A+B)(C+D)N(ADCB)2(5)

    其中, N = A + B + C + D N=A+B+C+D N=A+B+C+D

    (注:一般上面公式只适用于二分类的情况)

    几种特征选择方法性能比较:

    依据上一步得到文本的表示特征,构建向量空间模型, 计算每个句子表示向量表示中每一个特征维度的权重(权重计算)

    2.4 权重计算

    ① TF-IDF

    词频-逆文档频度(Term Frequency - InverseDocument Frequency,TF-IDF)

    字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。为了同时考虑两部分的影响,提出了TF-IDF ,定义如下:

    词 频 ( T F ) =  某个词在文章中的出现次数   文章的总词数  (6) 词频(TF) =\frac{\text { 某个词在文章中的出现次数 }}{\text { 文章的总词数 }} \tag{6} (TF)= 文章的总词数  某个词在文章中的出现次数 (6)

    逆 文 档 频 率 ( I D F ) = log ⁡  语料库文档数   包含该词的文档数  (7) 逆文档频率(I D F)=\log \frac{\text { 语料库文档数 }}{\text { 包含该词的文档数 }} \tag{7} (IDF)=log 包含该词的文档数  语料库文档数 (7)

    T F − I D F = T F ∗ I D F (8) TF-IDF=TF*IDF \tag{8} TFIDF=TFIDF(8)

    可以看到,IDF反应了一个词在所有文本中出现的频率,如果一个词在很多的文本中出现,那么它的IDF值应该低。一个极端的情况,如果一个词在所有的文本中都出现,那么它的IDF值应该为0。

    常用的IDF我们需要做一些平滑,使语料库中没有出现的词也可以得到一个合适的IDF值。
    逆 文 档 频 率 ( I D F ) = log ⁡  语料库文档数   包含该词的文档数+1  逆文档频率(I D F)=\log \frac{\text { 语料库文档数 }}{\text { 包含该词的文档数+1 }} (IDF)=log 包含该词的文档数+1  语料库文档数 

    ② scikit-learn预处理

    用scikit-learn进行TF-IDF预处理,有两种方法可以进行TF-IDF的预处理 :

    CountVectorizer+TfidfTransformer

    from sklearn. feature extraction. text import Tfidftransformer
    from sklearn. feature extraction. text import Countvectorizer
    
    corpus=["I come to China to travel",
    	"This is a car polupar in China",
    	"I love tea and Apple"]
    
    vectorizer=Countvectorizer()
    
    trans former Tfidftrans former()
    tfidf =transformer fit transform(vectorizer.fit_transform(corpus))
    print tfidf
    

    用scikit-learn进行TF-IDF预处理
    输出格式: (文档id,全局词id,tfidf权重)

    image-20210422091516215

    2.5 VSM的评价

    优点:
    简单易用

    缺点:

    • 维数灾难现象
      在大数据环境下,高维的特征对于深层语义表示而言,其计算复杂度是难以接受的。

    • 词汇鸿沟现象

      one-hot:

    在这里插入图片描述

    显然,二者是正交的, s i m ( s t a r , s u n ) = 0 sim(star,sun)=0 sim(star,sun)=0,任意两个词之间都是孤立的,丢失了词之间语义关联关系的信息,所以提出了基于矩阵的文本表示方法 。

    3. 基于矩阵的文本表示方法

    1954年,Harris最早提出了词语义的分布假说
    (distributional hypothesis),他认为:“具有相似上下
    文的词语也具有相似的语义” 。奠定了词语分布式语义表示(distributional semantic representation) 的理论基础。现在,在此基础上,主要分为基于矩阵的表示和基于神经网络的表示两种类型。

    Count-based distributional representation (基于分布式表示)

    image-20210401090929861

    上下文信息嵌入到了词向量表示中(词嵌入,word embedding)

    每个词都在一个低维空间中表示为一个稠密实值的向量。

    3.1 基于矩阵

    基于矩阵的文本深层表示以“词-上下文”矩阵为核心,需要构建一个“词-上下文”矩阵,从矩阵中获取词的表示。

    在“词-上下文”矩阵中,每行对应一个词,每列表示一种不同的上下文,矩阵分量表示对应的上下文对该词影响的权重。

    1. 例一:以词共现作为权重为例

    I love monkeys.
    Apes and monkeys love bananas

    窗口值设为2

    image-20210401091203418

    在这种表示下,矩阵中的一行,就成为了对应词的表示,这种表示描述了该词的上下文的分布。比如此时的bananas的词向量就是[0 1 0 0 0 0]

    1. 例二:文档级上下文

    D1, I love monkeys.
    D2, Apes and monkeys love bananas

    image-20210401091536794

    此时的bananas的词向量就是[0, 1]

    一般来说,对于上下文的选择可分为:

    1. 文档级,将该词出现的整个文档作为上下文

    2. 词窗口级,将该词上下文中选取长度固定的词窗口内的词作为上下文

    3. n-gram窗口级,将该词上下文首先表示为ngram模型,之后再选取长度固定的词窗口内的ngram 词组作为上下文

      相对而言,词窗口级因具有较低的稀疏性以及保留了词序信息,从而使词语义的建模精度达到最高。

    3.2 奇异值分解(SVD分解)

    数据量较大时,构建得到的“词-上下文”矩阵维度较高,通常还需要进行矩阵分解以便降低维度。常用矩阵分解方法主要有奇异值分解等。

    文档级一般使用较多,但是当数据量很大时,构建得到的“词-上下文”矩阵维度
    较高,通常还需要进行矩阵分解以便降低维度。常用矩阵分解方法主要有奇异值分解等。

    潜在语义分析(Latent semantic analysis, LSA)
    主成分分析 (Principal Component Analysis, PCA)

    指通过对大量的文本集进行统计分析,从中提取出词语的上下文使用含义。技术上通过奇异值分解SVD分解等处理,消除了同义词、多义词的影响,提高了后续处理的精度。

    image-20210401092419811

    A ≈ U Σ V T (7) \large \mathbf{A} \approx \mathbf{U} \mathbf{\Sigma} \mathbf{V}^{\mathbf{T}} \tag{7} AUΣVT(7)

    输入有m个词,对应n个文本。而Aij则对应第i个词在第j个文本的特征值(共现频率、 TF-IDF值)。
    引入一个中间变量,称之为主题。k是我们假设的主题数,一般要比文本数少。SVD分解后:

    • U i l U_{il} Uil对应第i个词和第l个主题的相关度
    • Σ l m Σ_{lm} Σlm对应第l个主题和第m个主题的相关度
    • V j m V_{jm} Vjm对应第j个文本和第m个主题的相关度

    image-20210401093233460

    待分解矩阵 A : m × n A:m×n Am×n
    U : m × m U:m×m Um×m:由左奇异向量组成
    Σ : m × n Σ:m×n Σm×n:主对角线为奇异值,其他为0
    V : n × n V:n×n Vn×n:由右奇异向量组成
    U和V均为酉矩阵( U T U = I , V T V = I U^TU=I,V^TV=I UTU=I,VTV=I)

    怎么得到?

    用n×n的方阵 A T A A^TA ATA做特征值分解,得到n个特征值和特征向量v,作为右奇异向量,得到右侧的V矩阵: ( A T A ) v i = λ i v i ( A ^ { T } A ) v _ { i } = \lambda_ { i } v _ { i } (ATA)vi=λivi

    用m×m的方阵 A A T A A^{T} AAT做特征值分解,得到m个特征值和特征向量u,作为左奇异向量,得到左侧的U矩阵 : ( A A T ) u i = λ i u i \left(A A^{T}\right) u_{i}=\lambda_{i} u_{i} (AAT)ui=λiui

    流程:
    (1)分析文档集合,建立词汇-文本矩阵A。
    (2)对词汇-文本矩阵进行奇异值分解。
    (3)对SVD分解后的矩阵进行降维
    (4)使用降维后的矩阵构建潜在语义空间

    从此模型开始,模型进入了不可解释的阶段,但是因为表示效果很好,所以继续使用

    3.3 评价

    优点:
    1)可以刻画同义词;
    2)无监督/完全自动化。
    缺点:
    1)无法解决一词多义问题;
    2)高维度矩阵做奇异值分解是非常耗时
    3)特征向量没有对应的物理解释

    展开全文
  • 二、Python的一些常用操作三、常用的一些自然语言处理工具包1、nltk工具包2、四、常用的一些分词模型1、朴素贝叶斯2、N-gram模型总结 前言 在开始进行NLP的相关任务时,首先需要做一些预备工作,比如说数据清洗、...
  • 适用于许多文本预处理和初步探索性分析任务,在小说分析,网络文本,专业文献等领域都有潜在应用价值。 使用案例: (实体分词,文本摘要,关系网络等) (实体分词,情感分析,新词发现[辅助绰号识别]等) 相关文章...
  • 基于Python的数据清洗常用工具Python数据清洗实战入门之数据清洗的常用工具一、数组运算库NumpyNumpy常用数据结构创建一维数组通过嵌套列表创建二维数组使用Numpy的迭代器生成数组简单数组运算判断数组属性将元组...
  • 在NLP工作中,为针对性的对有某些特征的文本数据进行模型训练,可以对文本数据进行一个数据清洗的预处理工作。 0.导入工具 import pandas as pd import numpy as np import re 1.打开文本数据集 df=pd.read...
  • 如何用机器学习对文本分类

    千次阅读 2017-05-30 20:21:58
    需求使用监督学习对历史数据训练生成模型,用于预测文本的类别。样本清洗主要将重复的数据删除掉,将错误无效的数据纠正或删除,并检查数据的一致性等。比如我认为长度小于少于13的数据是无效的遂将之删掉。def ...
  • 文章目录引言一、项目的描述与目标二、项目框架三、文本预处理与特征工程1. 文本预处理2. 特征工程2.1 基于词向量的特征工程2.2 基于人工定义的特征四、三个任务1.project12.project23. project3 项目环境配置如下:...
  • 但是自然语言处理中原始数据是文本,或者说是字符串。所以,在做自然语言处理的一些问题时,首先需要将输入的文本转换成向量。最基本的方法有:word count和TF-IDF,这两种方法是最基本的,但有很大的缺陷。word ...
  • 利用朴素贝叶斯进行新闻文本分类

    万次阅读 2018-09-19 15:50:44
    初探文本分类,本文使用的数据是5000条中文新闻文本数据,目的是使用朴素贝叶斯算法,对中文新闻文本进行分类预测。流程如下: 文本数据载入及清洗 搜狗新闻数据源:http://www.sogou.com/labs/resource/ca.php ...
  • 文章目录...Fasttext是Facebook推出的一个便捷的工具,包含文本分类和词向量训练两个功能。 Fasttext的分类实现很简单:把输入转化为词向量,取平均,再经过线性分类器得到类别。
  • 百度大脑EasyDL是如何帮助NLP文本分类用户提升标注效率的?业界领先的文本分类智能标注产品效果如何?在百度产品经理夜巡的带领下,你将会学习到EasyDL专业版文本分类模型最新上线的智能标注功能的具体解析,并且为...
  • TextRNN实现文本分类

    2020-03-10 21:30:19
    TextRNN实现文本分类 任务介绍 给定一个如下的外卖评论的数据(1w条),训练模型分类好评和差评。 思路 给出的baseline为0.82(F1),方法是将语料中所有字拆开训练成300D的word2vec后,每一句的处理采用将所有字的...
  • 前一篇文章讲述了分类算法的原理知识级案例,包括决策树、KNN、SVM,并通过详细的分类对比实验和可视化边界分析与大家总结。本文将详细讲解数据预处理、Jieba分词和文本聚类知识,这篇文章可以说是文本挖掘和自然...
  • 调试算法参数二、端到端的分类1.fasttext文本分类2.CNN文本分类3.RNN文本分类4.组合模型5.HAN分类6.更强大的词向量 在NLP任务中,文本分类算是最常见的应用。入门的自然语言处理\机器学习任务大都讲到垃圾邮件识别,...
  • 深度学习文本分类|模型&代码&技巧

    千次阅读 2021-02-03 17:58:59
    来自:李rumor文本分类是NLP的必备入门任务,在搜索、推荐、对话等场景中随处可见,并有情感分析、新闻分类、标签分类等成熟的研究分支和数据集。本文主要介绍深度学习文本分类的常用模型原理、...
  • Python常用的19个工具包汇总

    万次阅读 2019-08-25 21:18:51
    一、Python 科学计算工具包 ...同时,这几个工具包非常重要,特别是 NumPy 和 SciPy,也是很多 Python 文本处理 & 机器学习 & 数据挖掘工具包的基础。 1. Numpy: Numpy是使用Python进行...
  • 文本分类是NLP的必备入门任务,在搜索、推荐、对话等场景中随处可见,并有情感分析、新闻分类、标签分类等成熟的研究分支和数据集。本文主要介绍深度学习文本分类的常用模型原理、优缺点以及技巧,是...
  • 在搜集了很多文本语料之后,会开始漫长的数据清洗过程,用好python标准库,可以方便地解决很多问题。
  • 使用python和sklearn的中文文本分类实战开发

    万次阅读 多人点赞 2019-03-02 00:32:15
    文本分类一般可以分为二分类、多分类、多标签分类三种情况,二分类是指将一组文本分成两个类(0或1),比较常见的应用如垃圾邮件分类、电商网站的用户评价数据的正负面分类等,多分类是指将文本分成若干个类中的某一个类,...
  • 阅读目录    1 新闻语料的准备    2 高效读取文件 ... 手工打造文本数据清洗工具    作者 白宁超    2019年4月30日09:43:59    前言:数据清理指删除、更正错误、不完整、格式有误或多余的数...
  • 文本分类

    千次阅读 2016-11-01 12:38:39
    文本分类: 预处理 特征选择 DF (Document Frequency) 信息增益 (Information Gain, IG) 熵 (Entropy) 相对熵 (Relative Entropy) χ² 统计量 (Chi-Square) 互信息 (Mutual Information) Robertson & Sparck Jones...
  • 今天在找资料的时候无意间查找一个跟眼下工作不太相关但是一眼看到就很感兴趣的内容,讲解的是文本中数据的查找替换等的一个操作工具。之前做了比较多的相关的工作是网页html处理的工作,这里经常替换或者查找指定...
  • 本文进行文本分类任务的中文邮件数据来源于由国际文本检索会议提供一个公开的垃圾邮件语料库,点我下载。分为英文数据集(trec06p)和中文数据集(trec06c),其中所含的邮件均来源于真实邮件,并且还保留了邮件的...
  • 文本分类算法综述

    千次阅读 2020-04-13 14:55:44
    最近在阅读Kowsari, Meimandi J , Heidarysafa等人的 《Text Classification Algorithms: A Survey》一文,在此半翻译半总结地总结一下笔记。...大多数文本分类和文档分类的过程都可以分为四个阶段:特征提取、...
  • NLTK 非常实用的文本处理工具,主要用于英文数据,历史悠久~ import nltk # nltk.download() # nltk.download('punkt') # nltk.download('stopwords') from nltk.tokenize import word_tokenize from nltk.text ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,872
精华内容 3,948
关键字:

文本分类清洗工具包