背景
文本挖掘是指从大量文本数据中抽取实现未知的、可理解的、最终可用的知识的过程,同时运用这些知识更好地组织信息以便将来参考。即从非结构化的文本中寻找知识的过程。
目前文本挖掘主要有7个主要领域:
- · 搜索和信息检索IR
- · 文本聚类:使用聚类方法对词汇、片段、段落或文件进行分组和归类
- · 文本分类:对片段、段落或文件进行分组和归类,在使用数据挖掘分类方法的基础上,经过训练地标记实例模型
- · Web挖掘:在互联网上进行数据和文本挖掘,病特别关注网络的规模和相互联系
- · 信息抽取IE:从非结构文本中识别和抽取有关的事实和关系;从非结构化或者半结构化的文本中抽取结构化的抽取出结构化数据的过程
- · 自然语言处理NLP:从语法、语义的角度发现语言本质的结构和所表达的意义
中文语言的文本分类技术和流程,主要包括下面几个步骤:
1. 预处理:去除文本噪声信息,例如HTML标签,文本格式转换,检测句子边界
2. 中文分词:使用中文分词器为文本分词,并去除停用词
3. 构建词向量空间:统计文本词频,生成文本的词向量空间
4. 权重策略——TF-IDF:使用TF-IDF发现特征词,并抽取为反映文档主题的特征
5. 分类词:使用算法训练分类器
6. 评价分类结果
1. 预处理
a. 选择处理文本的范围
b. 建立分类文本语料库
已经分好类的文本资源
待分类的文本语料,可以使训练集的一部分,也可以是外部来源的文本语料
c. 文本格式转化:使用Python的lxml库去除html标签
d. 检测句子边界:标记句子的结束
2. 中文分词
分词是将连续的字序列按照一定的规范重新组合成词序列的过程,中文分词即将一个汉字序列(句子)切分成一个个独立的单词,中文分词很复杂,从某种程度上并不完全是一个算法问题,最终概率论解决了这个问题,算法是基于概率图模型的条件随机场(CRF)
分词是自然语言处理中最基本,最底层的模块,分词精度对后续应用模块的影响很大,文本或句子的结构化表示是语言处理中最核心的任务,目前文本的结构化表示分为四大类:词向量空间、主体模型、依存句法的树表示、RDF的图表示。
下面给出中文词的示例代码:
# -*- coding: utf-8 -*-
import os
import jieba
def savefile(savepath, content):
fp = open(savepath, "w",encoding='gb2312', errors='ignore')
fp.write(content)
fp.close()
def readfile(path):
fp = open(path, "r", encoding='gb2312', errors='ignore')
content = fp.read()
fp.close()
return content
# corpus_path = "train_small/" # 未分词分类预料库路径
# seg_path = "train_seg/" # 分词后分类语料库路径
corpus_path = "test_small/" # 未分词分类预料库路径
seg_path = "test_seg/" # 分词后分类语料库路径
catelist = os.listdir(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("\r\n", "").strip() # 删除换行和多余的空格
content_seg = jieba.cut(content)
savefile(seg_dir + file_path, " ".join(content_seg))
print("分词结束")
为了后续生成词向量空间模型的方便,这些分词后的文本信息还要转换成文本向量信息并对象化,利用了Scikit-Learn库的Bunch数据结构,具体代码如下:
import os
import pickle
from sklearn.datasets.base import Bunch
#Bunch 类提供了一种key,value的对象形式
#target_name 所有分类集的名称列表
#label 每个文件的分类标签列表
#filenames 文件路径
#contents 分词后文件词向量形式
def readfile(path):
fp = open(path, "r", encoding='gb2312', errors='ignore')
content = fp.read()
fp.close()
return content
bunch=Bunch(target_name=[],labe