授人以渔:分享我的文本分类经验总结(一)

简介: 授人以渔:分享我的文本分类经验总结(一)

在我们做一个项目或业务之前,需要了解为什么要做它,比如为什么要做文本分类?项目开发需要,还是文本类数据值得挖掘。


1、介绍



目前讨论文本分类几乎都是基于深度学习的方法,本质上还是一个建模的过程,包括数据准备-预处理-模型选择-模型调优-模型上线这样的一套流程。在本地进行文本分类开发我们需要关注的两个主要的问题:数据处理和模型选择,这两者是相互依赖的。


61f23337a8202cc7500e684edb86839f.png


图1 文本分类的步骤


文本分类可以根据文本的大小可以分为如下几种:


  • 文本级别: 对整篇文章进行分类


  • 段落级别: 对单独的段落分类


  • 句子级别: 对句子进行分类


  • 子句级别: 对句子的一部分进行识别(命名体识别不就是这个吗)


介绍图所示也分为三个部分,特征提取、分类模型、评估指标。


2、特征提取(Representation)



介绍文本数据清洗的几种方法和两种特征提取方法,Embedding和Weighted Words。


2.1 数据清洗



在自然语言处理(NLP)中,大多数文本和文档都包含许多冗余的单词,例如StopWords,Miss-Mermilings,Slangs等。在许多算法中,如统计和概率学习方法,噪声和不必要的特征可以对整体性能产生负面影响。


Tokenization


中文有的翻译称之为分词,将句子切成小块称之为token。


python中


from nltk.tokenize import word_tokenizetext = "After sleeping for four hours, he decided to sleep for another four"tokens = word_tokenize(text)print(tokens)# result['After', 'sleeping', 'for', 'four', 'hours', ',', 'he', 'decided', 'to', 'sleep', 'for', 'another', 'four']# 中文文本text = "我在华为工作"print(" ".join([s for s in jieba.cut(text)]))# results我 在 华为 工作


Stop words


中文翻译:停用词。通过社交媒体(如Twitter,Facebook等)的文本和文档分类通常受到文本语料中的嘈杂性质(缩写,不规则形式)的影响。简而言之,过滤掉一些词。

from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
example_sent = "This is a sample sentence, showing off the stop words filtration."
stop_words = set(stopwords.words('english'))
word_tokens = word_tokenize(example_sent)
filtered_sentence = [w for w in word_tokens if not w in stop_words]
print(word_tokens)
print(filtered_sentence)
# results
['This', 'is', 'a', 'sample', 'sentence', ',', 'showing', 'off', 'the', 'stop', 'words', 'filtration', '.']
['This', 'sample', 'sentence', ',', 'showing', 'stop', 'words','filtration', '.']


使用stopwords也是很简单,分词做一个字典或者集合进行筛选即可,这里不再赘述。


Capitalization


中文名字:资本化?句子可以包含大写和小写字母的混合。多个句子构成文本文档。为了减少问题空间,最常见的方法是将一切降低到小写。这将在同一空间的文档中带来所有单词,但它通常会改变某些词的含义,例如“美国”到“我们”,第一个代表美国和第二个是代名词。要解决此问题,可以应用俚语和缩写转换器。什么叫缩写转换器?盲猜应该就是一个hashmap。


text = "The United States of America (USA) or America, is a federal republic composed of 50 states"
print(text)
print(text.lower())
# results
'The United States of America (USA) or America, is a federal republic composed of 50 states'
'the united states of america (usa) or america, is a federal republic composed of 50 states'


Slangs and Abbreviations


谚语和缩写。在进行常规的文本分类的时候,希望将谚语翻译,缩写变为全称是的数据分布保持一致。当然,不一定非得对此进行处理,如果针对缩写和谚语的数据集和模型构建那则不需要考虑此问题。


Noise Removal


噪音消除。其实就是使用正则表达式过滤掉一些错误或者无关紧要的字符,使得数据尽可能对齐。


英文常用的手段


