分类目录归档:中文分词

初学者报道(3) CRF 中文分词解码过程理解

好久没有来写文章了,这段时间我研究了一下CRF,也找人请教过,下面写下自己的一些理解,在网络上也找过CRF的资料,大多为英文,对于解码的描述,就说用viterbe 实现,如何实现,却很少提及,以下为我的理解,如有错误欢迎指正,这样可以帮助我理解,先行谢过! 一,标记问题解决分词:就是将 词语开始和结束的字标记出来,就能对一个句子完成分词,假设使用两个标记B (开始),E(结束)对句子进行处理,如:“民主是普世价值”,民B主E是B普B世E价B值E, 这样标记明确,分词结果就明确了。 二,如何找到最好的标记结果:知道如何用标记的方式解决分词,那么怎么为一个句子找到一个最好的标记序列呢,CRF为这样的问题提供了一个解决方案,对于输入序列X1,X2…Xn(对于分词,就是那个句子),求这个输入序列条件下 某个 标记序列(Y1,Y2…Yn)的概率 极值。 三,解码过程: 这里用一个例子来说明,对于CRF的原理,我不做详述,我是半吊子,怕解释不好,只说一下我理解的解码过程。 CRF的公式:P(y|x,λ)=Σj λjFj(y,x)/Z(x)     //这里的j都是下标 先说问题: 使用4标记,B-开始,O-单独成词,M-词语中间的字,E-结束, 特征:一元特征,V-1 当前字的前一个字,V0当前字,V1当前字的后一个字 二元特征,各标记间的转移特征 句子如下: 民   主   是   普   世   价   值 B     B    B    B   B    B    B O    O … 继续阅读

发表在 中文分词, 条件随机场, 自然语言处理 | 3 条评论

初学者报道(2):实现 1-gram分词算法

