黑马程序员技术交流社区

标题: 【上海校区】使用最大逆向法,利用python进行简易中文分词 [打印本页]

作者: 不二晨    时间: 2019-1-8 14:12
标题: 【上海校区】使用最大逆向法,利用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
---------------------
转载,仅作分享,侵删
作者:hea_gui_lion
原文:https://blog.csdn.net/hea_gui_lion/article/details/76636017



作者: 不二晨    时间: 2019-1-10 10:22
奈斯,加油




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2