Advertisement

零基础入门NLP之新闻文本分类_Task2

阅读量:

零基础入门NLP之新闻文本分类_Task2

Taks2中要完成的主要是对新闻数据的分布规律进行探索和了解。这里主要是对代码进行了复现与详解。
1.导入第三方模块

复制代码
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    from collections import Counter     # python中自带的计数器
    
    
    python
    
    

2.读取训练集,这里我导入了全量训练集

复制代码
    train_df = pd.read_csv(r'D:\Users\Felixteng\Documents\Pycharm Files\Nlp\data\train_set.csv', sep='\t')
    train_df.head()
    
    
    python
    
    

在这里插入图片描述
可以发现,数据主要由’text’和’label’两个部分构成。text由空格隔开。

3.句子长度分析

复制代码
    '''
    数据中每行句子的字符使用空格进行隔开,所以可以直接统计单次的个数来得到每个句子的长度
    %pylab inline 是jupyternotebook中用于调试的的魔法函数,pycharm中用回plt.show()即可
    '''
    train_df['text_len'] = train_df['text'].apply(lambda x: len(x.split(' ')))   # text数据按空格分割后计数
    print(train_df['text_len'].describe())  # 对每个句子的长度做统计性描述
    
    
    python
    
    
在这里插入图片描述

可以看出,数据文本较长,每个句子平均由907个字符构成,最短的句子长度为2,最长的句子长度为57921。

4.以句子长度绘制直方图

复制代码
    plt.figure(figsize=(10, 5))
    plt.subplot(1, 2, 1)
    sns.distplot(train_df['text_len'], axlabel='Text char count', kde=False, bins=200)
    
    
    python
    
    

在这里插入图片描述
5.针对数据集的类别进行分布统计,具体统计每类新闻的样本个数

复制代码
    train_df['label'].value_counts().plot(kind='bar')
    plt.xlabel('category')
    
    
    python
    
    

在这里插入图片描述
可以看出,数据集类别分布不均匀,训练集中科技类新闻最多(近4W),其次是股票类新闻,最少是星座类新闻(不到1K)
数据集中标签的对应关系如下
{‘科技’: 0, ‘股票’: 1, ‘体育’: 2, ‘娱乐’: 3, ‘时政’: 4, ‘社会’: 5, ‘教育’: 6,
‘财经’: 7, ‘家具’: 8, ‘游戏’: 9, ‘房产’: 10, ‘时尚’: 11, ‘彩票’: 12, ‘星座’: 13}

6.字符分布统计,统计每个字符出现的次数

复制代码
    # all_lines = ' '.join(list(train_df['text']))    # 将所有text用空格连接起来
    # word_count = Counter(all_lines.split(" "))
    # word_count = sorted(word_count.items(), key=lambda d: d[1], reverse=True)
    
    
    python
    
    

因为电脑原因,我这里报了内存不足的错误:MemoryError.加大了pycharm的内存还是没能解决。

7.反推标点符号

复制代码
    train_df['text_unique'] = train_df['text'].apply(lambda x: ' '.join(list(set(x.split(' ')))))
    
    
    python
    
    
复制代码
    '''
    set()函数表示创建一个集合,特点是集合内不会有重复的元素
    text_unique可以理解成一句话中所有不重复的字符用空格连接而成的单元句子
    '''
    all_lines = ' '.join(list(train_df['text_unique']))     # 这里把所有去重后的句子用空格连接
    word_count = Counter(all_lines.split(' '))  # 去重以后不报内存不足的错误了
    '''
    Counter()函数返回的是一个字典,包括了元素及其出现的次数
    '''
    word_count = sorted(word_count.items(), key=lambda d: int(d[1]), reverse=True)
    '''
    sorted(iterable, key, reverse)
    iterable:可迭代对象;
    key:主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,
        指定可迭代对象中的一个元素进行排序,这里取字典中的第二个元素,也就是出现次数来进行排序;
    reverse:排序规则,True-降序/False-升序(默认)
    '''
    print(word_count[0])
    print(word_count[1])
    print(word_count[2])
    print(word_count[3])
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-16/vPzTRLrytQ6f8EHaGcj2hixXg9Zo.png)

发现字符3750,900,648覆盖率很高,很有可能是标点符号。

8.统计每类新闻中出现次数最多的字符,先根据label将数据集分类,创建一个分类标签的函数

复制代码
    def select_label(df, num):
    df_num = df[df['label'] == num]
    return df_num
    
    
    python
    
    

以统计科技类新闻出现次数最多的字符为例

复制代码
    df_0 = select_label(train_df, 0)
    all_lines_0 = ' '.join(list(df_0['text']))
    word_count_0 = Counter(all_lines_0.split(' '))
    word_count_0 = sorted(word_count_0.items(), key=lambda d: d[1], reverse=True)
    print(word_count_0[0])
    
    
    python
    
    

在这里插入图片描述
可以知道科技类出现最多的字符是3750。

如果一个个遍历觉得麻烦,可以创建一个函数,将数据按标签分类后使用lambda遍历

复制代码
    def top_count(x):
    all_lines = ' '.join(list(x))
    word_count = Counter(all_lines.split(' '))
    word_count = sorted(word_count.items(), key=lambda d: int(d[1]), reverse=True)
    return word_count[0]
    
    
    python
    
    

这次任务主要是探索新闻文本数据,为下一次使用机器学习文本分类任务打下基础。

全部评论 (0)

还没有任何评论哟~