汉语文本分类,汉语分词与停用词的功效

2019-09-23 06:23 来源:未知

如何获取这些数据,可以通过 alex 排名靠前的网站,利用爬虫进行获取。本文对于正常数据的获取,选取 alex 排名前 4500 的网站,通过爬虫,提取网页的 title 和 deion 以及 keywords 作为原始文本。对于色情数据的获取亦然,通过爬虫对已经已经积累的 4500 个的站点进行文本收集。由于这部数据是敏感数据,因此数据集无法向大家公开,还请见量。

TF-IDF权重策略:计算文本的权重向量

1,TF-IDF的含义:词频逆文档频率。如果某个词在一篇文章中出现的频率高(词频高),并且在其他文章中很少出现(文档频率低),则认为该词具有很好的类别区分能力,适合用来分类。IDF其实是对TF起抵消作用。
2,词频TF的定义:某一个给定的词语在该文件中出现的频率(对词数的归一化)
3,逆文件频率IDF:某一特定词语的IDF,由总文件数除以包含该词语的文件的数目,再将商取对数
4,TF-IDF的计算:TF与IDF的乘积
5,将分词后的持久化语料库文件dat利用TF-IDF策略转化,并持久化的代码见文件

#coding=utf-8

import sys
import os 
from sklearn.datasets.base import Bunch  # 导入Bunch类
import cPickle as pickle  #导入持久化类

from sklearn import feature_extraction
from sklearn.feature_extraction.text import TfidfTransformer   # TF-IDF向量转换类
from sklearn.feature_extraction.text import TfidfVectorizer   # TF-IDF向量生成类


reload(sys)
sys.setdefaultencoding('utf-8')  #UTF-8输出环境

# 读取和写入Bunch对象的函数

def readbunchobj(path):   # 读取bunch对象函数
    file_obj = open(path,"rb")
    bunch = pickle.load(file_obj)  # 使用pickle.load反序列化对象
    file_obj.cloase()
    return bunch

def writebunchobj(path,bunchobj):   # 写入bunch对象函数
    file_obj = open(path,"wb")
    pickle.dump(bunchobj,file_obj)   # 持久化对象
    file_obj.close()

###################################从训练集生成TF-IDF向量词袋

# 1,导入分词后的词向量Bunch对象
path = "train_word_bag/train_set.dat"  # 词向量空间保存路径(就是分词后持久化的文件路径)
bunch = readbunchobj(path)   # 调用函数读取bunch对象,赋值给bunch

# 2,构想TF-IDF词向量空间对象,也是一个Bunch对象
tfidfspace = Bunch(target_name=bunch.target_name,label=bunch.label,filenames=bunch.filenames,tdm=[],vocabulary=[])     # 构建Bunch对象,将bunch的部分值赋给他

# 3,使用TfidfVectorizer初始化向量空间模型
vectorizer = TfidfVectorizer(stop_words=stpwrdlist,sublinear_tf=True,max_df=0.5)
transformer=TfidfTransformer()   # 创建一个该类的实例,该类会统计每个词语的TF-IDF权值
# 文本转化为词频矩阵,单独保存字典文件
tfidfspace.tdm = vectorilzer.fit_transform(bunch.contents)  # 将bunch.content的内容……赋给模型的tdm值
tfidfspace.vocabulary = vectorizer.vocabulary   # ????????????????

# 4,持久化TF-IDF向量词袋
space_path = "train_word_bag/tfidfspace.dat"   # 词向量词袋保存路径
writebunchobj(space_path,tfidfspace)  # 调用写入函数,持久化对象

小谈:中文分词技术

在面对加密通信报文情况下的数据时候,如何来识别不可描述网站呢?当然关于这方面,我有幸做过一些研究和实践。如果对这种场景下面识别感兴趣的同学,可以在我的的读者圈留言。我会再写一篇跟大家一同探讨。

2.1 文本挖掘和文本分类的概念

1,文本挖掘:指从大量的文本数据中抽取事先未知的,可理解的,最终可使用的知识的过程,同时运用这些知识更好的组织信息以便将来参考。
简言之,就是从非结构化的文本中寻找知识的过程
2,文本挖掘的细分领域:搜索和信息检索(IR),文本聚类,文本分类,Web挖掘,信息抽取(IE),自然语言处理(NLP),概念提取。
3,文本分类:为用户给出的每个文档找到所属的正确类别
4,文本分类的应用:文本检索,垃圾邮件过滤,网页分层目录自动生成元数据,题材检测
5,文本分类的方法:一是基于模式系统,二是分类模型


 

