设为首页 收藏本站
查看: 1628|回复: 6

[经验分享] 用Python写一个简单的中文分词器

[复制链接]

尚未签到

发表于 2013-3-21 09:37:47 | 显示全部楼层 |阅读模式
用Python写一个简单的中文分词器
作为一个Python初学者+自然语言处理初学者,我用Python写了一个简单的中文分词器,整个程序 加上注释100行左右,算是一个小练习。
Table of Contents
  • 1 数据来源
  • 2 算法描述
  • 3 源代码及注释
  • 4 测试及评分结果


1 数据来源 [1]数据来自 Bakeoff2005 官方网站:http://sighan.cs.uchicago.edu/bakeoff2005/ 下载其中的 icwb2-data.tar.bz2 解压后取出以下文件:
  • 训练数据:icwb2-data/training/pku_ training.utf8
  • 测试数据:icwb2-data/testing/pku_ test.utf8
  • 正确分词结果:icwb2-data/gold/pku_ test_ gold.utf8
  • 评分工具:icwb2-data/script/socre


2 算法描述算法是最简单的正向最大匹配(FMM):
  • 用训练数据生成一个字典
  • 对测试数据从左到右扫描,遇到一个最长的词,就切分下来,直到句子结束
注:这是最初的算法,这样做代码可以控制在60行内,后来看测试结果发现没有很好地处理数字问题, 才又增加了对数字的处理。


3 源代码及注释#! /usr/bin/env python# -*- coding: utf-8 -*-# Author: minix# Date:   2013-03-20# Email:  minix007@foxmail.comimport codecsimport sys# 由规则处理的一些特殊符号numMath = [u'0', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9']numMath_suffix = [u'.', u'%', u'亿', u'万', u'千', u'百', u'十', u'个']numCn = [u'一', u'二', u'三', u'四', u'五', u'六', u'七', u'八', u'九', u'〇', u'零']numCn_suffix_date = [u'年', u'月', u'日']numCn_suffix_unit = [u'亿', u'万', u'千', u'百', u'十', u'个']special_char = [u'(', u')']def proc_num_math(line, start):    """ 处理句子中出现的数学符号 """    oldstart = start    while line[start] in numMath or line[start] in numMath_suffix:        start = start + 1    if line[start] in numCn_suffix_date:        start = start + 1    return start - oldstartdef proc_num_cn(line, start):    """ 处理句子中出现的中文数字 """    oldstart = start    while line[start] in numCn or line[start] in numCn_suffix_unit:        start = start + 1    if line[start] in numCn_suffix_date:        start = start + 1    return start - oldstartdef rules(line, start):    """ 处理特殊规则 """    if line[start] in numMath:        return proc_num_math(line, start)    elif line[start] in numCn:        return proc_num_cn(line, start)def genDict(path):    """ 获取词典 """    f = codecs.open(path,'r','utf-8')    contents = f.read()    contents = contents.replace(u'\r', u'')    contents = contents.replace(u'\n', u'')    # 将文件内容按空格分开    mydict = contents.split(u' ')    # 去除词典List中的重复    newdict = list(set(mydict))    newdict.remove(u'')    # 建立词典    # key为词首字,value为以此字开始的词构成的List    truedict = {}    for item in newdict:        if len(item)>0 and item[0] in truedict:            value = truedict[item[0]]            value.append(item)            truedict[item[0]] = value        else:            truedict[item[0]] = [item]    return truedictdef print_unicode_list(uni_list):    for item in uni_list:        print item,def divideWords(mydict, sentence):    """     根据词典对句子进行分词,    使用正向匹配的算法,从左到右扫描,遇到最长的词,    就将它切下来,直到句子被分割完闭    """    ruleChar = []    ruleChar.extend(numCn)    ruleChar.extend(numMath)    result = []    start = 0    senlen = len(sentence)    while start < senlen:        curword = sentence[start]        maxlen = 1        # 首先查看是否可以匹配特殊规则        if curword in numCn or curword in numMath:            maxlen = rules(sentence, start)        # 寻找以当前字开头的最长词        if curword in mydict:            words = mydict[curword]            for item in words:                itemlen = len(item)                if sentence[start:start+itemlen] == item and itemlen > maxlen:                    maxlen = itemlen        result.append(sentence[start:start+maxlen])        start = start + maxlen    return resultdef main():    args = sys.argv[1:]    if len(args) < 3:        print 'Usage: python dw.py dict_path test_path result_path'        exit(-1)    dict_path = args[0]    test_path = args[1]    result_path = args[2]    dicts = genDict(dict_path)    fr = codecs.open(test_path,'r','utf-8')    test = fr.read()    result = divideWords(dicts,test)    fr.close()    fw = codecs.open(result_path,'w','utf-8')    for item in result:        fw.write(item + ' ')    fw.close()if __name__ == "__main__":    main()

4 测试及评分结果
  • 使用 dw.py 训练数据 测试数据, 生成结果文件
  • 使用 score 根据训练数据,正确分词结果,和我们生成的结果进行评分
  • 使用 tail 查看结果文件最后几行的总体评分,另外socre.utf8中还提供了大量的比较结果, 可以用于发现自己的分词结果在哪儿做的不够好
注:整个测试过程都在Ubuntu下完成
$ python dw.py pku_training.utf8 pku_test.utf8 pku_result.utf8$ perl score pku_training.utf8 pku_test_gold.utf8 pku_result.utf8 > score.utf8$ tail -22 score.utf8 INSERTIONS:     0DELETIONS:      0SUBSTITUTIONS:  0NCHANGE:        0NTRUTH: 27NTEST:  27TRUE WORDS RECALL:      1.000TEST WORDS PRECISION:   1.000=== SUMMARY:=== TOTAL INSERTIONS:   4623=== TOTAL DELETIONS:    1740=== TOTAL SUBSTITUTIONS:        6650=== TOTAL NCHANGE:      13013=== TOTAL TRUE WORD COUNT:      104372=== TOTAL TEST WORD COUNT:      107255=== TOTAL TRUE WORDS RECALL:    0.920=== TOTAL TEST WORDS PRECISION: 0.895=== F MEASURE:  0.907=== OOV Rate:   0.940=== OOV Recall Rate:    0.917=== IV Recall Rate:     0.966
基于词典的FMM算法是非常基础的分词算法,效果没那么好,不过足够简单,也易于入手,随着学习的深入,我可能还会用Python实现其它的分词算法。另外一个感受是,看书的时候尽量多去实现,这样会让你有足够的热情去关注理论的每一个细节,不会感到那么枯燥无力。




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-4202-1-1.html 上篇帖子: Python的一些环境配置 下篇帖子: 运维自动化之基于python语言的文字界面的运维管理软件
0

尚未签到

发表于 2013-3-21 10:25:57 | 显示全部楼层
勿以坑小而不灌,勿以坑大而灌之。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-5-17 16:05:28 | 显示全部楼层
.其实我是一个天才,可惜天妒英才!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-5-21 03:23:28 | 显示全部楼层
避孕的效果:不成功,便成“人”。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-5-25 11:24:35 | 显示全部楼层
我是来刷分的,嘿嘿

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

累计签到:1365 天
连续签到:1 天
发表于 2013-5-31 20:42:29 | 显示全部楼层
人生自古谁无死,啊个拉屎不用纸!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-6-5 19:17:23 | 显示全部楼层
男人靠的住,母猪能上树!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表