nlp入门之文本的特征表示方法(未完待续)

nlp入门之文本的特征表示方法(未完待续)



https://zhuanlan.zhihu.com/p/42310942
https://www.cnblogs.com/Luv-GEM/p/10543612.html

文本表示是指将文字表示成计算机能够运算和处理的数字或向量的方法。文本表示方法可分为离散表示和分布式表示。离散表示假设词与词之间是独立的,代表是词袋模型(bag of words),包括one-hot encoding、count encoding、TF-IDF等。分布式表示,用一个词附近的其他词来表示该词,也叫词嵌入(word embedding),包括共现矩阵、word2vec、ELMO和BERT等。

1. 文本的离散表示方法

文本的离散表示可以分为三个阶段:Tokenization、Vectorization和normalization。

1.1. Tokenization

文本的Tokenization过程,就是将训练样本(专业术语为文档,document,例如每个句子可以当做一个document)划分为更小的文本单元的过程,将这些小的文本单元构成一个词库(Vocabulary)并编号。具体切分方法一般采用n-gram模型。所谓n-gram就是把训练集中每相邻的n个词当作一个切分单元。例如one-gram(uni-gram)就是把每个词作为切分单元;two-gram(bi-gram)就是把每个词和它前一个词拿出来作为切分单元。在实际中,往往会将n取某些数组的情况结合起来使用,例如uni-gram+bi-gram(既有uni-gram的切分结果也有bi-gram的切分结果)。当n越大时,越能表示词与词之间的顺序关系,但是随之而来的是词表越来越大
为什么要进行Tokenization?这是为了泛化样本与label之间的关系。如果不Tokenization,那么每个样本之间几乎都是不相同的,模型无法学习到样本之间相似的关系,特征表示空间也会随着样本的数量增大而急剧增大,很容易过拟合。而进行Tokenization后,拥有部分相同词的样本之间的相似关系就能表示出来了。

1.2. Vectorization

对Tokenization的结果进行数值化表示的过程。主要包括one-hot encoding、count encoding、TF-IDF、共现矩阵等。下面重点讲这些Vectorization方法

1.2.1. one-hot编码

建立一个字典,对语料库中出现的所有词进行索引编码。假设词典的大小为 V V V,则每个词都可以表示成一个 V V V维的稀疏向量。
例如,假设语料库是:

我喜欢计算语言学。小许也喜欢。
我还喜欢计算机视觉

则可以得到带有索引编码的词典:

{“我”: 1, “喜”: 2, “欢”: 3, “计”: 4, “算”: 5, “语”:6, “言”: 7, “学”: 8, “小”: 9, “许”: 10, “也”:11, “还”: 12, “机”: 13, “视”: 14 “觉”: 15 }

每个词可以用one-hot方法表示为:

