使用最大逆向法,利用python进行简易中文分词

首先进行分词所需要的基本设置就是“词库”,而网上开源的词库有很多,例如github里面的chinese词库和清华大学开源中文词库,这些都是免费下载开源的。而且下载及其简单,

所以你在网页可以直接下载,若是你已经学过爬虫,也可以进行爬下来。在这里我只下载类清华大学的food词库,这个程序也只能匹配水果食物等的专有名词

以下是程序

#!/usr/bin/env python
#-*- coding:utf-8 -*-
#---------------------------------
#FILENAME:fenci.py
#目的:使用最大逆向匹配, 完成简易分词操作
#环境:Ubuntu14 python2.7
#FILE:fenci.py
#TIME:20170803
#---------------------------------
import re
import time
#对一个字符串进行最大匹配处理,不包括特殊字符处理
def segment(str1,content):#str1 需要分词的字符串,content是匹配词库
	#str1=str1.decode('utf-8')
	str2=""
	maxlen=5 #只在最大词长范围处理
	while(len(str1)):
		length=int(len(str1))
		if length>maxlen:
			length=maxlen
		tmp_str=str1[len(str1)-length:len(str1)]
		while(length>1 and (re.search(tmp_str,content)==None)):#如果不是词,从右边剪掉一个汉字,剩下部分作为候选词"""
			length=length-1
			tmp_str=str1[len(str1)-length:len(str1)]
		tmp_str=tmp_str+'/'
		str2=tmp_str+str2
		str1=str1[0:len(str1)-length]
	return str2

#对一个字符串进行最大匹配处理,包括特殊字符处理
def segmentMM(str1,content):
	str2=""
	re_pat=re.compile(u'[\u4e00-\u9fa5]+')#只取中文字符
	tmp_list=re.findall(re_pat,str1.decode('utf-8'))# 开始匹配中文字符,取出以list的形式
	for i in tmp_list:#这是将取出的string list输出观看
		print i,
	else:
		print '\n'
	cont_dec=content.decode('utf-8')
	while(len(tmp_list)):
		str2=segment(tmp_list.pop(),cont_dec)+str2#tmp_list弹出最后一个元素(string),作为segment参数传入
                                                          #执行后消除最后一个元素,tmp-list长度-1
		str2='  '+str2
		
	return str2

#以下是main函数部分---------------------
if __name__=="__main__":
        path='/home/chin/pydic/food.txt'#这是我下载词库txt文件的目录,每个人有所不一样,因此不能照写
	try:
		fp=open(path,'r')
	except IOError as e:
		print"open error!"	
	else:
		start=time.time()
		content=fp.read()
		string=segmentMM("aa我9木瓜adf*超积电视机苹果然后,?重火龙果asf爱吃苹果asdaf香蕉西瓜哈密瓜",content)
		print string
		fp.close()
		stop=time.time()
		print"file is closed!\nTIME:%d sec"%(stop-start)
	

程序结果:

string=segmentMM("aa我9木瓜adf*超积电视机苹果然后,?重火龙果asf爱吃苹果asdaf香蕉西瓜哈密瓜",content)

我 木瓜 超积电视机苹果然后 重火龙果 爱吃苹果 香蕉西瓜哈密瓜

  我/  木瓜/  超/积/电/视/机/苹果/然/后/  重/火龙果/  爱/吃/苹果/  香蕉/西瓜/哈密瓜/
file is closed!
TIME:0 sec



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
' ' 窗口启动的时候,初始化类会把数据库载入内存,以增加运算速度,所以占用内存稍微大一点,如果不喜欢,可以修改类初始化部分{方初始化()} ' 子重置词典数据库() 这个功能用于自定义词库,吧文本词库转换为sqlite数据库词库 ' 词库文件保存在运行目录kic.txt ' 词库数据库为disk.db ' 词库数据保存在sqlite数据库中,没有找到更好的,更快的查找文本的方式,只能先用数据库了 在 子重置词典数据库(),和 方初始化() 这两个方法(函数)中有一定的信息框的错误提示,实际应用最好改成其他提示方式,而且提示错误后程序并不会终止,需要主程序自己判断 词库比较小,分词精度估计不高大,建议实际应用的时候才用更大,跟完整的词库,最好根据内容的相关性这样最好. 提供一个我自己用的词库,主要用于购物网站的分词的,在程序文件夹得kic1.txt里面 修改成kic.txt 然后重新生成数据库就行了 ' 此文件算法根据织梦中文分词php版本的简化版本修改而来,如果用于商业请自行考虑版权问题 '关键字自动获取php源码 这个文件夹里面的就是原来的php文件,应该是老版本的织梦cms里面提取出来的....这是一个简化版本的分词程序 .简化了一些算法,我也是根据这个php文件修改而来的.所以这个分词算法用于提权关键字是比较合适的 .用于更高的要求估计还不够合适 .sqlite采用的是kyozy的sqlite模块,因为他的模块可以吧数据库读入内存... .程序中还有许多可以提升速度的地方....比如说使用的数据库感觉应该有很好的方法...但是没有找到 .欢迎大家指正..做的更好 ' 作者: www.liuxingou.com 十年一剑
最大逆向匹配法是一种基于规则的分词方法,它以最大方式得到一个词典中最长的词作为匹配结果。本文将介绍如何使用Python实现中文最大逆向匹配分词算法。 1. 实现过程 1.1 读取字典 首先,我们需要准备一个字典文件以供分词使用。字典文件的每一行都是一个单词。在读取字典文件时,我们可以使用Python中的open函数和readlines函数。 dictionary = [] with open('dictionary.txt', encoding='UTF-8') as file: for line in file: dictionary.append(line.strip()) 1.2 最大逆向匹配 在最大逆向匹配算法中,我们需要先设定一个最大匹配长度max_len,以此来划定匹配范围。接下来,从右往左选择一个长度为max_len的子串,然后从字典中寻找与该子串匹配的最长词语。如果找到了匹配词,便将该词作为分割符号,并重新开始匹配。如果没有找到匹配词,则将匹配长度缩小一个字,重新匹配。 我们可以按照如下的方式实现最大逆向匹配算法: def reverse_max_match(sentence, dictionary, max_len): words = [] # 保存匹配结果 while sentence: # 只要有词未匹配完 for i in range(max_len, 0, -1): # 从最大长度开始找 if len(sentence) >= i: # 要保证有i个字符 if sentence[-i:] in dictionary: # 如果找到了词 words.append(sentence[-i:]) # 保存该词 sentence = sentence[:-i] # 截掉已匹配的词 break # 重新开始新的匹配 else: # 没有找到匹配的词 words.append(sentence[-1]) # 直接将该词作为分割符号 sentence = sentence[:-1] # 截掉已匹配的字符 return ' '.join(reversed(words)) # 因为是逆向匹配,所以要倒序排列 1.3 测试 最后,我们可以编写一个测试函数来测试分词算法的效果: def test(dictionary_file, sentence, max_len=5): dictionary = [] with open(dictionary_file, encoding='UTF-8') as file: for line in file: dictionary.append(line.strip()) result = reverse_max_match(sentence, dictionary, max_len) print('分词结果:', result) test('dictionary.txt', '我来到南京市长江大桥。') # 分词结果: 我 来到 南京市 长江大桥 。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值