目录

改进分词速度

一、更改存储特征值的数据结构

二、缩短对语料库的遍历时间(对语料库的预处理)

三、先将所有的特征值保存到数据库中

改进分词的准确度

实验项目和结果截图

实验项目

保存特征值时采用多层嵌套(多特征多嵌套-34.9秒)

保存特征值时不采用多层嵌套(仅特征四少嵌套-32.73秒)

缩短对语料库的遍历时间(语料库预处理-4.24秒)

将所有的特征值保存到数据库后(最快-0.04秒)

“人机耦合”提高分词准确度(0.04秒)


基于条件随机场模型的中文分词实现:基于条件随机场模型的中文分词实现(Python中文分词)_条件随机场实现中文分词_admiz的博客-CSDN博客

改进分词速度

一、更改存储特征值的数据结构

在保存征值时,我们可以用字典、列表等数据结构来对结果保存。经过多次对不同数据结构的测试,发现在字典内嵌套的层数越多,遍历的速度越慢。针对特征四的所有结果中……

最慢的是形如: {'希': {'B': {'前': {' '长':0 }, '后': {'望': 0}}, 'M': {'前': {'阎': 0 }, '后': {'军': 0}}, 'E': {'前': {'里': 0}, '后': {'在': 0}}, 'S': {'前': {'几': 0}, '后': {'一': 0}}}的三四层嵌套字典。(该字典dict的用法:寻找“希”字在“B” 状态时前面为“长”的概率是多少时输入dict[‘希’][‘B’][‘前’][‘长’]即可找到相应的数据。)

最快的是形如: {'希': {'腊': [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], '希': [0.3, 0.6, 0.6, 0.3, 0.0, 0.0, 0.0, 0.0]}, '腊': {'希': [0.0, 0.0, 0.034, 0.034, 0.965, 0.965, 0.0, 0.0]}} 该字典dict的用法:寻找“希”字在“B”状态时前面为“腊”的概率是多少时输入dict[‘希’][‘腊’][0],寻找“希”字在“B”状态时后面为“腊”的概率是多少时输入dict[‘希’] [‘腊’] [1],寻找“希”字在“M”状态时前面为“腊”的概率是多少时输入dict[‘希’] [‘腊’] [2],以此类推……)

同时我们也发现字典内的字越少,遍历越快,所以在遍历时可以加个判断来筛选出有用的数据,不添加没用的数据到列表中。

综上所述,当采用嵌套层数越少的数据结构,并只把有用的数据保存到数据结构中,分词速度能有一定的提升。

二、缩短对语料库的遍历时间(对语料库的预处理)

在针对某字寻找特征二时,需要遍历一遍语料库来寻找该字的所有状态来求得需要的概率,特征三、特征四同理。而语料库有四百多万个字,当要寻找多个字的所有特征值时,约等于需要遍历三遍[(分词列表的长度数)x(四百多万)]个字,若分词列表内有十个字则需要遍历三次四千万多字。

为缩短对语料库的遍历时间,可以对语料库进行精准的删减。通过对特征二、特征三、特征四的理解,我们得知特征二只针对分词列表内的字,特征三针对分词列表内的字以及其下一个字,特征四针对分词列表内的字以及它的上一个字和下一个字。

至此我们可以知道,如果一个语料库能解决计算特征四的问题,那么这个语料库也能解决计算出特征二、特征三的问题。

生成所需语料库的步骤:

(1)打开并读取语料库

wordFile=open("msr_training.utf8.ic",'r',encoding='utf-8')
wordFeedInit=wordFile.readlines() #[0]=字 [2]=标注
wordFile.close
wordFeedLen=len(wordFeedInit)

(2)获取分词内容(列表)

str1=input("请输入要分词的字符串:")

(3)保存分词列表内每个字及它的上下字的数据

wordFeed = [ ]  #用来储存所需语料库
for i in range(1,wordFeedLen-1):if wordFeedInit[i][0] in str1:key1=[wordFeedInit[i-1],wordFeedInit[i],wordFeedInit[i+1]]wordFeed.extend(key1)
wordFeedLen=len(wordFeed)

三、先将所有的特征值保存到数据库中

即使是精准地缩短了语料库的长度,但在整个程序的运行时间里,大部分时间基本都用在了遍历上。为了不遍历语料库,我们可以先将所有的特征值写入到数据库中,在程序运行时不再需要遍历语料库来求特征值,只需要通过数据库查询语句即可找到所需的值,这样一来,获取特征值的时间几乎可以忽略,十个字的分词只需50毫秒左右。

为方便后期调用数据库,这里采用Python自带的轻量级数据库—SQLite。

将语料库中的所有字的特征值写入到数据库的方法:

(1)找出所有字(约5100个字)

words=[]
for i in range(wordFeedLen):if wordFeed[i][0] not in words :words.append(wordFeed[i][0])

(2)寻找words列表内每个字的特征值

步骤同中文分词实现的特征学习 ,此处省略。

(3)将数据插入数据库中(以特征四为例)

con = sqlite3.connect('charaD.db') #创建或连接数据库
conn = con.cursor()
for i in range(0,len(words)):i=words[i]a=charDJudge(i)conn.execute('''CREATE TABLE ''' + i +\'''(WORD char(10) PRIMARY KEY   ,B0          REAL    ,B1          REAL    ,M0          REAL    ,M1          REAL    ,E0          REAL    ,E1          REAL    ,S0          REAL    ,S1          REAL    );''')cmdCharaDInit="INSERT INTO "+ i +\
"(WORD,B0,B1,M0,M1,E0,E1,S0,S1) VALUES ('字', 1,1,1,1 )"for key in a:wordCharaD="'"+key+"'"+','+str(a[key][0])+','+str(a[key][1])+','+str(a[key][2])+','+\
str(a[key][3])+','+str(a[key][4])+','+str(a[key][5])+','+str(a[key][6])+','+str(a[key][7])cmdCharaD=cmdCharaDInit.replace( "'字', 1,1,1,1" , wordCharaD)conn.execute(cmdCharaD)con.commit()
con.close()

(4)查询数据的操作(以查询特征四中间的字为例):

conD = sqlite3.connect('charaD.db')
def  charaD(testWord):cursorD = conD.cursor()cmdDInit="SELECT * FROM wordTab WHERE WORD=='字';"testDict = { }testDict=setDict3(testWord)for i in range(0,len(testWord)):cmdD=cmdDInit.replace('wordTab',testWord[i])
#查询第二个字到倒数第二个字elif i>0 and i<len(testWord)-1:cmdD=cmdD.replace('字',testWord[i+1])cursorD =conD.execute(cmdD)for it in cursorD:testDict[testWord[i]]['B'][testWord[i+1]]=[it[1],it[2]]testDict[testWord[i]]['M'][testWord[i+1]]=[it[3],it[4]]testDict[testWord[i]]['E'][testWord[i+1]]=[it[5],it[6]]testDict[testWord[i]]['S'][testWord[i+1]]=[it[7],it[8]]cmdD=cmdD.replace('字',testWord[i-1])cursorD =conD.execute(cmdD)for it in cursorD:    testDict[testWord[i]]['B'][testWord[i-1]]=[it[1],it[2]]testDict[testWord[i]]['M'][testWord[i-1]]=[it[3],it[4]]testDict[testWord[i]]['E'][testWord[i-1]]=[it[5],it[6]]testDict[testWord[i]]['S'][testWord[i-1]]=[it[7],it[8]]

改进分词的准确度

在提高了分词速度后,我们发现一些专有名词会被错误分开,如:“大数据”会被分为“大数”、 “据”,“搜索引擎”会被分为“搜索”、“ 引擎”,“人工智能”会被分为“人”、“工”、“智能”……

究其原因是因为语料库中不存在这些新词或专有名词等词,以及条件随机场分词是基于概率,存在着一定的误差。

为解决这个问题,我们可以从“先验知识”和“人机耦合”的角度出发,在分词前先人工输入哪些词是固定词语,再让程序在最后分词的时候留意这些固定词语,不去拆开这些固定词语,以此来提高准确度。

此方法和目前输入法的“个性化词库”有点类似。

不拆分固定词语的方法:

(1)人工输入固定词语

fixation=input("若有专有名词请输入该词,无则按回车:")if len(fixation)>1 :import refixaStr=testStringfixalist=[]for i in str1:fixalist.append(i)fixaWord=fixation

(2)通过正则表达式寻找固定词语在分词列表的位置

str=u'str1' .replace("str1",fixaStr)
word = u'固定'.replace('固定',fixaWord)
a = [m.start() for m in re.finditer(word, str)]

(3)将固定词语标记为“S”

a.reverse()
for i in a:end=i+len(fixaWord)del signList[i+1:end]signList[i][0]=fixaWordsignList[i][1]='S'

实验项目和结果截图

实验项目

完整的项目已上传到:蓝奏云链接已下线

或者:https://download.csdn.net/download/admiz/13132304

普通版内容:

数据库版内容,该程序已支持“人机耦合”:

保存特征值时采用多层嵌套(多特征多嵌套-34.9秒)

用户输入要分词的句子

针对分词句子的特征二

针对分词句子的特征三

针对分词句子的特征四(部分):多层嵌套

针对分词句子的关系矩阵

分词结果

保存特征值时不采用多层嵌套(仅特征四少嵌套-32.73秒)

针对分词句子的特征四(部分)

分词结果

缩短对语料库的遍历时间(语料库预处理-4.24秒)

分词结果

将所有的特征值保存到数据库后(最快-0.04秒)

数据库内容如图,由于采用了SQLite来创建数据库,5130个表,近五十万条数据,只有62M。相同的数据存储至SqlServer、mysql中则需要500M左右,SQLite的优势不言而喻。

使用SQLiteSpy打开数据库,数据库内容(局部):

项目内的“基于条件随机场的中文分词的实现(数据库+人机耦合版).py”,注释掉下图红框内容后运行即可。

分词结果

“人机耦合”提高分词准确度(0.04秒)

人工输入固定词语

分词结果

基于条件随机场模型的中文分词改进(Python中文分词)相关推荐

  1. 马尔可夫模型与条件随机场模型

    https://blog.csdn.net/s151506879/article/details/51912595 条件随机场模型是由Lafferty在2001年提出的一种典型的判别式模型.它在观测序 ...

  2. python 中文分词_python中文分词,使用结巴分词对python进行分词(实例讲解)

    在采集 中文分词是中文文本处理的一个基础性工作,结巴分词利用进行中文分词. 其基本实现原理有三点: 1.基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG) ...

  3. python语言中文怎么读-python中文读什么

    python中文叫什么 python中文叫什么? python中文叫蟒蛇,通常情况下,Python是一种计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随 ...

  4. 基于条件随机场的命名实体识别

    我们知道HMM将分词作为字标注问题来解决,其中有两条独立性假设:一个是输出观察值之间严格独立,二是状态的转移过程中当前状态只与前一个状态有关(一阶马尔可夫型).通过这两种假设,使得HMM的计算成为可能 ...

  5. 使用条件随机场模型解决文本分类问题(附Python代码)

    对深度学习感兴趣,热爱Tensorflow的小伙伴,欢迎关注我们的网站!http://www.tensorflownews.com.我们的公众号:磐创AI. 一. 介绍 世界上每天都在生成数量惊人的文 ...

  6. 命名实体识别(二)——基于条件随机场的命名实体识别

    一.条件随机场 首先,我们看一下条件随机场的定义:在给定一组输入序列的条件下,另一组输出序列的条件概率分布模型.设X=和Y=是联合随机变量,若随机变量Y构成一个无向图G=(V,E)表示的马尔科夫模型, ...

  7. python中文叫什么-python中文叫什么

    利用Python机器学习框架scikit-learn,我们自己做一个分类模型,对中文评论信息做情感分析.其中还会介绍中文停用词的处理方法. 疑惑 前些日子,我在微信后台收到了一则读者的留言. 我一下子 ...

  8. python中文叫什么-python中文别名

    广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! sdk 3.0 实现了统一化,各个语言版本的 sdk具备使用方法相同.接口调用方式 ...

  9. 基于条件随机场(CRF)对中文案件语料进行命名实体识别(NER)

    环境要求 numpy==1.15.4 python-crfsuite==0.9.6 scikit-learn==0.20.1 scipy==1.1.0 six==1.11.0 sklearn==0.0 ...

最新文章

  1. 《Kotlin项目实战开发》第1章 Kotlin是什么
  2. 作为程序员,你是否曾经想过写一本书?
  3. mongodb部署以及数据操作
  4. 使用Opencv的一些注意事项
  5. 小甲鱼python的课后题好难_小甲鱼《零基础学习Python》课后笔记(二十六):字典——当索引不好用时2...
  6. MapReduce-流量统计求和-步骤分析
  7. 计算机数据库技术的应用现状,数据库技术发展现状及趋势.doc
  8. springmvc02
  9. Updating Homebrew... ...长时间卡住的问题
  10. 吴恩达深度学习之一《神经网络和深度学习》学习笔记
  11. Zookeeper-02-概念
  12. 4.安全与NAT策略-1
  13. IntelliJ IDEA Maven配置 MAC系统
  14. 越南也自研5G设备,有这么容易?
  15. 要关闭python解释器用什么快捷键_Python 解释器
  16. 1174 哥德巴赫猜想(每日学习)
  17. bzoj1921 [CTSC2010]珠宝商 SAM+后缀树+点分治
  18. 半入耳式蓝牙耳机哪款音质好?音质最好的半入耳蓝牙耳机推荐
  19. 程序员的发展之道---海贼王(山治)
  20. ElementUI 图标字体无法正常显示 本地CDN文件

热门文章

  1. Nacos中namespace,groupId,dataId使用
  2. Unable to create application com.android.tools.fd.runtime.BootstrapApplication: java.lang.IllegalSta
  3. Vue源码学习之initInjections和initProvide
  4. 有容乃大的QVariant之使用
  5. 玉林师范学院计算机宿舍专业,玉林师范学院宿舍条件,宿舍环境图片(10篇)
  6. OSChina 周三乱弹 —— 泰迪转发了你的这条动弹
  7. 用if-else语句编写利息计算器(第九周上机任务)
  8. 史上最好玩的全家福!华为手机新玩法刷爆90后餐桌
  9. PC电脑桌面端UI设计规范
  10. Error resolving version for plugin ‘org.apache.maven.plugins:maven-source-plugin‘ from the resources