我: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
喜: [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

  • 这样会导致每个词的向量很稀疏
  • 在表示某条文本时,总的向量维数很大且很稀疏,且长度不同的文本,向量长度不一样
  • 无法表达出词与词之间的相似程度。

实践中可以用# sklearn.preprocessing.OneHotEncoder来完成one-hot encoding

1.2.2. 计数编码

也即count encoding,它将每条样本表示成一个向量,具体过程为:建立一个 V V V维的全零向量,然后对于目标样本里的每个词进行计数,作为向量里面该词的索引对应的位置的值.
例如,前一小节中,两条文本可以表示为:

我喜欢计算语言学。小许也喜欢。[1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0]
我还喜欢计算机视觉。 [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1]

实践中可以采用# sklearn.feature_extraction.text.CountVectorizer来完成count encoding

  • 这种方式相比one-hot降低某条文本的维数以及稀疏度
  • 仍然存在数据稀疏和维数灾难的问题
  • 没有考虑句中词的顺序性(如果词的顺序变化了,句子意思变化了,但是向量还是一样的)。
  • 没有考虑词的相对重要性,只管词是否在词典中出现以及文本中词出现的次数,而不管它在语料库里面出现的频率。

1.2.3. TF-IDF

上面的词袋模型和n-gram模型是基于计数得到的,而TF-IDF是基于频率统计得到的。
TF-IDF由两部分组成:词语频率(Term Frequency)和逆文档频率(Inverse Document Frequency)。

T F ( t ) = 该 词 在 当 前 文 档 中 出 现 的 次 数 当 前 文 档 中 词 语 的 总 数 TF(t)=\frac{该词在当前文档中出现的次数}{当前文档中词语的总数} TF(t)=,衡量了该词在当前文档中的重要程度。值越大代表越重要。

I D F ( t ) = l n n 1 + d f ( t ) IDF(t)=ln\frac{n}{1+df(t)} IDF(t)=ln1+df(t)n其中n是文档总数,df(t)是包含词t的文档数,分母+1是为了防止分母为0。IDF(t)衡量了该词在所有文档中的文档区分能力。值越大区分能力越强.在TfidfTransformer和TfidfVectorizer中,如果没有采用平滑技术(smooth)则计算公式为 I D F ( t ) = l n n d f ( t ) + 1 IDF(t)=ln\frac{n}{df(t)}+1 IDF(t)=lndf(t)n+1;如果采用了平滑技术则公式为 I D F ( t ) = l n 1 + n 1 + d f ( t ) + 1 IDF(t)=ln\frac{1+n}{1+df(t)}+1 IDF(t)=ln1+df(t)1+n+1,这就相当于有个文档包含了所有的词。式子最右的+1是为了防止IDF为零导致TF-IDF为零。

最后得到的TF-IDF=TF×IDF
TF-IDF常用于文档相似度计算。
可以使用sklearn中的TfidfVectorizer生成TF-IDF特征。
注意:

vectorizer=CountVectorizer()
transformer=TfidfTransformer()
tfidf=transformer.fit_transform(vectorizer.fit_transform(corpus))

等价于:

transformer=TfidfVectorizer()
tfidf2=transformer.fit_transform(corpus)# 注意,默认会采用l2正则化

上述代码将corpus中的每个句子都转换成了一个长度为Vocabulary.size()大小的向量,该向量每个维度代表一个词,如果该维度的词在句子中出现,则值为词的TF-IDF特征,否则为0.
以下链接是本人分别用sklearn中的TfidfVectorizer和用NumPy实现的TF-IDF代码
https://github.com/lankuohsing/Study_NLP/blob/master/tf_idf/tf_idf_implementation.py

对句子中的所有词向量根据tfidf权重加权求和,是常用的一种计算sentence embedding的方法,在某些问题上表现很好,相比于简单的对所有词向量求平均,考虑到了tfidf权重,因此句子中更重要的词占得比重就更大。

1.3 对TF-IDF用于特征选择时的一点讨论

TF-IDF用于向量空间模型,进行文档相似度计算是相当有效的。但在文本分类中单纯使用TF-IDF来判断一个特征是否有区分度是不够的。

1.3.1. TF-IDF的缺点

https://blog.csdn.net/enter89/article/details/52538121
TF-IDF仅仅综合考虑了该词在文档中的重要程度和文档区分度。

它没有考虑特征词在类间的分布。特征选择所选择的特征应该在某类出现多,而其它类出现少,即考察各类的文档频率的差异。如果一个特征词,在各个类间分布比较均匀,这样的词对分类基本没有贡献;但是如果一个特征词比较集中的分布在某个类中,而在其它类中几乎不出现,这样的词却能够很好代表这个类的特征,而TF-IDF不能区分这两种情况。

它没有考虑特征词在类内部文档中的分布情况。在类内部的文档中,如果特征词均匀分布在其中,则这个特征词能够很好的代表这个类的特征,如果只在几篇文档中出现,而在此类的其它文档中不出现,显然这样的特征词不能够代表这个类的特征。

注:在文本分类中,一般一个句子当作一个文档来看。

1.3.2. TF-IDF结合信息增益(IG)来做特征选择

假设有两类:正类和负类,对应的文档数分别为 N 1 , N 2 N_1,N_2 N1,N2
统计每个词的正文档出现次数 A A A,负文档出现次数 B B B,正文档不出现次数 C C C,负文档不出现次数 D D D
每个词的信息增益
I G = A + B N 1 + N 2 ( A A + B l o g ( A A + B ) + B A + B l o g ( B A + B ) ) + C + D N 1 + N 2 ( C C + D l o g ( C C + D ) + D C + D l o g ( D C + D ) ) (5-1) \begin{aligned} IG=&\frac{A+B}{N_1+N_2}\left(\frac{A}{A+B}log\left(\frac{A}{A+B}\right)+\frac{B}{A+B}log\left(\frac{B}{A+B}\right)\right)\\ +&\frac{C+D}{N_1+N_2}\left(\frac{C}{C+D}log\left(\frac{C}{C+D}\right)+\frac{D}{C+D}log\left(\frac{D}{C+D}\right)\right)\\ \tag{5-1} \end{aligned} IG=+N1+N2A+B(A+BAlog(A+BA)+A+BBlog(A+BB))N1+N2C+D(C+DClog(C+DC)+C+DDlog(C+DD))(5-1)
然后将将每个词按信息增益值从大到小排序,选取前k个词作为特征,k为特征维数
一种主流的方法是:选取出特征后,每个词的特征权重用idf来表示,在预测的时候再乘以tf权重

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值