现在其实面临的是一个二分类的问题,即判断一个网站是不可描述网站还是正常的网站。这个问题可以归结为 NLP 领域的文本分类问题。而对于文本分类来说的第一步就是语料的获取。在第一部分也已经分析了,相关语料就是网站的 title,deion 以及 keywords。

2.2 文本分类项目

新词,专业术语称为未登录词。也就是那些在字典中都没有收录过,但又确实能称为词的那些词。最典型的是人名,人可以很容易理解句子“王军虎去广州了”中,“王军虎”是个词,因为是一个人的名字,但要是让计算机去识别就困难了。如果把“王军虎”做为一个词收录到字典中去,全世界有那么多名字,而且每时每刻都有新增的人名,收录这些人名本身就是一项巨大的工程。即使这项工作可以完成,还是会存在问题,例如:在句子“王军虎头虎脑的”中,“王军虎”还能不能算词?

一,哪些信息是网站关键的语料信息

2.2.6 使用朴素贝叶斯分类模块

常用的文本分类方法:kNN最近邻算法,朴素贝叶斯算法,支持向量机算法

本节选择朴素贝叶斯算法进行文本分类,测试集随机选取自训练集的文档集合,每个分类取10个文档

训练步骤和训练集相同:分词 (文件test_corpus) 》生成文件词向量文件 》 生成词向量模型。

(不同点:在训练词向量模型时,需加载训练集词袋,将测试集生成的词向量映射到训练集词袋的词典中,生成向量空间模型。)代码见文件。

#1,导入分词后的词向量Bunch对象
path = "test_word_bag/test_set.dat"   # 词向量空间保存路径
bunch = readbunchobj(path)  # 调用函数读取bunch对象,赋值给bunch

#2,构建测试集TF-IDF向量空间testspace
testspace = Bunch(target_name=bunch.target_name,label+bunch.label,filenames=bunch.filenames.tdm=[],vocabulary=[])   

#3, 导入训练集的词袋(多这一步,与训练集不同)
trainbunch = readbunchobj("train_word_bag/tfidfspace.dat")  # tfidfspace.dat文件是训练集使用TF-IDF策略并持久化生成的

#4, 使用TfidfVectorizer初始化向量空间模型
vectorizer=TfidfVectorizer(stop_words=stpwrdlst,sublinear_tf=True,max_df=0.5,vocabulary=trainbunch.vocabulary)
transformer=TfidfTransformer()    # 创建一个该类的实例,该类会统计每个词语的TF-IDF权值
testspace.tdm=vectorizer.fit_transform(bunch.contents)   
testspace.vocabulary=trainbunch.vocabulary

#5, 创建词袋并持久化
space_path = "test_word_bag/testspace.dat"  #词向量空间保存路径
writebunchobj(space_path,testspace)  # 调用写入函数,持久化对象

执行多项式贝叶斯算法进行测试文本分类,并返回分类精度,代码见文件

# 执行多项式贝叶斯算法并进行测试文本分类,并返回分类精度

#1,导入多项式贝叶斯算法包
from sklearn.naive_bayes import MultinomialNB #导入多项式贝叶斯算法包

#2,执行预测

trainpath = "train_word_bag/tfidfspace.dat"
train_set = readbunchobj(trainpath)     #导入训练集向量空间

testpath = "test_word_bag/testspace.dat"
test_set = readbunchobj(testpath)        # 导入测试集向量空间

#应用朴素贝叶斯算法
# alpha:0.001   alpha越小,迭代次数越多,精度越高
clf = MultinomialNB(alpha = 0.001).fit(train_set.tdm,train_set.label)

# 预测分类结果
predicted = clf.predict(test_set.tdm)
total = len(predicted);rate = 0
for flabel,file_name,expct_cate in zip(test_set.label,test_set.filenames,predicted):
    if flabel !=expct_cate:
        rate+=1
        print file_name,":实际类别:",flabel,"-->预测类别:",expct-cate

print "error rate:",float(rate)*100/float(total),"%"

3、基于统计的分词方法

但是越来越多的网站已经迁移到 HTTPS,无法获取明文信息,该方法就不起作用了。

2.5 结语

本章讲解了机器学习的两个算法:朴素贝叶斯算法和K最近邻算法

介绍了文本分类的6个主要步骤:
1)文本预处理
2)中文分词
3)构建词向量空间
4)权重策略----TF-IDF方法
5)朴素贝叶斯算法器
6)评价分类结果

对于机械分词方法,可以建立一个一般的模型,在这方面有专业的学术论文,这里不做详细论述。

TAG标签:
版权声明:本文由99彩票发布于科技展览,转载请注明出处:汉语文本分类,汉语分词与停用词的功效