基于NLP自然语言构建的文档自动分类系统(搜狐娱乐)—word-of-bag模型

开发环境`jupyter notebook`

项目数据下载地址:https://download.csdn.net/download/wsp_1138886114/10612733
项目数据下载地址:https://download.csdn.net/download/wsp_1138886114/10612746

1 加载数据

import numpy as np
import pandas as pd

# 查看训练数据
train_data = pd.read_csv('data/sohu_train.txt', sep='\t', header=None, 
                         dtype=np.str_, encoding='utf8', names=[u'频道', u'文章'])
train_data.head()

# 载入停用词
stopwords = set()
with open('data/stopwords.txt', 'rb') as infile:
    for line in infile:
        line = line.rstrip('\n')
        if line:
            stopwords.add(line.lower())

2 计算每个文章的词袋

import jieba
from sklearn.feature_extraction.text import TfidfVectorizer

tfidf = TfidfVectorizer(tokenizer=jieba.lcut, 
                        stop_words=stopwords, 
                        min_df=50, 
                        max_df=0.3)
x = tfidf.fit_transform(train_data[u'文章'])

print (u'词表大小: {}'.format(len(tfidf.vocabulary_)))

3 训练分类器

# 编码目标变量
from sklearn.preprocessing import LabelEncoder
y_encoder = LabelEncoder()
y = y_encoder.fit_transform(train_data[u'频道']) 

# 编码X变量
x = tfidf.transform(train_data[u'文章'])

from sklearn.model_selection import train_test_split

#划分训练测试数,据根据y分层抽样,测试数据占20%
train_idx, test_idx = train_test_split(range(len(y)), test_size=0.2, stratify=y)
train_x = x[train_idx, :]
train_y = y[train_idx]
test_x = x[test_idx, :]
test_y = y[test_idx]
from sklearn.linear_model import LogisticRegression 

model = LogisticRegression(multi_class='multinomial', solver='lbfgs')
model.fit(train_x, train_y)

4 模型效果评估

from sklearn.metrics import confusion_matrix, precision_recall_fscore_support 

# 在测试集上计算模型的表现
test_y_pred = model.predict(test_x)

# 计算混淆矩阵
pd.DataFrame(confusion_matrix(test_y, test_y_pred), 
             columns=y_encoder.classes_, 
             index=y_encoder.classes_) 
  ~  体育健康女人娱乐房地产教育文化新闻旅游汽车科技财经
体育38903001411010
健康036215001490045
女人1735114101635110
娱乐104346063622030
房地产001336630740115
教育075103478221045
文化1313341332178270
新闻6570142115271881926
旅游007104711364222
汽车11210111238406
科技0722244179333614
财经0100119033131019304
# 计算各项评价指标
def eval_model(y_true, y_pred, labels):
    # 计算每个分类的Precision, Recall, f1, support
    p, r, f1, s = precision_recall_fscore_support(y_true, y_pred)
    # 计算总体的平均Precision, Recall, f1, support
    tot_p = np.average(p, weights=s)
    tot_r = np.average(r, weights=s)
    tot_f1 = np.average(f1, weights=s)
    tot_s = np.sum(s)
    res1 = pd.DataFrame({
        u'Label': labels,
        u'Precision': p,
        u'Recall': r,
        u'F1': f1,
        u'Support': s
    })
    res2 = pd.DataFrame({
        u'Label': [u'总体'],
        u'Precision': [tot_p],
        u'Recall': [tot_r],
        u'F1': [tot_f1],
        u'Support': [tot_s]
    })
    res2.index = [999]
    res = pd.concat([res1, res2])
    return res[[u'Label', u'Precision', u'Recall', u'F1', u'Support']] 

eval_model(test_y, test_y_pred, y_encoder.classes_)

5 模型保存

# 保存模型到文件
import dill
import pickle
model_file = os.path.join(output_dir, u'model.pkl')
with open(model_file, 'wb') as outfile:
    pickle.dump({
        'y_encoder': y_encoder,
        'tfidf': tfidf,
        'lr': model
    }, outfile) 

6 对新文档预测

# 加载新文档数据
new_data = pd.read_csv('data/sohu_test.txt', sep='\t', header=None, 
                       dtype=np.str_, encoding='utf8', names=[u'频道', u'文章'])
new_data.head() 

# 加载模型
import pickle

with open(model_file, 'rb') as infile:
    model = pickle.load(infile) 

# 对新文档预测(这里只对前10篇预测)
# 1. 转化为词袋表示
new_x = model['tfidf'].transform(new_data[u'文章'][:10]) 

# 2. 预测类别
new_y_pred = model['lr'].predict(new_x) 

# 3. 解释类别
pd.DataFrame({u'预测频道': model['y_encoder'].inverse_transform(new_y_pred), 
              u'实际频道': new_data[u'频道'][:10]}) 

输出:
|      | 实际频道 | 预测频道 |
| ---- | -------- | -------- |
| 0    | 娱乐     | 娱乐     |
| 1    | 娱乐     | 体育     |
| 2    | 娱乐     | 娱乐     |
| 3    | 娱乐     | 娱乐     |
| 4    | 娱乐     | 教育     |
| 5    | 娱乐     | 娱乐     |
| 6    | 娱乐     | 娱乐     |
| 7    | 娱乐     | 娱乐     |
| 8    | 娱乐     | 娱乐     |
| 9    | 娱乐     | 娱乐     |
本文首先介绍了Internet的发展状况,指出Internet是一个庞大、杂乱、瞬息万变的信息源泉,仅仅依靠网页上的超文本链用户是无法方便、快捷地找到自己所需的信息的,提供WWW信息导航服务的搜索引擎是解决这个问题的一个途径。在介绍了传统的Spider式搜索引擎和基于人工分类的目录式搜索引擎的特点并对它们作了比较之后,指出支持分类目录是Spider式搜索引擎发展的趋势,而应用文档自动分类领域的研究对收集的网页自动分类,实现对分类目录的支持是一种可行的方法。然后,本文介绍了天网搜索引擎的现状,分析了它的特点,说明要进一步发展天网系统,应当采用文档自动分类技术支持分类目录。 接下来,本文介绍了文档自动分类的意义和算法的分类,然后分别介绍了m-ary分类系统和Independent Binary分类系统常用的算法和各个算法的特点,接着介绍了从m-ary分类系统转换到Binary Independent分类系统常用的三种算法以及这两种分类系统的性能评价指标,然后分析了特征项选取对分类系统的影响,介绍了常用的五种特征项选取的方法。 结合现有的天网搜索引擎,本文提出了天网系统支持分类目录的设计方案,详细介绍了自动分类系统的实现,说明了分类系统选用的分类算法的是KNN算法,选用的评价特征项重要性的指标是CHI统计量,选用的转换算法是Scut算法,然后讨论了自动分类系统在实现过程中遇到的问题以及解决的办法:1 使用两个文件描述分类目录,用Begin——End结构表示类之间的层次结构;2 通过限制文档向量最大分量的值显著地提高了系统分类的性能指标;3 使用稀疏矩阵在程序中表示文档向量,极大地缩短了分类响应时间,节省了占用的内存空间。在说明了分类系统使用的分类目录、训练集和测试集之后,本文给出了系统的测试数据。 最后,本文详细介绍了将自动分类系统集成在现有的天网系统中的方法,讨论了对天网系统各个子系统的改造。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SongpingWang

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值