您的位置:澳门皇冠金沙网站 > 万物互联 > (二)中文文本分类--机器学习算法原理与编程实

(二)中文文本分类--机器学习算法原理与编程实

2019-10-03 02:17

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

2.2 文本分类项目

分析原因发现,经过切词后,有不少的 title 为空,或者 title 只有很少单词的情况。形成的特征较弱,这种单词较少的情况是导致识别率不高的重要原因。例如 title 只有一个单词 video,由于该词在色情语料中属于高频词汇,在正常词汇中出现的频率也不低,因此只根据 title 就使得识别结果会随着语料的不同而不同。虽然对于搜索引擎来说,title 的权重大于 deion,deion 的权重大于 keywords。

1,模块分类:

1)分类和回归算法:广义线性模型,支持向量机,kNN,朴素贝叶斯,决策树,特征选择
澳门皇冠金沙网站首页,2)聚类算法:K-means
3)维度约简:PCA
4)模型选择:交叉验证
5)数据预处理:标准化,去除均值率和方差缩放,正规化,二值化,编码分类特征,缺失值的插补

原标题:用机器学习怎样鉴别不可描述的网站

2.2.5 权重策略:TF-IDF方法

1,词向量空间模型:将文本中的词转换为数字,整个文本集转换为维度相等的词向量矩阵(简单理解,抽取出不重复的每个词,以词出现的次数表示文本)
2,归一化:指以概率的形式表示,例如:0,1/5,0,0,1/5,2/5,0,0,也称为:词频TF(仅针对该文档自身)
3,词条的文档频率IDF: 针对所有文档的词频

当然还可以使用决策树以及 SVM 等模型来做分类预测,但是实际的测试效果并没有朴素贝叶斯好,以 deion 作为输入为例,决策树的识别率为 85% 左右。

2.4.2 kNN算法的python实现
#coding=utf-8

#第一阶段,导入所需要的库,进行数据的初始化

import sys
import os
from numpy import *
import numpy as *
import operator
from Nbayes_lib import *

# 配置utf-8输出环境

reload(sys)
sys.setdefaultencoding('utf-8')

k=3

#第二阶段:实现夹角余弦的距离公式

def cosdist(vector1,vector2):
    return dot(vector1,vector2)/(linalg.norm(vector1)*linalg.norm(vector2)) # 夹角余弦公式;AB/|A||B|   

#第三阶段:KNN实现分类器

#KNN分类器

#测试集:testdata;训练集:trainSet;类别标签;listClasses; k:k个邻居数

def classify(testdata,trainSet,listClasses,k):
    dataSetSize=trainSet.shape[0]     #返回样本的行数,(shape返回行数和列数)
    distances=array(zeros(dataSetSize))  #构造一个全0数组,大小为;

    for indx in xrange(dataSetSize):   #计算测试集与训练集之间的距离:夹角余弦
        distances[indx]=cosdist(testdata,trainSet[indx])
        sortedDisIndicies=argsort(-distances)
        classCount={}
        for i in range(k):#获取角度最小的前k项作为参考项
            #按排序顺序返回样本集对应的类别标签
            voteIlabel=listClasses[sortedDistIndices[i]]
            #为字典classCount赋值,相同key,其value加1
            classCount[voteIlabel]=classCount.get(voteIlabel,0) +1

        #对分类字典classCount按value重新排序
        #sorted(data.iteritems(),key=operator.itemgetter[1],reverse=True)
        #classCount.iteritems();字典迭代器函数
        #key ;排序参数;operator.itemgetter(1):多级排序
        sortedClassCount=sorted(classCount.iteritem(),key=operator.itemgetter(1),reverse=True)
        return sortedClassCount[0][0]   #返回排序最高的一项

# 最后使用KNN算法实现文本分类

dataSet,listClasses=loadDataSet()
nb.NBayes()
nb.train_set(dataSet,listClasses)  #使用之前贝叶斯分类阶段的数据集及生成的TF向量进行分类

print classify(nb.tf[3],nb.tf,listClasses,k)

矩阵每一行的值,就是经过上述方法切词之后,词库中每一个词在该 title 上出现的频率,当然对于没有在该 title 出现的词(存在于其他 title 中)计为 0 即可。

2.2.2 中文分词介绍

1,中文分词:将一个汉字序列(句子)切分成一个单独的词(中文自然语言处理的核心问题)
2,中文分词的算法:基于概率图模型的条件随机场(CRF)
3,分词后文本的结构化表示:词向量空间模型,主题模型,依存句法的树表示,RDF的图表示
4,本项目的分词系统:采用jieba分词
5, jieba分词支持的分词模式:默认切分,全切分,搜索引擎切分
6,jieba分词的代码见文件:对未分词语料库进行分词并持久化对象到一个dat文件(创建分词后的语料文件:train_corpus_seg)

#coding=utf-8

import sys
import os
import jieba

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

#定义两个函数,用于读取和保存文件

def savefile(savpath,content):   # 定义一个用于保存文件的函数
    fp = open(savepath,"wb")
    fp.write(content)
    fp.close()

def readfile(path):    # 定义一个用于读取文件的函数
    fp = open(path,"rb")
    content = fp.read()
    fp.close()
    return content    #函数返回读取的内容