def text_cleaner(text):    rules = [        {r'>\s+': u'>'},  # remove spaces after a tag opens or closes        {r'\s+': u' '},  # replace consecutive spaces        {r'\s*<br\s*/?>\s*': u'\n'},  # newline after a <br>        {r'</(div)\s*>\s*': u'\n'},  # newline after </p> and </div> and <h1/>...        {r'</(p|h\d)\s*>\s*': u'\n\n'},  # newline after </p> and </div> and <h1/>...        {r'<head>.*<\s*(/head|body)[^>]*>': u''},  # remove <head> to </head>        {r'<a\s+href="([^"]+)"[^>]*>.*</a>': r'\1'},  # show links instead of texts        {r'[ \t]*<[^<]*?/?>': u''},  # remove remaining tags        {r'^\s+': u''}  # remove spaces at the beginning    ]    for rule in rules:    for (k, v) in rule.items():        regex = re.compile(k)        text = regex.sub(v, text)    text = text.rstrip()    return text.lower()


处理中文的时候我们可能需要删除一些无用的英文字符,或者无效的数字。


Spelling Correction


语法错误自动纠正。


英文案例比较简单


from autocorrect import Spellerslr = Speller()print(slr.autocorrect_word('caaaar'))print(slr.autocorrect_word(u'mussage'))print(slr.autocorrect_word(u'survice'))print(slr.autocorrect_word(u'hte'))# results"aaaaaa""message""service""the"


中文的自动纠错


import pycorrectorcorrected_sent, detail = pycorrector.correct('少先队员因该为老人让坐')print(corrected_sent, detail)# results少先队员应该为老人让座 [['因该', '应该', 4, 6], ['坐', '座', 10, 11]]


修正后在分词,目前也有基于深度学习的文本纠正。


2.2 Weighted Words



term-frequency~(TF)


  • 基于出现的频率做单词到数字的映射。


  • 出现的次数。


出现次数的对数。或者使用布尔值表示?


如果使用一个等长的向量,其中的位置表示为单词的频率信息,这样做容易导致的问题是什么?出现频率高的单词决定了单词的表示。


加权字表示,TF-IDF在文档中术语重量的数学表示:


2c4171b3c443b8b3f57759d6b79db23e.png


其中n是文档的数量,df(t)是包含语料库中术语t的文档的数量。


可以通过 如下方式实现。


from sklearn.feature_extraction.text import TfidfVectorizer


2.3 Embedding



  1. 使用较低维度的向量表示文本中的单词。


  1. 机器学习中的编码思路。


方法一:one-hot


存在的问题:


1. 效率低下,一个独热编码向量十分稀疏(这意味着大多数索引为零);


2. 数据中的单词集合越大,编码后的向量长度越长3. 任意两个词正交,无法较好的度量词之间的相关性;


方法二:int


存在的问题:


1. 整数编码是任意的(它不会捕获单词之间的任何关系);

2. 对于要解释的模型而言,整数编码颇具挑战。例如,线性分类器针对每个特征学习一个权重。由于任何两个单词的相似性与其编码的相似性之间都没有关系,因此这种特征权重组合没有意义;


Embedding 层


  • 不同的框架下的Embedding层的作用是什么?需要注意的两点


  • 解决one-hot编码无法提取词之间的相关性的问题,方法是通过训练一个权重矩阵(矩阵的大小为(m,n)_m_表示训练数据中的单词集合的大小,_n_通常称之为词向量的大小,即压缩后的维度大小。矩阵中的参数通过目标任务反向传播进行学习。


在前向传播不采用one-hot编码后的矩阵进行输入,采用int编码进行查表操作来代替矩阵相乘来加速。


Word2Vec



Embedding层虽然可以学习到词的低维度表示,但是在数据样本比较小的情况下,仅仅通过目标任务学习巨大的Embedding矩阵往往效果不是理想。


联想到,图片分类中的image数据的预训练权重,在文本分类中也希望通过巨大预料数据提前得到单词的预训练权重,然后在小的数据集上进行迁移学习以提升模型的精度。Word2Vec是在此想法下的产物,与文本分类预训练有几点不同。


a0e2805592148cffb56d706f41632a70.png47b670860ff55110a2208d19367a34b0.png


以Skip-gram为例简单介绍:


The wide road shimmered in the hot sun.


句子中的每个单词的上下文词被窗口打下指定,样例如下。对于窗口长度n,考虑上下文,意味着每个单词对应的窗口长度为2*n+1。


87bdb4cb273c1cd897d167b3ab95717e.png


词编码在Embedding中写过,首先使用one-hot编码然后喂入网络,在word2vec中也使一样的。不过这里的目标是给定一个词的one-hot编码,学习的是skip-gram pair,因此网络定义如下:


e1eb88c19a0e5e59f1978d1e146f5901.png


如上图所示:隐层没有使用任何激活函数,但是输出层使用了sotfmax。基于成对的单词来对神经网络进行训练,训练样本是 ( input word, output word ) 这样的单词对,10000表示词本中单词的个数,input word和output word都是one-hot编码的向量。最终模型的输出是一个概率分布。


FastText



FastText和Word2Vec之间有什么联系和区别。


  • 相同点,学习得到低维度词向量表示。


  • 不同点,FastText使用了subwords这种更细粒度的特征。


FastText的结构如下,可以直接应用于文本分类任务,隐藏层使用求和使得模型十分高效。


b467041d628897dec155056765ac4671.png


GloVe



全局向量表示,使用词频信息+上下文信息的一种词向量表示。官方网站:https://nlp.stanford.edu/projects/glove/


三步走:


  • 根据语料库(corpus)构建一个共现矩阵(Co-ocurrence Matrix)X,矩阵中的每一个元素Xij代表单词i和上下文单词j在特定大小的上下文窗口(context window)内共同出现的次数。一般而言,这个次数的最小单位是1,但是GloVe不这么认为:它根据两个单词在上下文窗口的距离d,提出了一个衰减函数(decreasing weighting):decay=1/d用于计算权重,也就是说距离越远的两个单词所占总计数(total count)的权重越小。


  • 构建词向量(Word Vector)和共现矩阵(Co-ocurrence Matrix)之间的近似关系,论文的作者提出以下的公式可以近似地表达两者之间的关系:


b9e1145315bb2eea9df82401124c8bd2.png


其中,wiT和wj**是我们最终要求解的词向量;**bi和bj分别是两个词向量的偏置。


  • 损失函数


0906a02f4b02e7ab33bf85959a013346.png


这个loss function的基本形式就是最简单的mean square loss,只不过在此基础上加了一个权重函数f(Xij),那么这个函数起了什么作用,为什么要添加这个函数呢?我们知道在一个语料库中,肯定存在很多单词他们在一起出现的次数是很多的(frequent co-occurrences),那么我们希望:


  • 1.这些单词的权重要大于那些很少在一起出现的单词(rare co-occurrences),所以这个函数要是非递减函数(non-decreasing);


  • 2.但我们也不希望这个权重过大(overweighted),当到达一定程度之后应该不再增加;


  • 3.如果两个单词没有在一起出现,也就是Xij=0,那么他们应该不参与到loss function的计算当中去,也就是f(x)要满足f(0)=0


满足以上两个条件的函数有很多,作者采用了如下形式的分段函数,(xmax=100,α=0.75):


00304745f28748b1d1bae265edf4553c.png


Contextualized Word Representations


预训练是否存在其他的表征方式,word2vec这种表示方法的缺点是什么?


  • 缺乏语义信息


中文的预训练模型:https://github.com/HIT-SCIR/ELMoForManyLangs


上下文词表示,ELMO是一个深刻的语境化词表示,可以处理(1)单词的复杂特征(例如,语法和语义)(2)这些用途在语言上下文(即,模型多义)上的不同方式变化。这些单词vectors是学习的深度双向语言模型(BILM)的内部状态的函数,该函数在大型文本语料库上预先训练。


ELMo representations are:


  • Contextual: 每个单词的表示取决于它使用的整个上下文。


  • Deep: 每个单词的表示组合了深度预先训练的神经网络的所有层。


  • Character based: Elmo表示是基于纯字符级别的,允许网络使用形态线索学习不属于词表中的单词表示。


2.3 不同特征提取的优缺点


一、Weighted Words:



优点:


  • 容易计算


  • 使用此方法容易计算两个文档的相似度


  • 提取文档具有代表性的基础指标


  • 未知单词也可以工作


缺点:


  • 不能捕捉位置关系


  • 不能捕捉语义信息


  • 高频单词容易影响结果(例如 is,as)


相关文章
|
3月前
|
机器学习/深度学习 人工智能 搜索推荐
《统计学简易速速上手小册》第9章:统计学在现代科技中的应用(2024 最新版)
《统计学简易速速上手小册》第9章:统计学在现代科技中的应用(2024 最新版)
42 2
|
3月前
ChatGPT 之言情作家:第一章到第十一章
ChatGPT 之言情作家:第一章到第十一章
221 0
|
机器学习/深度学习 算法 数据挖掘
周志华《机器学习》西瓜书精炼版笔记来了!16 章完整版
周志华《机器学习》西瓜书精炼版笔记来了!16 章完整版
1749 0
周志华《机器学习》西瓜书精炼版笔记来了!16 章完整版
|
自然语言处理 搜索推荐 机器人
如何利用ChatGPT写毕业论文
如何利用ChatGPT写毕业论文
|
机器学习/深度学习 人工智能 算法
入坑机器学习:一,绪论
在入坑之前,需要大家有一定的数学基础,高数,线代,概率论,个人认为概率论更加重要,也更加难。我之前也有出过相关的文章。
120 0
入坑机器学习:一,绪论
|
机器学习/深度学习 人工智能 算法
机器学习算法竞赛实战--1,初见竞赛
在时代的洪流之下,各行各业都在寻求生存之道利用先进的技术完成转型则是一个很好的办法,有些企业就开始寻求人工智能的助力开始向社会征求优秀的算法解决方案,此外,在学术领域的研究者们也渴望获得企业的场景和数据用于算法研究这就催生出了各种竞赛平台。对于有志于进军机器学习相关领域从事研究或者相关工作的初学者来说竞赛是性价比极高的一个实战选择,可以说是0门槛,任何人都可以参加。
113 0
机器学习算法竞赛实战--1,初见竞赛
|
图形学
入行3D建模难不难学习?10年建模师:这3种人,一辈子都学不会
下面这些问题是不是也是你心中所惑?还是说经常听到有人这么说? 这个功能在哪里,我不会呀! 为什么我努力学习了这么久,还是没学会? **这个时代,最不缺的就是勤奋的年轻人。** 大家都希望用宝贵的青春奋力一搏,高山仰止。所以我们经常看到许多人,每天像吃饭一样大口吞咽知识,然而却消化不良。
168 0
入行3D建模难不难学习?10年建模师:这3种人,一辈子都学不会
|
机器学习/深度学习 人工智能 分布式计算
《从机器学习谈起》读书摘要
《从机器学习谈起》读书摘要
187 0
《从机器学习谈起》读书摘要
|
机器学习/深度学习 存储 自然语言处理
授人以渔:分享我的文本分类经验总结(三)
授人以渔:分享我的文本分类经验总结(三)
274 0
授人以渔:分享我的文本分类经验总结(三)