热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

最大正向匹配分词MM

RT,NLP第一次实验,96人民日报语料分词+unigram和bigram词频统计。一开始写了个RMM,用了各种序列排序,然后分词的算法用了简单的前缀暴力匹配,果然跑语料的时间根本无法估计、、

RT,NLP第一次实验,96人民日报语料分词+unigram和bigram词频统计。

一开始写了个RMM,用了各种序列排序,然后分词的算法用了简单的前缀暴力匹配,果然跑语料的时间根本无法估计、、

果断重写、、又找了一个blog,发现MM算法 一开始是想得太复杂了,导致循环太多,后来修改成简单版本的即可正常时间运行、

python代码:

# -*- coding: cp936 -*-
import sys
import os
#词库矩阵,相同长度词的被放同一个列表中
def matrix(max_length):
#max_length = 11
mat = [[]for i in range(max_length)]
return mat
#建立词库以便做正向最大匹配
def BuildWordBank():
filename = r'lexicon.txt'
fp = open(filename,"r")
print "Reading File '%s'..." % filename
lst = []
for line in fp:
#print line.split()[0]
lst.append(line.split()[0]) #取每行的第一个单词
lst=list(set(lst)) #去重,顺序打乱了
fp.close()
mat = matrix(11)
for w in lst: #根据长度分类
mat[len(w)/2].append(w)
"""
max_length=0 #词表中最大词的长度是20*1/2=10个单字
for w in lst:
if len(w)>max_length:max_length=len(w)
print max_length
"""
return mat
#写一元文法文件,freq是单词和频数对应的词典
def writeUnigram(freq):
f = open('test.txt',"w")
print "writing unigram to file.."
for key in freq:
f.write("%s\t%d\n"%(key,freq[key]))
f.close()
print "writing unigram SUCCESS!"
#写二元文法文件
def writeBigram(freq):
f = open('bigram.txt',"w")
print "writing bigram to file.."
for key in freq:
f.write("%s\t%d\n"%(key,freq[key]))
f.close()
print "writing bigram SUCCESS!"

#给定词典d做MM分词,例如d[3]是全部长度为3的单词的列表
def MM(d):
dirx = u"corpus96/"
file_list=os.listdir(dirx)
#print len(file_list)
#return
freq = {} #记录词和频数的一一对应
for filename in file_list:
#filename = "960101.TXT"
fp = open(dirx+filename,"r")
print "processing %s ,please wait.." % filename
iters = 1 #记录迭代行数
for line in fp.readlines():
if iters%100==0:print "lines:%d"%iters #输出直观
#if iters>=20:break
iters += 1
lst = list(line) #原始句子序列
if lst==[]:continue #语料有空行则跳过
#print len(lst)
#print lst
#句子预处理
i=0
seq = [] #其中每个元素是一个单字
while i if lst[i]=='\n':break
if lst[i] in(' ','|'): #遇到半字字符继续向后扫描
i+=1
else:
#sys.stdout.write(lst[i]+lst[i+1])
seq.append(lst[i]+lst[i+1])
i+=2
#print seq
#开始MM
Maxlen = 10 #设置最大词长
i=0 #初始化
j=i+Maxlen
eachline = [] #存储每行分词后的结果,以便统计unigram和bigram
while i if j>len(seq):j=len(seq) #控制右指针不能超过句子边界
if j-i==1: #单字时
#sys.stdout.write("".join(seq[i:j])+"\\")
eachline.append("".join(seq[i:j]))
i=j
j=i+Maxlen
if "".join(seq[i:j]) in d[len(seq[i:j])]: #若串在词典中
#sys.stdout.write("".join(seq[i:j])+"\\")
eachline.append("".join(seq[i:j]))
i=j
j=i+Maxlen
else:
j-=1
#sys.stdout.write("\n")
"""
for w in eachline: #记录一元频数
if w in freq:freq[w]+=1
else:freq[w]=1
#print eachline
for w in eachline:print w
"""
for i in range(len(eachline)): #记录二元频数
w = "".join(eachline[i:i+2])
if w in freq:freq[w]+=1
else:freq[w]=1
fp.close()
print "process %s SUCCESS!" % filename
#return freq
#break #只测试一个文件时打开
return freq
#向文件写入频数,根据频数字典freq



#主函数
dictiOnary=BuildWordBank()
freq=MM(dictionary) #正向最大匹配,返回频数字典
#print freq
#writeUnigram(freq)
writeBigram(freq)



推荐阅读
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
author-avatar
龙争虎斗石榴agj
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有