-
Notifications
You must be signed in to change notification settings - Fork 416
文本分类 说明文档
冬日新雨 edited this page Feb 7, 2021
·
3 revisions
采用朴素贝叶斯的概率分布,分析文本分类语料中,各个类别的高频特征词汇。
>>> import jieba
>>> import jionlp as jio
>>> dataset_x = ['房间比较差,挺糟糕的,尤其是洗手间。',
'真糟糕!连热水都没有。',
'价格比比较不错的酒店。']
>>> dataset_y = ['负', '负', '正']
>>> dataset_x = [jieba.lcut(text) for text in dataset_x] # 采用任何分词器处理均可
>>> dataset_x = [jio.remove_stopwords(text_segs) for text in dataset_x] # 去停用词
>>> result = jio.text_classification.analyse_freq_words(
... dataset_x, dataset_y, min_word_freq=1)
# {
# '负': {
# '糟糕': [2, 1.0],
# '没有': [1, 1.0],
# '差': [1, 1.0]
# },
# '正': {
# '不错': [1, 1.0]
# }
# }
- 采用朴素贝叶斯的概率分布,分析文本分类语料中,各个类别的高频特征词汇,用于制作类型词典。
- 分析完毕后,方便加入模型当中,形成有效的模型和规则词典相结合的模型,提高模型的稳定性以及F1 值。具体来讲,获取每个类别 y 对应的词汇 x 的条件分布,即 p(x|y),找出其中概率最高,即大于 min_word_threshold 的词汇表,即该类的特征词。对于一般的判别式神经网络模型而言,这些词汇的概率在数据量偏少的情况下,或模型参数量过大的情况下,是很难学习得到的。因此,将这些词信息以各种形式融入模型,可以有效提升模型的 F1 值。根据经验,往往能提升 2% ~ 8%。
-
min_word_freq
指在统计范围内的最低词频,默认 10,;min_word_threshold
指在一个类别语料中,特征词的条件概率的最低值,默认 0.8。
对给定的文本分类语料,按照训练、验证、测试进行划分,统计数据集中各个类别的数量和占比,计算训练、验证、测试集的相对熵,判断数据集分割是否合理。
>>> import jionlp as jio
>>> dataset_x = ['美股大涨...', '金融市场开放...', '小米无屏电视...', ...]
>>> dataset_y = ['财经', '财经', '科技', ...]
>>> train_x, train_y, valid_x, valid_y, test_x, test_y, stats = \
... jio.text_classification.analyse_dataset(dataset_x, dataset_y)
>>> print(stats)
>>> print(jio.text_classification.analyse_dataset.__doc__)
whole dataset:
财经 32,268 84.52%
科技 5,910 15.48%
total 38,178 100.00%
train dataset: 80.00%
财经 25,848 84.63%
科技 4,694 15.37%
total 30,542 100.00%
valid dataset: 5.00%
财经 32,268 84.52%
科技 5,910 15.48%
total 1,908 100.00%
test dataset: 15.00%
财经 4,840 84.53%
科技 886 15.47%
total 5,726 100.00%
train KL divergence: 0.000007, info dismatch: 0.00%
valid KL divergence: 0.001616, info dismatch: 0.26%
test KL divergence: 0.000000, info dismatch: 0.00%
-
info dismatch
信息比例越低,证明数据集划分的各类别比例越贴近数据全集的分布。 - 当文本分类数据集为多标签分类时,须指定参数
multi_label(bool)
,此时,打印各个数据子集的 total 百分比将大于100%,说明了多标签数据的大致比例。