写了个1-gram的分词算法实现: 借鉴了之前在这个blog上看到的n-gram算法中的split函数的写法,其他部分自己写的。   Dictionary.py: class Dictionary: ‘Dictionary Loading and Management’ def __init__(self,dicname): self.dictMap={} self.N = 0; dictfile = open(dicname,’r') for eachLine in dictfile: dictstr = eachLine.decode(“cp936″) strlist = dictstr.split(“t”,2) self.dictMap[strlist[0]] = strlist[1].split(“n”,1)[0] self.N+=int(self.dictMap[strlist[0]]) dictfile.close() print self.N def getCount(self,wordname): if(self.dictMap.has_key(wordname)): return … 继续阅读

发表在 中文分词 | 标签为 , | 5 条评论

初学者报到: 实现了一个最大匹配的分词算法

看了一段时间了的自然语言,不过还是很初级。 今天下载了一个分词的字典,自己用python写了一个分词的函数。 放上来,给大家踩,不吝赐教! 用的是最大匹配算法。 # -*- coding: cp936 -*- import string def loaddict(): filename=raw_input(‘Enter file name:’) f = open(filename,’r’) DICT={} for eachLine in f: dictStr = eachLine.decode(‘cp936′) strList=dictStr.split(“t”,2) DICT[strList[0]]=strList[1].split(“n”,1)[0] global DIC_MAXL if(DIC_MAXL<len(strList[0])): DIC_MAXL = len(strList[0]) f.close() print(“max length:”) print(DIC_MAXL) return … 继续阅读

发表在 中文分词 | 标签为 , , | 7 条评论

Matrix67:漫话中文分词算法

注:这是今天在Matrix67上看到的关于中文分词的文章,粗略的读了一遍,觉得Matrix67能把中文分词的一些关键问题如此“漫话”开来,不愧是北大中文系的牛人!以下文章转自于Matrix67的“漫话中文分词算法”,有兴趣的读者可以移步到他的blog观赏。 记得第一次了解中文分词算法是在 Google 黑板报 上看到的,当初看到那个算法时我彻底被震撼住了,想不到一个看似不可能完成的任务竟然有如此神奇巧妙的算法。最近在詹卫东老师的《中文信息处理导论》课上 再次学到中文分词算法,才知道这并不是中文分词算法研究的全部,前前后后还有很多故事可讲。在没有建立统计语言模型时,人们还在语言学的角度对自动分词进 行研究,期间诞生了很多有意思的理论。 中文分词的主要困难在于分词歧义。“结婚的和尚未结婚的”,应该分成“结婚/的/和/尚未/结婚/的”,还是“结婚/的/和尚/未/结婚/ 的”?人来判断很容易,要交给计算机来处理就麻烦了。问题的关键就是,“和尚未”里的“和尚”也是一个词,“尚未”也是一个词,从计算机的角度看上去,两 者似乎都有可能。对于计算机来说,这样的分词困境就叫做“交集型歧义”。 有时候,交集型歧义的“歧义链”有可能会更长。“中外科学名著”里,“中外”、“外科”、“科学”、“学名”、“名著”全是词,光从词库的 角度来看,随便切几刀下去,得出的切分都是合理的。类似的例子数不胜数,“提高产品质量”、“鞭炮声响彻夜空”、“努力学习语法规则”等句子都有这样的现 象。在这些极端例子下,分词算法谁优谁劣可谓是一试便知。

发表在 中文信息处理, 中文分词, 转载 | 标签为 , , , , | 5 条评论

基于哈希表和二叉树的词典研究(一)

词典是许多中文分词系统的一个重要的组成部分。其查询速度直接影响到分词系统的处理速度。本文使用汇编语言设计了一种高效的基于哈希表和二叉树的分词词典。 继续阅读

发表在 中文分词 | 标签为 , , , | 8 条评论

推荐张华平老师的中文分词工具ICTCLAS2010

  在国内的自然语言处理领域,估计没有人不知道大名鼎鼎的中文分词工具ICTCLAS了,所以用不着我来推荐。不过今天收到ICTCLAS的作者张华平老师的来信,希望我这里收录一下他最近刚发布的ICTCLAS2010共享版本,这个版本对于研究人员非商业免费使用一年,所以在这里做个推荐,非常感谢张老师对于中文信息处理领域的贡献!

发表在 中文信息处理, 中文分词 | 标签为 , , , , , | 15 条评论

Beautiful Data-统计语言模型的应用三:分词8

  对于一个包含n个字符的单词来说,利用语言模型进行分词的前提是首先枚举出所有的候选切分,而segment函数中:   candidates = ( [first] + segment( rem ) for first, rem in splits( text ) ) 的作用正是如此,它包含了递归调用,因此能枚举出所有的候选切分。那么,这个函数的时间复杂度是多少呢?一个包含n个字符的字符串有2^(n-1)种不同的分词方案(在字符之间有n-1个位置,每一个位置既可以作为单词边界也可以不作为边界),因此segment函数的时间复杂度为O(2^n),难怪之前的测试当字符串比较长时就跑不出结果了!

发表在 中文分词, 语言模型 | 标签为 , , , , , , , , , | 2 条评论

Beautiful Data-统计语言模型的应用三:分词7

  走到这一步,我们利用Google的一元语言模型进行分词的程序基本上已经完成了,先看一下已完成的segment.py程序吧:

发表在 中文分词, 语言模型 | 标签为 , , , , , , , | 2 条评论

Beautiful Data-统计语言模型的应用三:分词6

  说完了Python中的__call__函数,我们继续来完善segment.py,首先将Pw函数删除:

发表在 中文分词, 语言模型 | 标签为 , , , , , , , , , | 3 条评论

Beautiful Data-统计语言模型的应用三:分词5

  上一节我们已经解读了Pdist类中的__init__函数,这一节重点关注一下Python类中的__call__函数。首先简单的回顾一下上一节提到的一段话:缺省的情况,对于未知的单词,其概率均为1/N,但是对于每一个实例,Pdist均提供一个函数重载这个缺省值。为了避免过长 的单词拥有过高的概率,我们从概率10/N出发,对于候选单词的每一个字母都除以10。

发表在 中文分词, 语言模型 | 标签为 , , , , , , , , , | 留下评论