基于分词的朴素贝叶斯分类器的构造和应用
目 录
1 绪 论 1
1.1研究背景与意义 1
1.2中文分词现状 1
1.3 论文主要内容 2
2相关技术分析 3
2.1常见的分词算法 3
2.1.1基于词库的分词算法 3
2.1.2基于理解的分词算法 4
2.1.3基于统计的分词算法 5
2.2中文分词的技术难点 6
2.2.1歧义处理 6
2.2.2新词识别 6
3分词词库 8
3.1词库组成 8
3.2 词库的构建 8
3.3 词库的更新 9
4 改进的贝叶斯定理分词算法 12
4.1 算法概述 12
4.2 歧义处理 13
4.3 算法步骤 14
5 算法实现 18
5.1 开发环境 18
5.2 实验数据 18
5.3 实验方法过程 18
5.4 实验结果展示 19
5.5结果分析 22
结 论 23
参考文献 24
附 录 25
附录 A 25
附录 B 28
致 谢 32
图目录
图2.1 正向最大匹配法步骤示意图 3
图2.2基于理解的中文分词系统框架图 4
图2.3基于统计的中文分词算法步骤示意图 5
图2.4歧义处理示意图 6
图2.5 新词内容示意图 6
图3.1 词库联系示意图 8
图3.2词库构建步骤示意图 9
图3.3词库更新步骤示意图 10
图4.1基于词库与贝叶斯原理的算法示意图 15
图4.2系统功能结构组织图 16
图4.3分词词库更新步骤示意图 16
图4.4算法执行步骤示意图 17
图5.1数据类别分布条形图 18
表目录
表5.1测试实例中时间、年龄等量词的切分效果 22
表5.2测试实例中人名、地名等词的切分效果 22
1.2中文分词现状
在20世纪50年代后期,它是中国分词的萌芽。可能在1960年左右,苏联专家研究了这个名字 “6-5-4-3-2-1” 的分词方法[1],该方法的匹配思想借助于后来出现的许多中文分词算法[2],成为其算法的理论基础。
在自然语言处理方面,西方因其天然的便利性和其他语言而发展得更好,并形成了许多成熟的技术[3]。但是,这些理论和方法往往不能直接对中国人起作用。汉语分词法应用广泛,是许多系统的重要组成部分,这通常是系统的瓶颈。正是由于汉语分词的广泛应用,也存在着较大的困难。
现今,自然语言的处理方面,中文分词是其中最为重要的研究,热点和难点[4]。其次,中文分词同样是应用系统中的十分重要的组成部分,因为后续工作是基于中文分词。因此,中文分词的处理也是系统的最重要的一点,那么当你需要优化系统时,通常首先考虑的是优化中文分词,并且因为汉语是属于语言自身的一部分结构,处理比其他语言更难。
1.3 论文主要内容
对于最常见的中文分词大致有三种类型的算法,各种算法也各有特点,各有优劣[5]。基于词典的机械分词算法,主要的优点就是操作简便,实现速度较快,运行速率很高。但是缺点就在于对一些新词的识别容易错乱,效果差;基于统计的分词算法,对新出现新创造的新词有很好的效果,但算法的空间要求较大,对常用词的识别有较多的局限性;现在,基于理解的分词算法,还是处于理论研究阶段,无法应用于实践。充分分析和研究现有的算法,学者们研究出了一种新的基于词法和贝叶斯定理的中文分词算法。使得分词的准确性大为提升:
(1)学习和研究现有的各种分词算法,进而得出基于词库和贝叶斯定理的新型中文分词算法。
(2)仔细介绍新算法的运行原理和具体实现步骤,侧重对同义词库更新和构建,再加上各种模糊问题的处理进行分析。
(3)提出新的算法,并且进行综合性的实际测试。通过各种测试条件下的相对应的测试结果来看,该算法是分割效果良好,十分科学合理的一种。
# 微博文字的性别识别
import jieba
import os
import pickle # 持久化
from numpy import *
from sklearn import feature_extraction
from sklearn.feature_extraction.text import TfidfTransformer # TF-IDF向量转换类
from sklearn.feature_extraction.text import TfidfVectorizer # TF_IDF向量生成类
from sklearn.datasets.base import Bunch
from sklearn.naive_bayes import MultinomialNB # 多项式贝叶斯算法
def readFile(path):
with open(path, 'r', errors='ignore') as file: # 文档中编码有些问题,所有用errors过滤错误
content = file.read()
return content
def saveFile(path, result):
with open(path, 'w', errors='ignore') as file:
file.write(result)
def segText(inputPath, resultPath):
fatherLists = os.listdir(inputPath) # 主目录
for eachDir in fatherLists: # 遍历主目录中各个文件夹
eachPath = inputPath + eachDir + "/" # 保存主目录中每个文件夹目录,便于遍历二级文件
each_resultPath = resultPath + eachDir + "/" # 分词结果文件存入的目录
if not os.path.exists(each_resultPath):
os.makedirs(each_resultPath)
childLists = os.listdir(eachPath) # 获取每个文件夹中的各个文件
for eachFile in childLists: # 遍历每个文件夹中的子文件
eachPathFile = eachPath + eachFile # 获得每个文件路径
# print(eachFile)
content = readFile(eachPathFile) # 调用上面函数读取内容
# content = str(content)
result = (str(content)).replace("\r\n", "").strip() # 删除多余空行与空格
# result = content.replace("\r\n","").strip()
cutResult = jieba.cut(result) # 默认方式分词,分词结果用空格隔开
saveFile(each_resultPath + eachFile, " ".join(cutResult)) # 调用上面函数保存文件