# 以下是整个语料库的分词主程序

corpus_path = "train_corpus_small/"   # 未分词分类语料库路径
seg_path = "train_corpus_seg/"  # 分词后分类语料库路径

catelist = os.listdir(corpus_path) #os.listdir获取cor_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(full.name).strip()   # 读取文件,strip()用于移除字符串头尾指定的字符,即移除头尾的空格
        content = content.replace("rn","").strip()  # 将空格和换行替代为无
        content_seg = jieba.cut(content)    # 利用jieba分词

        savefile(seg_dir+file_path," ".join(content_seg))   # 调用函数保存文件,保存路径为:seg_dir+file_path,用空格将分词后的词连接起来

print "中文语料分词结束"


#############################################################################

# 为了便于后续的向量空间模型的生成,分词后的文本还要转换为文本向量信息并对象化
# 引入Scikit-Learn的Bunch类

from sklearn.datasets.base import Bunch
bunch = Bunch{target_name=[],label=[],filename=[],contents=[]}

# Bunch类提供键值对的对象形式
#target_name:所有分类集名称列表
#label:每个文件的分类标签列表
#filename:文件路径
#contents:分词后的文件词向量形式

wordbag_path = "train_word_bad/train_set.dat"  #分词语料Bunch对象持久化文件路径
seg_path = "train_corpus_seg/"   #分词后分类语料库路径(同上)

catelist = os.listdir(seg_path)  # 获取分词后语料库的所有子目录(子目录名是类别名)
bunch.target_name.extend(catelist)   # 将所有类别信息保存到Bunch对象

for mydir in catelist:     # 遍历所有子目录
    class_path = seg_path+mydir+"/" # 构造子目录路径
    file_list = os.listdir(class_path)    # 获取子目录内的所有文件
    for file_path in file_list:     # 遍历目录内所有文件
        fullname = class_path+file_path    # 构造文件路径
        bunch.label.append(mydir)      # 保存当前文件的分类标签(mydir为子目录即类别名)
        bunch.filenames.append(fullname)  # 保存当前文件的文件路径(full_name为文件路径)
        bunch.contents.append(readfile(fullname).strip())  # 保存文件词向量(调用readfile函数读取文件内容)

file_obj = open(wordbad_path,"wb")  # 打开前面构造的持久化文件的路径,准备写入
pickle.dump(bunch,file_obj)   # pickle模块持久化信息,bunch是要持久化的文件,已添加了信息。file_obj是路径
file_obj.close()
# 之所以要持久化,类似游戏中途存档,分词后,划分一个阶段,将分词好的文件存档,后面再运行就不用重复分词了

print "构建文本对象结束!!"      

# 持久化后生成一个train_set.dat文件,保存着所有训练集文件的所有分类信息
# 保存着每个文件的文件名,文件所属分类和词向量

由上述分析可以知道 title、deion 和 keywords 等一些关键的网页信息对于不可描述网站来说都是经过精心设计的,和网页所要表述内容的匹配度非常之高。尤其很多网站在国外有些国家是合法的,因此对于经营这些网站的人员来说,优化这些信息一定是必然。我曾经看过一份数据显示在某段时间某搜索引擎前十名中,绝大多数的色情相关的。因此我们可以将其作为关键的语料信息。

2.2.7 分类结果评估

机器学习领域的算法评估的指标:
(1)召回率(查全率):检索出的相关文档数和文档库中所有的相关文档数的比率,是衡量检索系统的查全率
召回率=系统检索到的相关文件/系统所有相关的文档总数
(2)准确率(精度):检索出的相关文档数与检索出的文档总数的比率
准确率=系统检索到的相关文件/系统所有检索到的文件总数
(3)Fp-Measure
Fp=(p2+1)PR/(p2P+R),P是准确率,R是召回率
p=1时,就是F1-Measure
文本分类项目的分类评估结果评估:代码见文件

import numpy as np
from sklearn import metrics

def metrics_result(actual,predict):
    print '精度:{0:3f}'.format(metrics.precision_score(actual,predict))
    print '召回:{0:0.3f}'.format(metrics.recall_score(actual,predict))
    print 'f1-score:{0:3f}'.format(metrics.f1_score(actual,predict))

metrics_result(test_set.label,predicted)

#输出形式如
#精度:0.991
#召回:0.990
#f1-score:0.990

本文就是根据网页的文字信息来对网站进行分类。当然为了简化问题的复杂性,将以一个二分类问题为例,即如何鉴别一个网站是不可描述网站还是普通网站。你可能也注意 QQ 浏览器会提示用户访问的网站可能会包含色情信息,就可能用到类似的方法。本次的分享主要以英文网站的网站进行分析,主要是这类网站在国外的一些国家是合法的。其他语言的网站,方法类似。

本章知识点:中文分词,向量空间模型,TF-IDF方法,文本分类算法和评价指标
使用的算法:朴素的贝叶斯算法,KNN最近邻算法
python库:jieba分词,Scikit-Learning
本章目标:实现小型的文本分类系统
本章主要讲解文本分类的整体流程和相关算法

本文由澳门皇冠金沙网站发布于万物互联,转载请注明出处:(二)中文文本分类--机器学习算法原理与编程实

关键词: