基于汉字字频特征实现99.99%准确率的新闻文本分类器(四)

原创 2016年05月30日 22:09:15


基于汉字字频特征实现99.99%准确率的新闻文本分类器(一)

基于汉字字频特征实现99.99%准确率的新闻文本分类器(二)

基于汉字字频特征实现99.99%准确率的新闻文本分类器(三)

基于汉字字频特征实现99.99%准确率的新闻文本分类器(四)

基于汉字字频特征实现99.99%准确率的新闻文本分类器(五)

回顾

上一节中,使用五层神经网络,对抽取出的汉字字频特征向量进行分类,得到了超过99%的准确率,在高准确率的前提下,没有陷入局部最优解,对一些在训练中,被指定了上千次不是军事类的新闻,只要内容是军事类的,就能被正确的找出,同样,混在军事类新闻里的【慈善捐款】等非军事的新闻,虽然被教育了数千次是军事类的,最终也没有被五层神经网络认定为军事类的。

从某种意义上讲,五层神经网络好像是真的理解了军事类新闻的涵义一样。

他/她是怎么做到的呢?本节,将先从前面的开源代码分析入手,一探究竟。

数据清洗

源码里有对新闻文字的简单数据清洗。即对某些页面上残留的汉字污染到了新闻文本本身进行排除。例如如下正则表达式

1
2
3
4
System.Text.RegularExpressions.Regex reg2 =newSystem.Text.RegularExpressions.Regex(
    "共找到([\\d,\\s]+)个相关网页",
    System.Text.RegularExpressions.RegexOptions.Singleline |
    System.Text.RegularExpressions.RegexOptions.Compiled);

它是对搜索页面返回的汉字的清除。有趣的是,在我的第一版的实现中连这个清洗的步骤也是没有的,我根本没有兴趣去看每一个新闻文本,因为有八万个之多。所以,原来我本不知道有这些污染的数据。那么我是如何定位到它呢?并知道清除这些文本?在《提高》中,将会描述这个有趣的事。

字频特征抽取

在第二节的PreData项目中,有一个outzp.txt的资源文件,里面是统计的常用汉字在新闻资讯中出现的次数。

可以看到,【的|是|在|有】等常见汉字的出现次数,是非常高的。

在函数GetZiPin中,使用新闻文本的汉字部分的频率,即一个汉字对应此新闻文本的所有汉字的百分比作为字频特征。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public static float[] GetZiPin(stringstr,int keycount)
{
    float[] res =newfloat[keycount];
    if(str ==null|| keycount > zps.Length)
        returnres;
    System.Collections.Generic.Dictionary<string,int> dsi = new Dictionary<string,int>();
    varavcount = 0;
    foreach(vark in str)
    {
        if(char.GetUnicodeCategory(k) == System.Globalization.UnicodeCategory.OtherLetter)
        {
            varks = k.ToString();
            if(dsi.ContainsKey(ks))
                dsi[ks]++;
            else
                dsi[ks] = 1;
            avcount++;
        }
    }
    for(inti = 0; i < keycount; i++)
    {
        if(dsi.ContainsKey(zps[i].ch))
        {
            res[i] = dsi[zps[i].ch] * 1000f / avcount;
            res[i] = res[i] / zps[i].zipin / 2;
        }
    }
    returnres;
}

此函数返回了一段新闻文本的1000多个常见汉字的字频数组。这是一个关键点,我没有使用全部3000多个常用汉字,而是使用了Top 1000个常见汉字,这可以减少特征向量的大小,加快训练的速度,因为输入向量比较大的时候,多层神经网络和SVM消耗的内存将会大幅增加,训练时间也会大幅增加。但是,这个向量是不能直接用作SVM或者神经网络的输入数据进行处理的。因为,特征向量还要做一步“归一化”。归一化的本质是公平的对待每一个输入,不人为改变任何汉字在特征向量中的权重

所以,特征向量的提取,是分两个阶段组成。第一个阶段,统计出每个汉字在每一个文章的频率数据,第二个阶段进行归一化。

1
2
3
var fi = textzipin.GetZiPin(txt, weishu);
for (int t = 0; t < mms.Length; t++)
    fi[t] = fi[t] / mms[t].fmax;

归一化后,特征向量里的每个汉字的字频,被调整为从0到1的浮点数。(有两种归一化方法,一种是归一化到0-1之间,还有一种是归一化到 【-1 1】之间。在本文中,我采用0-1范围)

PreData小结

PreData项目比较短小,包含标准的命名空间代码,总共才200行左右。功能也比较单一,抽取所有八万个文本的常见汉字字频,并归一化,保存到数据文件中。数据文件中部分数据如下所示。


此处数据换行有问题,所以显示不对。


首列为0的,是搜狗文本分类语料库中非军事的新闻资讯,首列为1的,是军事类的新闻资讯。可以看到,这些资讯的文本特征,都是一个1024维的向量,每个向量最大值为1,最小值为0,多数都位于0-1之间。

数据的归一化,对SVM或者神经网络来说,是一样重要的步骤。未归一化的数据将严重降低分类器的效果。归一化除了线性归一化外,还有指数及对数的归一化,他们各自有自己擅长的数据领域。比如,声音的分贝数据,即是典型的对数归一化会拥有更好的效果。

下节预告

下节,解读五层神经网络分类器的源代码。

基于汉字字频特征实现99.99%准确率的新闻文本分类器(五)


版权声明:本文为博主原创文章,转载请注明原始链接

相关文章推荐

基于汉字字频特征实现99.99%准确率的新闻文本分类器(五)

5层神经网络的泛化能力优异...

基于汉字字频特征实现99.99%准确率的新闻文本分类器(三)

五层人工神经网络对汉字字频特征的分类效果令人...

基于汉字字频特征实现99.99%准确率的新闻文本分类器(一)

基于中文是表义文字而不是表音文字,我认为直接采用汉字字频作为文本的特征,比词频更能精确描述文本的内容。

新闻推荐系统之朴素贝叶斯分类器文本分类

因为最近需要为自己团队的项目开发新闻推荐的功能模块,在推荐算法这一块涉及到了基于内容的推荐算法(Content-Based Recommendation),因此用到了朴素贝叶斯来对抓取的新闻进行分类,...

【机器学习实战】网格搜索--贝叶斯新闻文本分类器调优

#对文本分类的朴素贝叶斯模型的超参数组合进行网格搜索 #从sklearn.datasets中导入20类新闻文本抓取器 from sklearn.datasets import fetch_20news...

数据挖掘-基于贝叶斯算法及KNN算法的newsgroup18828文本分类器的JAVA实现(下)

本文接 数据挖掘-基于贝叶斯算法及KNN算法的newsgroup18828文档分类器的JAVA实现(上)  (update 2012.12.28 关于本项目下载及运行的常见问题 FAQ见 newsg...

数据挖掘-基于贝叶斯算法及KNN算法的newsgroup18828文本分类器的JAVA实现(上)

(update 2012.12.28 关于本项目下载及运行的常见问题 FAQ见 newsgroup18828文本分类器、文本聚类器、关联分析频繁模式挖掘算法的Java实现工程下载及运行FAQ )本文主...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)