Advertisement

【NLP】新闻文本分类 ----数据读取及分析

阅读量:

【NLP】新闻文本分类

    • 文本分析
      • 句子分布分析

        • 句子分布结论
      • 文本分析

        • 文本类型分析
    • 字符分布
    • 断句分析
    • 分类新闻分析

在上一节中,在完成读取数据集之后,则可以对数据集执行数据分析操作。即使对于非结构化数据也不需要做大量的数据分析;然而,在进行数据分析时仍然能够发现一些模式。

在此阶段我们进行了全部训练集数据的读取。基于此分析结果,请回答以下问题:

  1. 赛题数据中的新闻文本长度情况如何?
  2. 各分类别在赛题中的分布情况如何?有哪些类别占据主导地位?
  3. 各字符在赛题中的出现频率情况如何?

文本分析

句子分布分析

通过观察可知,在每一行的句子中字符均以空格的形式分隔开来,并对这些句子的长度以及它们长度的统计分布情况进行记录和分析:

复制代码
    from matplotlib import pyplot as plt
    %matplotlib inline
    raw_data['text_len'] = raw_data.text.apply(lambda x:len(x.split(' ')))    #统计列中每个句子的字数
    print(raw_data['text_len'].describe())
    
    plt.hist(raw_data.text_len,bins = 200)
    plt.xlabel('text char length')
    plt.title('Histogram of Char Length')
    plt.show()
    
    
    raw_data['text_len'].plot.box(title="Boxplot of Char Length")
    plt.grid(linestyle="--", alpha=0.3)
    plt.show()
句子分布结论

通过描述性统计可以发现句子长度的分布如下:

在这里插入图片描述

绘制直方图和箱线图如下:

在这里插入图片描述
在这里插入图片描述

通过分析上文的描述统计结果可以看出,在本次赛题所涉及的内容中,文本长度平均约为907个字符,并且绝大多数句子的长度均不超过2000字。由此可见,在箱线图中所表现出来的较大极差表明数据分布较为分散,并且仅有较少数量的离群点存在。

文本分析

文本类型分析
复制代码
    raw_data['label'].value_counts().plot(kind ='bar')
    plt.title('Class Count')
    plt.xlabel('News Category')
    plt.show()
在这里插入图片描述

由此可见,在数据集中各标签之间的对应关系明确如下所示:{‘科技’→0,‘股票’→1,'体育'→2,'娱乐'→3,'时政'→4','社会'→5','教育'→6','财经'' →7','家居'' →8','游戏'' →9','房产'' →10','时尚'' →11','彩票'' →12','星座'' →13}

通过统计结果可以看出,在本次比赛中所选赛题的数据集类别分布存在明显不均衡性。在训练集中占比最高的是科技类资讯内容(即科技领域的报道),其后为股票市场相关报道(即股票领域的文章),而最少的是关于星座的信息(即星座相关的新闻)。

字符分布
复制代码
    from collections import Counter
    
    all_lines = ' '.join(list(raw_data['text']))
    word_count = Counter(all_lines.split(" "))
    word_count = sorted(word_count.items(), key=lambda d:d[1], reverse = True)
    
    print(len(word_count))
    print(word_count[0],word_count[-1],sep = '\n')
    
    data['text_unique'] = data['text'].apply(lambda x:' '.join(list(set(x.split()))))
    all_lines = ' '.join(list(data['text_unique']))
    word_count = Counter(all_lines.split())
    word_count = sorted(word_count.items(),key = lambda x: x[1],reverse = True)
    
    print(word_count[0])
    print(word_count[1])
    print(word_count[2])
    
    #[('3750', 197997)
    #('900', 197653)
    #('648', 191975)]

通过观察频率最高的数据可以看出,在所有文本中出现次数最多的那个特定字段达到了最大值。具体来说,在总文本中占用了3750个位置。此外,在分析过的20万篇新闻中,这些特定的字段分别占据了大约99%的覆盖率。很可能这些字段就是常见的标点符号。

断句分析

基于上述分析结果表明,在确定文本中的每个句子时(即以标点符号分隔开的一个句子),我们只需统计每种结束标记出现的次数即可推算出文本中总共有多少个独立句落(即独立存在的完整句)。参考相关文献显示,在统计过程中存在一种情况较为特殊(即频率排名第三的标点符号难以明确区分),这意味著那些以问号或感叹号结尾的具体句落无法被准确计算在内(因为它们无法与其它标记产生明确区分)。因此采用这三种标点形式作为判断依据

复制代码
    raw_data['word_size'] = raw_data['text'].apply(lambda x: x.split(' ').count('648')+ x.count('900') + x.count('3750'))
    
    raw_data['word_size'].mean()

得到平均数为78.370825。

分类新闻分析

根据不同的新闻分类,给出不同类型出现次数最多的字符。

复制代码
    label_frequancy = []
    for i in range(14):
    new_data = train[train.label == i].text
    all_lines = ' '.join(new_data)
    word_count = Counter(all_lines.split(" "))
    word_count = sorted(word_count.items(),key = lambda x:x[1],reverse = True)
    label_frequancy.append(word_count[0])

可得到结果分布。

全部评论 (0)

还没有任何评论哟~