python实现中文文本分类(一)jieba分词

中文文本分类的步骤:
1.预处理:去除文本的噪声信息,例如HTML标签、文本格式转换、检测句子边界等。
2.中文分词:使用中文分词器为文本分词,并去除停用词。
3.构建词向量空间:统计文本词频,生成文本的词向量空间。
4.权重策略——TF-IDF方法:使用TF-IDF发现特征词,并抽取为反映文档主题的特征。
5.分类器:使用算法训练分类器。
6.评价分类结果:分类器的测试结果分析。

中文分词是将一个汉字序列切分成单独的词。jieba是专门使用python语言开发的分词系统,占用资源较小,常识类文档的分词精度较高。
1.直接通过PIP下载使用jieba分词。

pip install jieba -i https://pypi.douban.com/simple/

2.测试jieba样例代码

import jieba

seglist = jieba.cut("小明1995年毕业于清华大学",cut_all=False)
print("默认切分结果为:","/ ".join(seglist))
seglist=jieba.cut("小明1995年毕业于清华大学",cut_all=True)
print("全切分结果为:","/ ".join(seglist))
seglist=jieba.cut_for_search("小明1995年毕业于清华大学")
print("搜索引擎切分结果为:","/ ".join(seglist))

jieba分词支持的分词模式包括默认切分、全切分、搜索引擎几种。输出结果如下:

默认切分结果为: 小明/ 1995// 毕业// 清华大学
全切分结果为: 小// 1995// 毕业/ 于清华/ 清华/ 清华大学/ 华大/ 大学
搜索引擎切分结果为: 小明/ 1995// 毕业// 清华/ 华大/ 大学/ 清华大学

3.分词主程序
本文采用的复旦大学文本分词语料库,下载地址为复旦大学谭松波中文文本分类语料库。

import jieba
import os


def savefile(savepath, content):
    fp = open(savepath, 'w+',encoding='utf-8')
    fp.write(content)
    fp.close()


def readfile(path):
    fp = open(path, 'rb')
    content = fp.read()
    fp.close()
    return content


corpus_path = "./train/"  # 未分词分类语料库路径
seg_path = "./data/jieba/"  # 分词后分类语料库路径
catelist = os.listdir(corpus_path)  # 获取corpus_path下的所有子目录
# 获取每个目录下的所有文件
for mydir in catelist:
    class_path = corpus_path + mydir + "/"  # 拼出分类子目录的路径
    seg_dir = seg_path + mydir + "/"  # 拼出分词后的语料分类目录
    if not os.path.exists(seg_dir):  # 是否存在目录,如果没有则创建
        os.makedirs(seg_dir)
    file_list = os.listdir(class_path)  # 获取类别目录下的所有文件
    for file_path in file_list:  # 遍历类别目录下的文件
        fullname = class_path + file_path  # 拼出文件名全路径
        content = readfile(fullname).strip()  # 读取文件内容
        content = content.replace(b"\r\n", b" ").strip()  # 删除换行和多余的空格
        content_seg = jieba.cut(content)  # 为文件内容分词
        savefile(seg_dir + file_path, " ".join(content_seg))
print("中文分词结束!")

4.将文本信息向量化
为了方便后续生成向量空间模型,将分词后的文本信息转换为文本向量信息并对象化。这里需要引入一个scikit-learn库的Bunch数据结构。最终得到一个train_set.dat文件,此文件保存所有训练集文件的所有分类信息,以及每个文件的文件名、文件所属分类和词向量。

from sklearn.datasets.base import Bunch
bunch = Bunch(target_name=[], label=[], filenames=[], contents=[])
# target_name:所有分类集名称列表
# label:每个文件的分类标签列表
# filenames:文件路径
# contents:分词后词向量形式
wordbag_path = "./data/train_word_bag/train_set.dat"  # 分词语料Bunch对象持久化文件路径
seg_path = "./data/jieba/"  # 分词后分类语料库路径
catelist = os.listdir(seg_path)
bunch.target_name.extend(catelist)  # 将类别信息保存到Bunch对象中
for dir in catelist:
    class_path = seg_path + dir + "/"
    file_list = os.listdir(class_path)
    for file_path in file_list:
        fullname = class_path + file_path
        bunch.label.append(dir)  # 保存当前文件的分类标签
        bunch.filenames.append(fullname)  # 保存当前文件的文件路径
        bunch.contents.append(readfile(fullname).strip())  # 保存文件词向量
# Bunch对象持久化
# 将数据以对象的形式保存,python提供了pickle模块支持对象的读写
file_obj = open(wordbag_path, 'wb')
pickle.dump(bunch, file_obj)
file_obj.close()
print("构建文本对象结束")

你可能感兴趣的:(机器学习学习笔记,python,深度学习)