作者归档:ricky

初学者报道(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 条评论