NLP之新闻文本分类实战(一)-EDA

文章目录

    • NLP之新闻文本分类实战(一)-EDA
    • 一、背景概述
    • 二、评价指标
    • 三、数据EDA(数据探索性分析)代码

NLP之新闻文本分类实战(一)-EDA

一、背景概述

​ 数据为新闻文本,已按照字符级别进行脱敏处理。数据集中一共有14个类别,对应关系为:{‘科技’: 0, ‘股票’: 1, ‘体育’: 2, ‘娱乐’: 3, ‘时政’: 4, ‘社会’: 5, ‘教育’: 6, ‘财经’: 7, ‘家居’: 8, ‘游戏’: 9, ‘房产’: 10, ‘时尚’: 11, ‘彩票’: 12, ‘星座’: 13}。训练集20w条样本,测试集A包括5w条样本,测试集B(用于网站模型评估, 不提供下载)包括5w条样本。训练集只有"label"和"text"两列,数据格式如下:
NLP之新闻文本分类实战(一)-EDA_第1张图片

二、评价指标

​ 预测类别的f1分数(精确率和召回率的调和平均数),公式如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dhss2oPP-1595433210598)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1595432360220.png)]

三、数据EDA(数据探索性分析)代码

class PrePreceor(object):
    # 加载数据,1w行,节省内存
    def load_data(self, path, count=10000):
        data = pd.read_csv(path, nrows=count, sep='\t')
        return data
    
    # 统计每篇文本的字符长度,最大和最小字符长度
    def eda_text_length(self, data):
        data["train_len"] = data["text"].apply(lambda x: len(x.split()))
        # print(data["train_len"].max(axis=0), data["train_len"].min(axis=0))
        print(data["train_len"].idxmax(), data["train_len"].idxmin())
        pass

    # 统计每个词在文档中出现的次数(即有多少篇文档出现了该字符)
    def eda_char_statistic(self, data):
        data["char_unique"] = data["text"].apply(lambda x: " ".join(list(set(x.split(" ")))))
        all_line = " ".join(list(data["char_unique"]))
        wc = Counter(all_line.split())
        wc = sorted(wc.items(), key=lambda t: int(t[1]), reverse=True)   # (dict()), 有序字典外层包含的括号,需要使用items()
        print("词出现的文档数量:", wc[0], wc[-1])
        pass
    
    # 统计每个词出现的词频
    def eda_char_frequency(self, data):
        all_text = " ".join(list(data["text"]))
        word_count = Counter(all_text.split())
        word_count = sorted(word_count.items(), key=lambda t: t[1], reverse=True)
        print("词频:", word_count[0], word_count[-1])   # 文章最多字符数量和最少字符数
        pass
    
    # 假设字符3750,字符900和字符648是句子的标点符号,请分析赛题每篇新闻平均由多少个句子构成?
    def eda_text_count(self, data):
        sep_li = ["3750", "900", "648"]
        data["sent_count"] = data["text"].apply(lambda line: len(re.split("|".join(sep_li), line)))
        print("每篇文章的句子数:\n", data["sent_count"].head(5))
        pass

    def eda_char_count(self, data, top=10):
        # 统计每类新闻中出现前top个次数最多的字符
        def myfunc(xx):
            g_word_freq = Counter((" ".join(xx["text"])).split())
            return [w for (w, f) in g_word_freq.most_common(top)]
        top_word_freq = data.groupby(by="label").apply(lambda g_df: myfunc(g_df))
        top_word_freq = (top_word_freq.reset_index()).rename(columns={0: "top_{}".format(top)})
        print("每类新闻中出现频率最高的前{}个如下:\n{}".format(top, top_word_freq))
        pass
    
processor = PrePreceor()
data = processor.load_data("{}/data/input/train_set.csv".format(base_dir))
processor.eda_text_length(data)
processor.eda_char_frequency(data)
processor.eda_char_statistic(data)
processor.eda_text_count(data)
processor.eda_char_count(data)

输出结果如下:
NLP之新闻文本分类实战(一)-EDA_第2张图片

你可能感兴趣的:(机器学习,pandas,EDA,新闻分类)