文本分类学习(二)文本表示

接着上一篇。在正式的尝试使用文本分类算法分类文本的时候,我们得先准备两件事情: 一,准备适量的训练文本;二,选择合适的方法将这些训练文本进行表示(也就是将文本换一种方式表示)

 

大家都知道文本其实就是很多词组成的文章啊。所以很自然的就想到用一系列词来表示文本。比如我这篇文章,将其分词之后的结果就是:

("接着","上","一篇","在","正式"...........)

这里有很多分词工具可以办到,如果不知道使用何种分词算法,可以参照这篇博文(以前写的搜索引擎的分词部分,果然可以拿来用用。其实搜索和文本分类也有很多想通的地方呢):

http://www.cnblogs.com/dacc123/p/8431369.html

那么分好词就可以了吗?显然不是的可以看到上面的词中有"上","在" 这些介词,很明显这些词是不能代表一篇文章特征,所以我们需要去停用词,去完之后,首先文章的词汇量可以减少很多的,然后呢特征也比以前要明显一点(对计算机来说)

 

去完停用词之后就可以了吗?显然更不是的。每一篇文章都会有个侧重点,比如我写了一篇搜索引擎的文章,那么文章中"搜索","索引","算法"。这类的词出现的概率是不是很高,而"程序","计算机","时间效率"这些词也可能出现在文章中,但是这些词机会完全比不上"搜索","索引"这些词厉害了啊,计算机更注重的是这些词呀。所以分词之后,我们需要给词加上权重,告诉计算机,哪些词很重要,你要给我留意点,哪些词不重要不用太在意他们。那么怎么加权重呢?

很容易想到的方法是,词汇在文章中出现的次数 称作词频。出现次数越多,那不是明摆着文章越侧重这个词嘛。

于是分词可以这么表示:

("搜索",9,"索引",20,"计算机",2.......)  表示"搜索"出现过9次,"索引"出现过20次,"计算机"出现过2次。

但是实际上呢单单使用词频来表示权重是很少的,效果也是很差的。人们更多的使用TF/IDF值表示权重,然后我现在还不会(丢人)。下一篇会详解这个东西。

 

("搜索",9,"索引",20,"计算机",2.......)  这样的形式计算机仍然不会识别,于是我们想到了另一种方式,构造一个词袋

D =("搜索","索引","计算机"........)

于是文档可以转换成这样的形式

W = (9,20,2.....)表示在词袋中相应的词的权重,这样文档就被表示成一个由数字组成向量,有多少个数字就叫做多少维向量,计算机就能够很好的处理了。而SVM算法使用的就是词袋模型。

 

接下来就有另一个问题了,我们知道中文汉字都有6万多个汉字,那我们构造的词袋中的词有6万多个,那岂不是每个文档都是6万维度的向量,而且向量中绝大多数都是0,这样岂不是会很浪费计算机的资源?就算经过上面的去停用词之后,还是有很多词!

实际上呢,我们完全不必要把6万多个汉字都纳入到我们的词袋中对不对?给我们一个训练集之后,我们的第一个问题是把训练集中能代表文本的特征的词纳入到词袋中比傻瓜式的构造所有出现的词的词袋要小的多,(这是属于我的个人理解)那到底会多小?如何选择最具代表性的特征词呢?效果会不会受到影响呢? 这些问题只能到下篇再去讨论了。

 

再插一个话题。这篇文章主要想讲的就是给训练集构建一个词袋模型用于SVM算法。好了,纵观词袋模型,我们可以发现一个特点,词袋模型是基于一个特点?什么特点?那就是词袋中的词相互独立,互相不影响,对不对?百度一下就知道了,大家都这么说。事实上,一个篇文章中词,具有上下文联系,也就是一个词应该是可以影响到另一个词的。于是我又了解到了一个词向量模型。词向量模型实际上是用一个向量表示一个词(上面的词袋模型是用一个向量表示一个文章),常用的方法是:one-hot representationdistributed representation。百度一下就知道one-hot是比较低级的,而较高级的是distributed representation,他可以通过数学公式比如正弦余弦,加减,得到词和词之间的关系,牛逼不?

于是在找资料的过程中,我还发现了基于上下文图模型的文本表示,以及神经概率语言模型NPLM


哇,再往下搜不得了哎,基于这种上下文关系的词向量表示模型还有好多呢,好像都比词袋要厉害很多呢。

https://blog.csdn.net/u013265285/article/details/69062795

算了,我暂时也管不了这些词向量模型,第一步是使用词袋模型+SVM分类算法,看看效果如何。

 

最后说一句,原来文本分类最重要的不止选择何种分类算法,还有文本用何种算法表示哦!

posted @ 2018-03-31 16:58  Shendu.CC  阅读(...)  评论(...编辑  收藏