<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>我爱自然语言处理 &#187; 中文分词</title>
	<atom:link href="http://www.52nlp.cn/category/word-segmentation/feed" rel="self" type="application/rss+xml" />
	<link>http://www.52nlp.cn</link>
	<description>I Love Natural Language Processing</description>
	<lastBuildDate>Wed, 01 Feb 2012 01:50:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>初学者报道(3)  CRF 中文分词解码过程理解</title>
		<link>http://www.52nlp.cn/%e5%88%9d%e5%ad%a6%e8%80%85%e6%8a%a5%e9%81%933-crf-%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e8%a7%a3%e7%a0%81%e8%bf%87%e7%a8%8b%e7%90%86%e8%a7%a3</link>
		<comments>http://www.52nlp.cn/%e5%88%9d%e5%ad%a6%e8%80%85%e6%8a%a5%e9%81%933-crf-%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e8%a7%a3%e7%a0%81%e8%bf%87%e7%a8%8b%e7%90%86%e8%a7%a3#comments</comments>
		<pubDate>Fri, 30 Dec 2011 05:19:02 +0000</pubDate>
		<dc:creator>ricky</dc:creator>
				<category><![CDATA[中文分词]]></category>
		<category><![CDATA[条件随机场]]></category>
		<category><![CDATA[自然语言处理]]></category>

		<guid isPermaLink="false">http://www.52nlp.cn/?p=4171</guid>
		<description><![CDATA[好久没有来写文章了，这段时间我研究了一下CRF，也找人请教过，下面写下自己的一些理解，在网络上也找过CRF的资料，大多为英文，对于解码的描述，就说用viterbe 实现，如何实现，却很少提及，以下为我的理解，如有错误欢迎指正，这样可以帮助我理解，先行谢过！ 一，标记问题解决分词：就是将 词语开始和结束的字标记出来，就能对一个句子完成分词，假设使用两个标记B (开始)，E(结束)对句子进行处理，如：“民主是普世价值”，民B主E是B普B世E价B值E, 这样标记明确，分词结果就明确了。 二，如何找到最好的标记结果：知道如何用标记的方式解决分词，那么怎么为一个句子找到一个最好的标记序列呢，CRF为这样的问题提供了一个解决方案，对于输入序列X1,X2&#8230;Xn(对于分词，就是那个句子)，求这个输入序列条件下 某个 标记序列(Y1,Y2&#8230;Yn)的概率 极值。 三，解码过程： 这里用一个例子来说明，对于CRF的原理，我不做详述，我是半吊子，怕解释不好，只说一下我理解的解码过程。 CRF的公式：P(y&#124;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 &#8230; <a href="http://www.52nlp.cn/%e5%88%9d%e5%ad%a6%e8%80%85%e6%8a%a5%e9%81%933-crf-%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e8%a7%a3%e7%a0%81%e8%bf%87%e7%a8%8b%e7%90%86%e8%a7%a3">继续阅读 <span class="meta-nav">&#8594;</span></a>
相关文章:<ol>
<li><a href='http://www.52nlp.cn/%e5%88%9d%e5%ad%a6%e8%80%85%e6%8a%a5%e9%81%93%ef%bc%882%ef%bc%89%ef%bc%9a%e5%ae%9e%e7%8e%b0-1-gram%e5%88%86%e8%af%8d%e7%ae%97%e6%b3%95' rel='bookmark' title='初学者报道（2）：实现 1-gram分词算法'>初学者报道（2）：实现 1-gram分词算法</a></li>
<li><a href='http://www.52nlp.cn/stardict-main-function-brief-description' rel='bookmark' title='stardict2.4.8的main函数简要说明与注释'>stardict2.4.8的main函数简要说明与注释</a></li>
<li><a href='http://www.52nlp.cn/%e5%9f%ba%e4%ba%8e%e5%93%88%e5%b8%8c%e8%a1%a8%e5%92%8c%e4%ba%8c%e5%8f%89%e6%a0%91%e7%9a%84%e8%af%8d%e5%85%b8%e7%a0%94%e7%a9%b6%e4%b8%80' rel='bookmark' title='基于哈希表和二叉树的词典研究(一)'>基于哈希表和二叉树的词典研究(一)</a></li>
<li><a href='http://www.52nlp.cn/mit-nlp-first-lesson-introduction-and-overview-second-part' rel='bookmark' title='MIT自然语言处理第一讲：简介和概述（第二部分）'>MIT自然语言处理第一讲：简介和概述（第二部分）</a></li>
<li><a href='http://www.52nlp.cn/mit-nlp-second-lesson-word-counting-fourth-part' rel='bookmark' title='MIT自然语言处理第二讲：单词计数（第四部分）'>MIT自然语言处理第二讲：单词计数（第四部分）</a></li>
<li><a href='http://www.52nlp.cn/%e6%9d%a1%e4%bb%b6%e9%9a%8f%e6%9c%ba%e5%9c%ba%e6%96%87%e7%8c%ae%e9%98%85%e8%af%bb%e6%8c%87%e5%8d%97' rel='bookmark' title='条件随机场文献阅读指南'>条件随机场文献阅读指南</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><span style="font-size: small;color: #0000ff">好久没有来写文章了，这段时间我研究了一下CRF，也找人请教过，下面写下自己的一些理解，在网络上也找过CRF的资料，大多为英文，对于解码的描述，就说用viterbe 实现，如何实现，却很少提及，以下为我的理解，如有错误欢迎指正，这样可以帮助我理解，先行谢过！</span></p>
<p>一，标记问题解决分词：就是将 词语开始和结束的字标记出来，就能对一个句子完成分词，假设使用两个标记B (开始)，E(结束)对句子进行处理，如：“民主是普世价值”，民B主E是B普B世E价B值E, 这样标记明确，分词结果就明确了。</p>
<p>二，如何找到最好的标记结果：知道如何用标记的方式解决分词，那么怎么为一个句子找到一个最好的标记序列呢，CRF为这样的问题提供了一个解决方案，对于输入序列X1,X2&#8230;Xn(对于分词，就是那个句子)，求这个输入序列条件下 某个 标记序列(Y1,Y2&#8230;Yn)的概率 极值。</p>
<p>三，解码过程：</p>
<p>这里用一个例子来说明，对于CRF的原理，我不做详述，我是半吊子，怕解释不好，只说一下我理解的解码过程。</p>
<p>CRF的公式：P(y|x,λ)=Σj λjFj(y,x)/Z(x)     //这里的j都是下标</p>
<p>先说问题：</p>
<p>使用4标记，B-开始，O-单独成词，M-词语中间的字，E-结束，</p>
<p>特征：一元特征，V-1 当前字的前一个字，V0当前字，V1当前字的后一个字</p>
<p>二元特征，各标记间的转移特征</p>
<p>句子如下：</p>
<p>民   主   是   普   世   价   值</p>
<p>B     B    B    B   B    B    B</p>
<p>O    O   O    O   O    O     O</p>
<p>M   M   M   M   M   M   M</p>
<p>E     E    E    E    E    E     E</p>
<p>Viterbe解码就是在以上由标记组成的 数组中 搜索一条 最优的路径。</p>
<p>对于每一列的每一个标记，我们都要计算到达该标记的分数，这个分数由三部分组成，它本身的一元特征权重W，它前面一个字标记的 路径分数PreScore，前面一个字标记到当前标记转移特征权重TransW，</p>
<p>1. 计算第一列的分数(score),对于，‘民’来说，我们要算 B,O,M,E的Score，因为是第一列，所以PreSocre和TransW都是0，就不用计算，只需要计算自己的一元特征的权重：</p>
<p>对于标记，B，我们计算它的Score，记为S1B=W1B=w(null,民,B)+w(民,B)+w(民,B,主)  //这些特征的意思是： (null，民，B)，当前字为 ‘民’标记为B，前面一个字为空，(民,B):当前字为‘民’，标记为B，(民,B,主)：当前字为&#8217;民&#8217;，标记为B，当前字的后一个字为‘主’。特征的权重都是在训练时得到的。</p>
<p>对于标记，O，M，E，一样要计算W1O，W1M，W1E,从而得到分数S1O，S1M，S1E</p>
<p>2.对于第二列，首先要计算是每个标记的 一元权重W2B，W2O,W2M,W2E.</p>
<p>对于B，到达该标记的最大分数为：S2B=Max((v(BB)+S1B),(v(OB)+S1O),(v(MB)+S1M),(v(EB)+S1E))+W2B，其中v(BB)等为B到B的转移特征的权重。这个也是由训练得到的。同样对于第二列的O,M,E也要计算S2O，S2M，S2E</p>
<p>3.一直计算到最后一列，‘值’字的所有标记，得到S7B，S7O，S7M，S7E.比较这四个值中的最大值，即为最优路径的分数，然后以该值的标记点为始点 回溯得到最优路径（这里在计算过程中，要记录到达该标记的前一个标记，用于回溯）</p>
<p>终于写好！:)</p>
<p>&nbsp;</p>
<p>相关文章:<ol>
<li><a href='http://www.52nlp.cn/%e5%88%9d%e5%ad%a6%e8%80%85%e6%8a%a5%e9%81%93%ef%bc%882%ef%bc%89%ef%bc%9a%e5%ae%9e%e7%8e%b0-1-gram%e5%88%86%e8%af%8d%e7%ae%97%e6%b3%95' rel='bookmark' title='初学者报道（2）：实现 1-gram分词算法'>初学者报道（2）：实现 1-gram分词算法</a></li>
<li><a href='http://www.52nlp.cn/stardict-main-function-brief-description' rel='bookmark' title='stardict2.4.8的main函数简要说明与注释'>stardict2.4.8的main函数简要说明与注释</a></li>
<li><a href='http://www.52nlp.cn/%e5%9f%ba%e4%ba%8e%e5%93%88%e5%b8%8c%e8%a1%a8%e5%92%8c%e4%ba%8c%e5%8f%89%e6%a0%91%e7%9a%84%e8%af%8d%e5%85%b8%e7%a0%94%e7%a9%b6%e4%b8%80' rel='bookmark' title='基于哈希表和二叉树的词典研究(一)'>基于哈希表和二叉树的词典研究(一)</a></li>
<li><a href='http://www.52nlp.cn/mit-nlp-first-lesson-introduction-and-overview-second-part' rel='bookmark' title='MIT自然语言处理第一讲：简介和概述（第二部分）'>MIT自然语言处理第一讲：简介和概述（第二部分）</a></li>
<li><a href='http://www.52nlp.cn/mit-nlp-second-lesson-word-counting-fourth-part' rel='bookmark' title='MIT自然语言处理第二讲：单词计数（第四部分）'>MIT自然语言处理第二讲：单词计数（第四部分）</a></li>
<li><a href='http://www.52nlp.cn/%e6%9d%a1%e4%bb%b6%e9%9a%8f%e6%9c%ba%e5%9c%ba%e6%96%87%e7%8c%ae%e9%98%85%e8%af%bb%e6%8c%87%e5%8d%97' rel='bookmark' title='条件随机场文献阅读指南'>条件随机场文献阅读指南</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.52nlp.cn/%e5%88%9d%e5%ad%a6%e8%80%85%e6%8a%a5%e9%81%933-crf-%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e8%a7%a3%e7%a0%81%e8%bf%87%e7%a8%8b%e7%90%86%e8%a7%a3/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>初学者报道（2）：实现 1-gram分词算法</title>
		<link>http://www.52nlp.cn/%e5%88%9d%e5%ad%a6%e8%80%85%e6%8a%a5%e9%81%93%ef%bc%882%ef%bc%89%ef%bc%9a%e5%ae%9e%e7%8e%b0-1-gram%e5%88%86%e8%af%8d%e7%ae%97%e6%b3%95</link>
		<comments>http://www.52nlp.cn/%e5%88%9d%e5%ad%a6%e8%80%85%e6%8a%a5%e9%81%93%ef%bc%882%ef%bc%89%ef%bc%9a%e5%ae%9e%e7%8e%b0-1-gram%e5%88%86%e8%af%8d%e7%ae%97%e6%b3%95#comments</comments>
		<pubDate>Tue, 19 Jul 2011 05:21:26 +0000</pubDate>
		<dc:creator>ricky</dc:creator>
				<category><![CDATA[中文分词]]></category>
		<category><![CDATA[n-gram]]></category>

		<guid isPermaLink="false">http://www.52nlp.cn/?p=4063</guid>
		<description><![CDATA[写了个1-gram的分词算法实现： 借鉴了之前在这个blog上看到的n-gram算法中的split函数的写法，其他部分自己写的。 &#160; 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 &#8230; <a href="http://www.52nlp.cn/%e5%88%9d%e5%ad%a6%e8%80%85%e6%8a%a5%e9%81%93%ef%bc%882%ef%bc%89%ef%bc%9a%e5%ae%9e%e7%8e%b0-1-gram%e5%88%86%e8%af%8d%e7%ae%97%e6%b3%95">继续阅读 <span class="meta-nav">&#8594;</span></a>
相关文章:<ol>
<li><a href='http://www.52nlp.cn/%e5%88%9d%e5%ad%a6%e8%80%85%e6%8a%a5%e5%88%b0-%e5%ae%9e%e7%8e%b0%e4%ba%86%e4%b8%80%e4%b8%aa%e6%9c%80%e5%a4%a7%e5%8c%b9%e9%85%8d%e7%9a%84%e5%88%86%e8%af%8d%e7%ae%97%e6%b3%95' rel='bookmark' title='初学者报到: 实现了一个最大匹配的分词算法'>初学者报到: 实现了一个最大匹配的分词算法</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d3' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词3'>Beautiful Data-统计语言模型的应用三：分词3</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d8' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词8'>Beautiful Data-统计语言模型的应用三：分词8</a></li>
<li><a href='http://www.52nlp.cn/%e5%88%9d%e5%ad%a6%e8%80%85%e6%8a%a5%e9%81%933-crf-%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e8%a7%a3%e7%a0%81%e8%bf%87%e7%a8%8b%e7%90%86%e8%a7%a3' rel='bookmark' title='初学者报道(3)  CRF 中文分词解码过程理解'>初学者报道(3)  CRF 中文分词解码过程理解</a></li>
<li><a href='http://www.52nlp.cn/maximum-matching-method-of-chinese-word-segmentation' rel='bookmark' title='中文分词入门之最大匹配法'>中文分词入门之最大匹配法</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d7' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词7'>Beautiful Data-统计语言模型的应用三：分词7</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d6' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词6'>Beautiful Data-统计语言模型的应用三：分词6</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d5' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词5'>Beautiful Data-统计语言模型的应用三：分词5</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%80%e4%b8%aa%e4%b8%8d%e9%94%99%e7%9a%84%e8%87%aa%e7%84%b6%e8%af%ad%e8%a8%80%e5%a4%84%e7%90%86%e8%af%8d%e5%85%b8' rel='bookmark' title='一个不错的自然语言处理词典'>一个不错的自然语言处理词典</a></li>
<li><a href='http://www.52nlp.cn/%e5%9f%ba%e4%ba%8e%e5%93%88%e5%b8%8c%e8%a1%a8%e5%92%8c%e4%ba%8c%e5%8f%89%e6%a0%91%e7%9a%84%e8%af%8d%e5%85%b8%e7%a0%94%e7%a9%b6%e4%b8%80' rel='bookmark' title='基于哈希表和二叉树的词典研究(一)'>基于哈希表和二叉树的词典研究(一)</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>写了个1-gram的分词算法实现：</p>
<p>借鉴了之前在这个blog上看到的n-gram算法中的split函数的写法，其他部分自己写的。</p>
<p>&nbsp;</p>
<p>Dictionary.py:</p>
<pre>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 int(self.dictMap[wordname])
        else:
            return 0.5;#如果词典中没有，这个词的出现次数被定为 0.5
    def getPvalue(self,wordname):
        return float(self.getCount(wordname))/self.N
    def isAWord(self,word):
        return self.dictMap.has_key(word)

if __name__=='__main__':
    dict1=Dictionary("dict.txt")</pre>
<pre>class Ngram:
    def __init__(self,dictionary):
        self.mDict=dictionary
        self.wordList=()
        self.valueMap = {}
        self.segMap={}
    def splitsentence(self,sentence):
        wordlist = []
        for eachNum in range(len(sentence)):
            wordlist.append((sentence[:eachNum+1],sentence[eachNum+1:]))
        return wordlist
    def maxP(self, sentence):
        if(len(sentence)&lt;=1):
            return self.mDict.getPvalue(sentence)
        SenSplitList = self.splitsentence(sentence);
        maxPvalue = 0;
        wordPair = [];
        wordP = 0;
        for eachPair in SenSplitList:
            if(len(eachPair[0])&gt;0 and len(eachPair[1])&gt;0):
                p1=0;
                p2=0
                if(self.valueMap.has_key(eachPair[0])):
                    p1=self.valueMap[eachPair[0]]
                else:
                    p1=self.maxP(eachPair[0])
                if(self.valueMap.has_key(eachPair[1])):
                    p2=self.valueMap[eachPair[1]]
                else:
                    p2=self.maxP(eachPair[1])
                wordP=p1*p2
            if(maxPvalue&lt;wordP):
                maxPvalue = wordP
                wordPair = eachPair

        v=self.mDict.getPvalue(sentence)
        if((v)&gt;maxPvalue and self.mDict.isAWord(sentence)):
            self.valueMap[sentence]=v
            self.segMap[sentence]=sentence
            return v
        else:
            self.valueMap[sentence]=maxPvalue
            self.segMap[sentence]=wordPair
            return maxPvalue
    def getSeg(self):
        return self.segMap
if(__name__ =="__main__"):
    ngram1 = Ngram("dict1")
    print ngram1.splitsentence("ABC")</pre>
<pre>from Dictionary import Dictionary
from ngram import Ngram

def printSeg(segMap,sentence):
    if(segMap.has_key(sentence)):
        pair = segMap[sentence]
        if(isinstance(pair,tuple)):
            printSeg(segMap,pair[0])
            printSeg(segMap,pair[1])
        else:
            if(sentence==pair):
                print sentence
            else:
                printSeg(segMap,pair)
    else:
        print sentence

dict1 = Dictionary("dict.txt")
while(True):
    ngram1 =Ngram(dict1)
    sentence = raw_input("please input a Chinese Sentence:").decode("cp936");
    print ngram1.maxP(sentence)
    segmap=ngram1.getSeg()
    #for eachkey in segmap:

     #   if(isinstance(segmap[eachkey],tuple)):
      #      print (eachkey+":"+segmap[eachkey][0]+','+segmap[eachkey][1])
       # else:
        #    print (eachkey+":"+segmap[eachkey])
    printSeg(segmap,sentence)</pre>
<pre></pre>
<pre></pre>
<p>相关文章:<ol>
<li><a href='http://www.52nlp.cn/%e5%88%9d%e5%ad%a6%e8%80%85%e6%8a%a5%e5%88%b0-%e5%ae%9e%e7%8e%b0%e4%ba%86%e4%b8%80%e4%b8%aa%e6%9c%80%e5%a4%a7%e5%8c%b9%e9%85%8d%e7%9a%84%e5%88%86%e8%af%8d%e7%ae%97%e6%b3%95' rel='bookmark' title='初学者报到: 实现了一个最大匹配的分词算法'>初学者报到: 实现了一个最大匹配的分词算法</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d3' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词3'>Beautiful Data-统计语言模型的应用三：分词3</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d8' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词8'>Beautiful Data-统计语言模型的应用三：分词8</a></li>
<li><a href='http://www.52nlp.cn/%e5%88%9d%e5%ad%a6%e8%80%85%e6%8a%a5%e9%81%933-crf-%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e8%a7%a3%e7%a0%81%e8%bf%87%e7%a8%8b%e7%90%86%e8%a7%a3' rel='bookmark' title='初学者报道(3)  CRF 中文分词解码过程理解'>初学者报道(3)  CRF 中文分词解码过程理解</a></li>
<li><a href='http://www.52nlp.cn/maximum-matching-method-of-chinese-word-segmentation' rel='bookmark' title='中文分词入门之最大匹配法'>中文分词入门之最大匹配法</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d7' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词7'>Beautiful Data-统计语言模型的应用三：分词7</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d6' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词6'>Beautiful Data-统计语言模型的应用三：分词6</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d5' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词5'>Beautiful Data-统计语言模型的应用三：分词5</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%80%e4%b8%aa%e4%b8%8d%e9%94%99%e7%9a%84%e8%87%aa%e7%84%b6%e8%af%ad%e8%a8%80%e5%a4%84%e7%90%86%e8%af%8d%e5%85%b8' rel='bookmark' title='一个不错的自然语言处理词典'>一个不错的自然语言处理词典</a></li>
<li><a href='http://www.52nlp.cn/%e5%9f%ba%e4%ba%8e%e5%93%88%e5%b8%8c%e8%a1%a8%e5%92%8c%e4%ba%8c%e5%8f%89%e6%a0%91%e7%9a%84%e8%af%8d%e5%85%b8%e7%a0%94%e7%a9%b6%e4%b8%80' rel='bookmark' title='基于哈希表和二叉树的词典研究(一)'>基于哈希表和二叉树的词典研究(一)</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.52nlp.cn/%e5%88%9d%e5%ad%a6%e8%80%85%e6%8a%a5%e9%81%93%ef%bc%882%ef%bc%89%ef%bc%9a%e5%ae%9e%e7%8e%b0-1-gram%e5%88%86%e8%af%8d%e7%ae%97%e6%b3%95/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>初学者报到: 实现了一个最大匹配的分词算法</title>
		<link>http://www.52nlp.cn/%e5%88%9d%e5%ad%a6%e8%80%85%e6%8a%a5%e5%88%b0-%e5%ae%9e%e7%8e%b0%e4%ba%86%e4%b8%80%e4%b8%aa%e6%9c%80%e5%a4%a7%e5%8c%b9%e9%85%8d%e7%9a%84%e5%88%86%e8%af%8d%e7%ae%97%e6%b3%95</link>
		<comments>http://www.52nlp.cn/%e5%88%9d%e5%ad%a6%e8%80%85%e6%8a%a5%e5%88%b0-%e5%ae%9e%e7%8e%b0%e4%ba%86%e4%b8%80%e4%b8%aa%e6%9c%80%e5%a4%a7%e5%8c%b9%e9%85%8d%e7%9a%84%e5%88%86%e8%af%8d%e7%ae%97%e6%b3%95#comments</comments>
		<pubDate>Wed, 06 Jul 2011 13:21:32 +0000</pubDate>
		<dc:creator>ricky</dc:creator>
				<category><![CDATA[中文分词]]></category>
		<category><![CDATA[中文]]></category>
		<category><![CDATA[分词]]></category>
		<category><![CDATA[最大匹配]]></category>

		<guid isPermaLink="false">http://www.52nlp.cn/?p=4050</guid>
		<description><![CDATA[看了一段时间了的自然语言，不过还是很初级。 今天下载了一个分词的字典，自己用python写了一个分词的函数。 放上来，给大家踩，不吝赐教！ 用的是最大匹配算法。 # -*- coding: cp936 -*- import string def loaddict(): filename=raw_input(&#8216;Enter file name:&#8217;) f = open(filename,&#8217;r') DICT={} for eachLine in f: dictStr = eachLine.decode(&#8216;cp936&#8242;) strList=dictStr.split(“t”,2) DICT[strList[0]]=strList[1].split(“n”,1)[0] global DIC_MAXL if(DIC_MAXL&#60;len(strList[0])): DIC_MAXL = len(strList[0]) f.close() print(“max length:”) print(DIC_MAXL) return &#8230; <a href="http://www.52nlp.cn/%e5%88%9d%e5%ad%a6%e8%80%85%e6%8a%a5%e5%88%b0-%e5%ae%9e%e7%8e%b0%e4%ba%86%e4%b8%80%e4%b8%aa%e6%9c%80%e5%a4%a7%e5%8c%b9%e9%85%8d%e7%9a%84%e5%88%86%e8%af%8d%e7%ae%97%e6%b3%95">继续阅读 <span class="meta-nav">&#8594;</span></a>
相关文章:<ol>
<li><a href='http://www.52nlp.cn/%e5%88%9d%e5%ad%a6%e8%80%85%e6%8a%a5%e9%81%93%ef%bc%882%ef%bc%89%ef%bc%9a%e5%ae%9e%e7%8e%b0-1-gram%e5%88%86%e8%af%8d%e7%ae%97%e6%b3%95' rel='bookmark' title='初学者报道（2）：实现 1-gram分词算法'>初学者报道（2）：实现 1-gram分词算法</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e8%b5%84%e6%ba%90' rel='bookmark' title='中文分词入门之资源'>中文分词入门之资源</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d8' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词8'>Beautiful Data-统计语言模型的应用三：分词8</a></li>
<li><a href='http://www.52nlp.cn/maximum-matching-method-of-chinese-word-segmentation' rel='bookmark' title='中文分词入门之最大匹配法'>中文分词入门之最大匹配法</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d7' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词7'>Beautiful Data-统计语言模型的应用三：分词7</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d3' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词3'>Beautiful Data-统计语言模型的应用三：分词3</a></li>
<li><a href='http://www.52nlp.cn/compile-stardict-tools-and-use-stardict2txt' rel='bookmark' title='编译stardict-tools-3.0.1及使用stardict2txt'>编译stardict-tools-3.0.1及使用stardict2txt</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d6' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词6'>Beautiful Data-统计语言模型的应用三：分词6</a></li>
<li><a href='http://www.52nlp.cn/mit-nlp-second-lesson-word-counting-fourth-part' rel='bookmark' title='MIT自然语言处理第二讲：单词计数（第四部分）'>MIT自然语言处理第二讲：单词计数（第四部分）</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e5%ad%97%e6%a0%87%e6%b3%a8%e6%b3%952' rel='bookmark' title='中文分词入门之字标注法2'>中文分词入门之字标注法2</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>看了一段时间了的自然语言，不过还是很初级。</p>
<p>今天下载了一个分词的字典，自己用python写了一个分词的函数。</p>
<p>放上来，给大家踩，不吝赐教！</p>
<p>用的是最大匹配算法。</p>
<p># -*- coding: cp936 -*-</p>
<p>import string</p>
<p>def loaddict():<br />
filename=raw_input(&#8216;Enter file name:&#8217;)<br />
f = open(filename,&#8217;r')</p>
<p>DICT={}<br />
for eachLine in f:<br />
dictStr = eachLine.decode(&#8216;cp936&#8242;)<br />
strList=dictStr.split(“t”,2)<br />
DICT[strList[0]]=strList[1].split(“n”,1)[0]<br />
global DIC_MAXL<br />
if(DIC_MAXL&lt;len(strList[0])):<br />
DIC_MAXL = len(strList[0])<br />
f.close()<br />
print(“max length:”)<br />
print(DIC_MAXL)<br />
return DICT;</p>
<p>def segmentation(dic):<br />
sentence = unicode(raw_input(&#8216;请输入中文句子：&#8217;),&#8217;cp936&#8242;)<br />
print sentence<br />
length=len(sentence)<br />
print(&#8216;length:&#8217;)<br />
print length<br />
global DIC_MAXL<br />
if(length&lt;DIC_MAXL):<br />
wlen=length<br />
else:<br />
wlen=DIC_MAXL<br />
testS=sentence<br />
wordList=[]<br />
while(len(testS)&gt;0):<br />
word=testS[0:wlen]<br />
meet=False;<br />
while((not meet )and (len(word)&gt;0) ):<br />
if(dic.has_key(word)):<br />
wordList.append(word)<br />
testS=testS[len(word):len(testS)]<br />
meet=True;<br />
else:<br />
if(len(word)==1):<br />
wordList.append(word)<br />
testS=testS[len(word):len(testS)]<br />
meet=True;<br />
else:<br />
word=word[0:len(word)-1]<br />
return wordList</p>
<p>DIC_MAXL=0<br />
dictionary=loaddict()<br />
print DIC_MAXL<br />
while(True):<br />
wordl=segmentation(dictionary)<br />
for eachChar in wordl:<br />
print eachChar</p>
<p>真的很初级，大家轻踩！</p>
<p>也别不好意思踩，踩了我就能进步了！</p>
<p>多谢</p>
<p>相关文章:<ol>
<li><a href='http://www.52nlp.cn/%e5%88%9d%e5%ad%a6%e8%80%85%e6%8a%a5%e9%81%93%ef%bc%882%ef%bc%89%ef%bc%9a%e5%ae%9e%e7%8e%b0-1-gram%e5%88%86%e8%af%8d%e7%ae%97%e6%b3%95' rel='bookmark' title='初学者报道（2）：实现 1-gram分词算法'>初学者报道（2）：实现 1-gram分词算法</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e8%b5%84%e6%ba%90' rel='bookmark' title='中文分词入门之资源'>中文分词入门之资源</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d8' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词8'>Beautiful Data-统计语言模型的应用三：分词8</a></li>
<li><a href='http://www.52nlp.cn/maximum-matching-method-of-chinese-word-segmentation' rel='bookmark' title='中文分词入门之最大匹配法'>中文分词入门之最大匹配法</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d7' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词7'>Beautiful Data-统计语言模型的应用三：分词7</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d3' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词3'>Beautiful Data-统计语言模型的应用三：分词3</a></li>
<li><a href='http://www.52nlp.cn/compile-stardict-tools-and-use-stardict2txt' rel='bookmark' title='编译stardict-tools-3.0.1及使用stardict2txt'>编译stardict-tools-3.0.1及使用stardict2txt</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d6' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词6'>Beautiful Data-统计语言模型的应用三：分词6</a></li>
<li><a href='http://www.52nlp.cn/mit-nlp-second-lesson-word-counting-fourth-part' rel='bookmark' title='MIT自然语言处理第二讲：单词计数（第四部分）'>MIT自然语言处理第二讲：单词计数（第四部分）</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e5%ad%97%e6%a0%87%e6%b3%a8%e6%b3%952' rel='bookmark' title='中文分词入门之字标注法2'>中文分词入门之字标注法2</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.52nlp.cn/%e5%88%9d%e5%ad%a6%e8%80%85%e6%8a%a5%e5%88%b0-%e5%ae%9e%e7%8e%b0%e4%ba%86%e4%b8%80%e4%b8%aa%e6%9c%80%e5%a4%a7%e5%8c%b9%e9%85%8d%e7%9a%84%e5%88%86%e8%af%8d%e7%ae%97%e6%b3%95/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Matrix67：漫话中文分词算法</title>
		<link>http://www.52nlp.cn/matrix67-%e6%bc%ab%e8%af%9d%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e7%ae%97%e6%b3%95</link>
		<comments>http://www.52nlp.cn/matrix67-%e6%bc%ab%e8%af%9d%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e7%ae%97%e6%b3%95#comments</comments>
		<pubDate>Thu, 10 Mar 2011 13:49:14 +0000</pubDate>
		<dc:creator>52nlp</dc:creator>
				<category><![CDATA[中文信息处理]]></category>
		<category><![CDATA[中文分词]]></category>
		<category><![CDATA[转载]]></category>
		<category><![CDATA[Matrix67]]></category>
		<category><![CDATA[最大匹配法]]></category>
		<category><![CDATA[统计语言模型]]></category>

		<guid isPermaLink="false">http://www.52nlp.cn/?p=3818</guid>
		<description><![CDATA[注：这是今天在Matrix67上看到的关于中文分词的文章，粗略的读了一遍，觉得Matrix67能把中文分词的一些关键问题如此“漫话”开来，不愧是北大中文系的牛人！以下文章转自于Matrix67的“漫话中文分词算法”，有兴趣的读者可以移步到他的blog观赏。 记得第一次了解中文分词算法是在 Google 黑板报 上看到的，当初看到那个算法时我彻底被震撼住了，想不到一个看似不可能完成的任务竟然有如此神奇巧妙的算法。最近在詹卫东老师的《中文信息处理导论》课上 再次学到中文分词算法，才知道这并不是中文分词算法研究的全部，前前后后还有很多故事可讲。在没有建立统计语言模型时，人们还在语言学的角度对自动分词进 行研究，期间诞生了很多有意思的理论。 中文分词的主要困难在于分词歧义。“结婚的和尚未结婚的”，应该分成“结婚／的／和／尚未／结婚／的”，还是“结婚／的／和尚／未／结婚／ 的”？人来判断很容易，要交给计算机来处理就麻烦了。问题的关键就是，“和尚未”里的“和尚”也是一个词，“尚未”也是一个词，从计算机的角度看上去，两 者似乎都有可能。对于计算机来说，这样的分词困境就叫做“交集型歧义”。 有时候，交集型歧义的“歧义链”有可能会更长。“中外科学名著”里，“中外”、“外科”、“科学”、“学名”、“名著”全是词，光从词库的 角度来看，随便切几刀下去，得出的切分都是合理的。类似的例子数不胜数，“提高产品质量”、“鞭炮声响彻夜空”、“努力学习语法规则”等句子都有这样的现 象。在这些极端例子下，分词算法谁优谁劣可谓是一试便知。 最简单的，也是最容易想到的自动分词算法，便是“最大匹配法”了。也就是说，从句子左端开始，不断匹配最长的词（组不了词的单字则单独划开），直 到把句子划分完。算法的理由很简单：人在阅读时也是从左往右逐字读入的，最大匹配法是与人的习惯相符的。而在大多数情况下，这种算法也的确能侥幸成功。不 过，这种算法并不可靠，构造反例可以不费吹灰之力。例如，“北京大学生前来应聘”本应是“北京／大学生／前来／应聘”，却会被误分成“北京大学／生前／来 ／应聘”。 维护一个特殊规则表，可以修正一些很机械的问题，效果相当不错。例如，“不可能”要划分成“不／可能”，“会诊”后面接“断”、“疗”、“脉”、“治”时要把“会”单独切出，“的确切”后面是抽象名词时要把“的确切”分成“的／确切”，等等。 还有一个适用范围相当广的特殊规则，这个强大的规则能修正很多交集型歧义的划分错误。首先我们要维护一个一般不单独成词的字表，比如 “民”、“尘”、“伟”、“习”等等；这些字通常不会单独划出来，都要跟旁边的字一块儿组成一个词。在分词过程中时，一旦发现这些字被孤立出来，都重新考 虑它与前面的字组词的可能。例如，在用最大匹配法切分“为人民服务”时，算法会先划出“为人”一词，而后发现“民”字只能单独成词了。查表却发现，“民” 并不能单独划出，于是考虑进行修正——把“为人”的“人”字分配给“民”字。巧在这下“为”和“人民”正好都能成词，据此便可得出正确的划分“为／人民／ 服务”。 不过，上述算法归根结底，都是在像人一样从左到右地扫描文字。为了把问题变得更加形式化，充分利用计算机的优势，我们还有一种与人的阅读习惯完全 不同的算法思路：把句子作为一个整体来考虑，从全局的角度评价一个句子划分方案的好坏。设计自动分词算法的问题，也就变成了如何评估分词方案优劣的问题。 最初所用的办法就是，寻找词数最少的划分。注意，每次都匹配最长的词，得出的划分不见得是词数最少的，错误的贪心很可能会不慎错过一些更优的路。因而，在 有的情况下，最少词数法比最大匹配法效果更好。若用最大匹配法来划分，“独立自主和平等互利的原则”将被分成“独立自主／和平／等／互利／的／原则”，一 共有 6 个词；但词数更少的方案则是“独立自主／和／平等互利／的／原则”，一共只有 5 个词。 当然，最少词数法也会有踩大便的时候。“为人民办公益”的最大匹配划分和最少词数划分都是“为人／民办／公益”，而正确的划分则是“为／人 民／办／公益”。同时，很多句子也有不止一个词数最少的分词方案，最少词数法并不能从中选出一个最佳答案。不过，把之前提到的“不成词字表”装备到最少词 数法上，我们就有了一种简明而强大的算法： 对于一种分词方案，里面有多少词，就罚多少分；每出现一个不成词的单字，就加罚一分。最好的分词方案，也就是罚分最少的方案。 这种算法的效果出人意料的好。“他说的确实在理”是一个很困难的测试用例，“的确”和“实在”碰巧也成词，这给自动分词带来了很大的障碍。但是“确”、“实”、“理”通常都不单独成词的，因此很多切分方案都会被扣掉不少分： 他／说／的／确实／在理 （罚分：1+1+1+1+1 = &#8230; <a href="http://www.52nlp.cn/matrix67-%e6%bc%ab%e8%af%9d%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e7%ae%97%e6%b3%95">继续阅读 <span class="meta-nav">&#8594;</span></a>
相关文章:<ol>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e6%9c%80%e5%a4%a7%e5%8c%b9%e9%85%8d%e6%b3%95%e6%89%a9%e5%b1%952' rel='bookmark' title='中文分词入门之最大匹配法扩展2'>中文分词入门之最大匹配法扩展2</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e8%b5%84%e6%ba%90' rel='bookmark' title='中文分词入门之资源'>中文分词入门之资源</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e7%af%87%e5%a4%96' rel='bookmark' title='中文分词入门之篇外'>中文分词入门之篇外</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e6%9c%80%e5%a4%a7%e5%8c%b9%e9%85%8d%e6%b3%95%e6%89%a9%e5%b1%951' rel='bookmark' title='中文分词入门之最大匹配法扩展1'>中文分词入门之最大匹配法扩展1</a></li>
<li><a href='http://www.52nlp.cn/maximum-matching-method-of-chinese-word-segmentation' rel='bookmark' title='中文分词入门之最大匹配法'>中文分词入门之最大匹配法</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e5%ad%97%e6%a0%87%e6%b3%a8%e6%b3%952' rel='bookmark' title='中文分词入门之字标注法2'>中文分词入门之字标注法2</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e5%ad%97%e6%a0%87%e6%b3%a8%e6%b3%951' rel='bookmark' title='中文分词入门之字标注法1'>中文分词入门之字标注法1</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e6%96%87%e7%8c%ae' rel='bookmark' title='中文分词入门之文献'>中文分词入门之文献</a></li>
<li><a href='http://www.52nlp.cn/the-character-based-tagging-method-of-chinese-word-segmentation' rel='bookmark' title='基于字标注的中文分词方法'>基于字标注的中文分词方法</a></li>
<li><a href='http://www.52nlp.cn/%e6%8e%a8%e8%8d%90%e5%bc%a0%e5%8d%8e%e5%b9%b3%e8%80%81%e5%b8%88%e7%9a%84%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%b7%a5%e5%85%b7-ictclas2010' rel='bookmark' title='推荐张华平老师的中文分词工具ICTCLAS2010'>推荐张华平老师的中文分词工具ICTCLAS2010</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><strong>注：这是今天在<a href="http://www.matrix67.com/blog/">Matrix67</a>上看到的关于中文分词的文章，粗略的读了一遍，觉得Matrix67能把中文分词的一些关键问题如此“漫话”开来，不愧是北大中文系的牛人！以下文章转自于Matrix67的“<a href="http://www.matrix67.com/blog/archives/4212">漫话中文分词算法</a>”，有兴趣的读者可以移步到他的blog观赏。</strong></p>
<p>记得第一次了解中文分词算法是在 <a href="http://www.google.com.hk/ggblog/googlechinablog/2006/04/blog-post_7327.html">Google 黑板报</a> 上看到的，当初看到那个算法时我彻底被震撼住了，想不到一个看似不可能完成的任务竟然有如此神奇巧妙的算法。最近在詹卫东老师的《中文信息处理导论》课上 再次学到中文分词算法，才知道这并不是中文分词算法研究的全部，前前后后还有很多故事可讲。在没有建立统计语言模型时，人们还在语言学的角度对自动分词进 行研究，期间诞生了很多有意思的理论。</p>
<p>中文分词的主要困难在于分词歧义。“结婚的和尚未结婚的”，应该分成“结婚／的／和／尚未／结婚／的”，还是“结婚／的／和尚／未／结婚／ 的”？人来判断很容易，要交给计算机来处理就麻烦了。问题的关键就是，“和尚未”里的“和尚”也是一个词，“尚未”也是一个词，从计算机的角度看上去，两 者似乎都有可能。对于计算机来说，这样的分词困境就叫做“交集型歧义”。</p>
<p>有时候，交集型歧义的“歧义链”有可能会更长。“中外科学名著”里，“中外”、“外科”、“科学”、“学名”、“名著”全是词，光从词库的 角度来看，随便切几刀下去，得出的切分都是合理的。类似的例子数不胜数，“提高产品质量”、“鞭炮声响彻夜空”、“努力学习语法规则”等句子都有这样的现 象。在这些极端例子下，分词算法谁优谁劣可谓是一试便知。<br />
<span id="more-3818"></span><br />
最简单的，也是最容易想到的自动分词算法，便是“最大匹配法”了。也就是说，从句子左端开始，不断匹配最长的词（组不了词的单字则单独划开），直 到把句子划分完。算法的理由很简单：人在阅读时也是从左往右逐字读入的，最大匹配法是与人的习惯相符的。而在大多数情况下，这种算法也的确能侥幸成功。不 过，这种算法并不可靠，构造反例可以不费吹灰之力。例如，“北京大学生前来应聘”本应是“北京／大学生／前来／应聘”，却会被误分成“北京大学／生前／来 ／应聘”。</p>
<p>维护一个特殊规则表，可以修正一些很机械的问题，效果相当不错。例如，“不可能”要划分成“不／可能”，“会诊”后面接“断”、“疗”、“脉”、“治”时要把“会”单独切出，“的确切”后面是抽象名词时要把“的确切”分成“的／确切”，等等。</p>
<p>还有一个适用范围相当广的特殊规则，这个强大的规则能修正很多交集型歧义的划分错误。首先我们要维护一个一般不单独成词的字表，比如 “民”、“尘”、“伟”、“习”等等；这些字通常不会单独划出来，都要跟旁边的字一块儿组成一个词。在分词过程中时，一旦发现这些字被孤立出来，都重新考 虑它与前面的字组词的可能。例如，在用最大匹配法切分“为人民服务”时，算法会先划出“为人”一词，而后发现“民”字只能单独成词了。查表却发现，“民” 并不能单独划出，于是考虑进行修正——把“为人”的“人”字分配给“民”字。巧在这下“为”和“人民”正好都能成词，据此便可得出正确的划分“为／人民／ 服务”。</p>
<p>不过，上述算法归根结底，都是在像人一样从左到右地扫描文字。为了把问题变得更加形式化，充分利用计算机的优势，我们还有一种与人的阅读习惯完全 不同的算法思路：把句子作为一个整体来考虑，从全局的角度评价一个句子划分方案的好坏。设计自动分词算法的问题，也就变成了如何评估分词方案优劣的问题。 最初所用的办法就是，寻找词数最少的划分。注意，每次都匹配最长的词，得出的划分不见得是词数最少的，错误的贪心很可能会不慎错过一些更优的路。因而，在 有的情况下，最少词数法比最大匹配法效果更好。若用最大匹配法来划分，“独立自主和平等互利的原则”将被分成“独立自主／和平／等／互利／的／原则”，一 共有 6 个词；但词数更少的方案则是“独立自主／和／平等互利／的／原则”，一共只有 5 个词。</p>
<p>当然，最少词数法也会有踩大便的时候。“为人民办公益”的最大匹配划分和最少词数划分都是“为人／民办／公益”，而正确的划分则是“为／人 民／办／公益”。同时，很多句子也有不止一个词数最少的分词方案，最少词数法并不能从中选出一个最佳答案。不过，把之前提到的“不成词字表”装备到最少词 数法上，我们就有了一种简明而强大的算法：</p>
<p>对于一种分词方案，里面有多少词，就罚多少分；每出现一个不成词的单字，就加罚一分。最好的分词方案，也就是罚分最少的方案。</p>
<p>这种算法的效果出人意料的好。“他说的确实在理”是一个很困难的测试用例，“的确”和“实在”碰巧也成词，这给自动分词带来了很大的障碍。但是“确”、“实”、“理”通常都不单独成词的，因此很多切分方案都会被扣掉不少分：</p>
<p>他／说／的／确实／在理 （罚分：1+1+1+1+1 = 5 ）<br />
他／说／的确／实／在理 （罚分：1+1+1+2+1 = 6 ）<br />
他／说／的确／实在／理 （罚分：1+1+1+1+2 = 6 ）</p>
<p>正确答案胜出。</p>
<p>需要指出的是，这个算法并不需要枚举所有的划分可能。整个问题可以转化为图论中的最短路径问题，利用动态规划效率则会更高。</p>
<p>算法还有进一步加强的余地。大家或许已经想到了，“字不成词”有一个程度的问题。“民”是一个不成词的语素，它是绝对不会单独成词的。 “鸭”一般不单独成词，但在儿歌童谣和科技语体中除外。“见”则是一个可以单独成词的语素，只是平时我们不常说罢了。换句话说，每个字成词都有一定的概 率，每个词出现的频率也是不同的。</p>
<p>何不用每个词出现的概率，来衡量分词的优劣？于是我们有了一个更标准、更连续、更自动的改进算法：先统计大量真实语料中各个词出现的频率，然后把每种分词方案中各词的出现概率乘起来作为这种方案的得分。利用动态规划，不难求出得分最高的方案。</p>
<p>以“有意见分歧”为例，让我们看看最大概率法是如何工作的。查表可知，在大量真实语料中，“有”、“有意”、“意见”、“见”、“分歧”的 出现概率分别是 0.0181 、 0.0005 、 0.0010 、 0.0002 、 0.0001 ，因此“有／意见／分歧”的得分为  1.8×10<sup>-9</sup> ，但“有意／见／分歧”的得分只有 1.0×10<sup>-11</sup> ，正确方案完胜。</p>
<p>这里的假设是，用词造句无非是随机选词连在一块儿，是一个简单的一元过程。显然，这个假设理想得有点不合理，必然会有很多问题。考虑下面这句话：</p>
<p>这／事／的确／定／不／下来</p>
<p>但是概率算法却会把这个句子分成：</p>
<p>这／事／的／确定／不／下来</p>
<p>原因是，“的”字的出现概率太高了，它几乎总会从“的确”中挣脱出来。</p>
<p>其实，以上所有的分词算法都还有一个共同的大缺陷：它们虽然已经能很好地处理交集型歧义的问题，却完全无法解决另外一种被称为“组合型歧 义”的问题。所谓组合型歧义，就是指同一个字串既可合又可分。比如说，“个人恩怨”中的“个人”就是一个词，“这个人”里的“个人”就必须拆开；“这扇门 的把手”中的“把手”就是一个词，“把手抬起来”的“把手”就必须拆开；“学生会宣传部”中的“学生会”就是一个词，“学生会主动完成作业”里的“学生 会”就必须拆开。这样的例子非常多，“难过”、“马上”、“将来”、“才能”、“过人”、“研究所”、“原子能”都有此问题。究竟是合还是分，还得取决于 它两侧的词语。到目前为止，所有算法对划分方案的评价标准都是基于每个词固有性质的，完全不考虑相邻词语之间的影响；因而一旦涉及到组合型歧义的问题，最 大匹配、最少词数、概率最大等所有策略都不能实现具体情况具体分析。</p>
<p>于是，我们不得不跳出一元假设。此时，便有了那个 Google 黑板报上提到的统计语言模型算法。对于任意两个词语 w<sub>1</sub> 、 w<sub>2</sub> ，统计在语料库中词语 w<sub>1</sub> 后面恰好是 w<sub>2</sub> 的概率 P(w<sub>1</sub>, w<sub>2</sub>) 。这样便会生成一个很大的二维表。再定义一个句子的划分方案的得分为 P(∅, w<sub>1</sub>) · P(w<sub>1</sub>, w<sub>2</sub>) · … · P(w<sub>n-1</sub>, w<sub>n</sub>) ，其中 w<sub>1</sub>, w<sub>2</sub>, …, w<sub>n</sub> 依次表示分出的词。我们同样可以利用动态规划求出得分最高的分词方案。这真是一个天才的模型，这个模型一并解决了词类标注、语音识别等各类自然语言处理问题。</p>
<p>至此，中文自动分词算是有了一个漂亮而实用的算法。</p>
<p>但是，随便拿份报纸读读，你就会发现我们之前给出的测试用例都太理想了，简直就是用来喂给计算机的。在中文分词中，还有一个比分词歧义更令人头疼 的东西——未登录词。中文没有首字母大写，专名号也被取消了，这叫计算机如何辨认人名地名之类的东西？最近十年来，中文分词领域都在集中攻克这一难关。</p>
<p>在汉语的未定义词中，中国人名的规律是最强的了。根据统计，汉语姓氏大约有 1000  多个，其中“王”、“陈”、“李”、“张”、“刘”五大姓氏的覆盖率高达 32% ，前 400 个姓氏覆盖率高达 99%  。人名的用字也比较集中，“英”、“华”、“玉”、“秀”、“明”、“珍”六个字的覆盖率就有 10.35% ，最常用的 400 字则有 90%  的覆盖率。虽然这些字分布在包括文言虚词在内的各种词类里，但就用字的感情色彩来看，人名多用褒义字和中性字，少有不雅用字，因此规律性还是非常强的。根 据这些信息，我们足以计算一个字符串能成为名字的概率，结合预先设置的阈值便能很好地识别出可能的人名。</p>
<p>可是，如何把人名从句子中切出来呢？换句话说，如果句中几个连续字都是姓名常用字，人名究竟应该从哪儿取到哪儿呢？人名以姓氏为左边界，相 对容易判定一些。人名的右边界则可以从下文的提示确定出来：人名后面通常会接“先生”、“同志”、“校长”、“主任”、“医生”等身份词，以及“是”、 “说”、“报道”、“参加”、“访问”、“表示”等动作词。</p>
<p>但麻烦的情况也是有的。一些高频姓氏本身也是经常单独成词的常用字，例如“于”、“马”、“黄”、“常”、“高”等等。很多反映时代性的名 字也是本身就成词的，例如“建国”、“建设”、“国庆”、“跃进”等等。更讨厌的就是那些整个名字本身就是常用词的人了，他们会彻底打乱之前的各种模型。 如果分词程序也有智能的话，他一定会把所有叫“高峰”、“汪洋”、”庞博“的人拖出去斩了。</p>
<p>还有那些恰好与上下文组合成词的人名，例如：</p>
<p>费孝通向人大常委会提交书面报告<br />
邓颖超生前使用过的物品</p>
<p>这就是最考验分词算法的句子了。</p>
<p>相比之下，中国地名的用字就分散得多了，重庆就有一个叫做“犀牛屙屎”的地方。不过，中国地名委员会编写了《中华人民共和国地名录》，收录 了从高原盆地到桥梁电站共 10 万多个地名，这让中国地名的识别便利了很多。外文人名和地名的用字非常集中，识别的正确率要高出许多。</p>
<p>真正有些困难的就是识别机构名了，虽然机构名的后缀比较集中，但左边界的判断就有些难了。更难的就是品牌名了。如今各行各业大打创意战，品牌名可以说是无奇不有，而且经常本身就包含常用词，更是给自动分词添加了不少障碍。</p>
<p>最难识别的未登录词就是缩略语了。“教改”、“发改委”、“北医三院”都是比较好认的缩略语了，有些缩略语搞得连人也是丈二和尚摸不着头脑。你能猜到“人影办”是什么机构的简称吗？打死你都想不到，是“人工影响天气办公室”。</p>
<p>汉语中构造缩略语的规律很诡异，目前也没有一个定论。初次听到这个问题，几乎每个人都会做出这样的猜想：缩略语都是选用各个成分中最核心的 字，比如“安全检查”缩成“安检”，“人民警察”缩成“民警”等等。不过，反例也是有的，“邮政编码”就被缩成了“邮编”，但“码”无疑是更能概括“编 码”一词的。当然，这几个缩略语已经逐渐成词，可以加进词库了；不过新近出现的或者临时构造的缩略语该怎么办，还真是个大问题。</p>
<p>说到新词，网络新词的大量出现才是分词系统真正的敌人。这些新词汇的来源千奇百怪，几乎没有固定的产生机制。要想实现对网络文章的自动分词，目前来看可以说是相当困难的。革命尚未成功，分词算法还有很多进步的余地。</p>
<p>注：转载请注明出处“<a href="http://www.52nlp.cn/">我爱自然语言处理</a>”：<a href="http://www.52nlp.cn/">http://www.52nlp.cn</a></p>
<p>本文链接地址：<a href="http://www.52nlp.cn/matrix67-漫话中文分词算法">http://www.52nlp.cn/matrix67-漫话中文分词算法</a></p>
<p>相关文章:<ol>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e6%9c%80%e5%a4%a7%e5%8c%b9%e9%85%8d%e6%b3%95%e6%89%a9%e5%b1%952' rel='bookmark' title='中文分词入门之最大匹配法扩展2'>中文分词入门之最大匹配法扩展2</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e8%b5%84%e6%ba%90' rel='bookmark' title='中文分词入门之资源'>中文分词入门之资源</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e7%af%87%e5%a4%96' rel='bookmark' title='中文分词入门之篇外'>中文分词入门之篇外</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e6%9c%80%e5%a4%a7%e5%8c%b9%e9%85%8d%e6%b3%95%e6%89%a9%e5%b1%951' rel='bookmark' title='中文分词入门之最大匹配法扩展1'>中文分词入门之最大匹配法扩展1</a></li>
<li><a href='http://www.52nlp.cn/maximum-matching-method-of-chinese-word-segmentation' rel='bookmark' title='中文分词入门之最大匹配法'>中文分词入门之最大匹配法</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e5%ad%97%e6%a0%87%e6%b3%a8%e6%b3%952' rel='bookmark' title='中文分词入门之字标注法2'>中文分词入门之字标注法2</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e5%ad%97%e6%a0%87%e6%b3%a8%e6%b3%951' rel='bookmark' title='中文分词入门之字标注法1'>中文分词入门之字标注法1</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e6%96%87%e7%8c%ae' rel='bookmark' title='中文分词入门之文献'>中文分词入门之文献</a></li>
<li><a href='http://www.52nlp.cn/the-character-based-tagging-method-of-chinese-word-segmentation' rel='bookmark' title='基于字标注的中文分词方法'>基于字标注的中文分词方法</a></li>
<li><a href='http://www.52nlp.cn/%e6%8e%a8%e8%8d%90%e5%bc%a0%e5%8d%8e%e5%b9%b3%e8%80%81%e5%b8%88%e7%9a%84%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%b7%a5%e5%85%b7-ictclas2010' rel='bookmark' title='推荐张华平老师的中文分词工具ICTCLAS2010'>推荐张华平老师的中文分词工具ICTCLAS2010</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.52nlp.cn/matrix67-%e6%bc%ab%e8%af%9d%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e7%ae%97%e6%b3%95/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>基于哈希表和二叉树的词典研究(一)</title>
		<link>http://www.52nlp.cn/%e5%9f%ba%e4%ba%8e%e5%93%88%e5%b8%8c%e8%a1%a8%e5%92%8c%e4%ba%8c%e5%8f%89%e6%a0%91%e7%9a%84%e8%af%8d%e5%85%b8%e7%a0%94%e7%a9%b6%e4%b8%80</link>
		<comments>http://www.52nlp.cn/%e5%9f%ba%e4%ba%8e%e5%93%88%e5%b8%8c%e8%a1%a8%e5%92%8c%e4%ba%8c%e5%8f%89%e6%a0%91%e7%9a%84%e8%af%8d%e5%85%b8%e7%a0%94%e7%a9%b6%e4%b8%80#comments</comments>
		<pubDate>Thu, 16 Dec 2010 01:09:47 +0000</pubDate>
		<dc:creator>王 增才</dc:creator>
				<category><![CDATA[中文分词]]></category>
		<category><![CDATA[二叉树]]></category>
		<category><![CDATA[哈希表]]></category>
		<category><![CDATA[词典]]></category>

		<guid isPermaLink="false">http://www.52nlp.cn/?p=3551</guid>
		<description><![CDATA[词典是许多中文分词系统的一个重要的组成部分。其查询速度直接影响到分词系统的处理速度。本文使用汇编语言设计了一种高效的基于哈希表和二叉树的分词词典。 <a href="http://www.52nlp.cn/%e5%9f%ba%e4%ba%8e%e5%93%88%e5%b8%8c%e8%a1%a8%e5%92%8c%e4%ba%8c%e5%8f%89%e6%a0%91%e7%9a%84%e8%af%8d%e5%85%b8%e7%a0%94%e7%a9%b6%e4%b8%80">继续阅读 <span class="meta-nav">&#8594;</span></a>
相关文章:<ol>
<li><a href='http://www.52nlp.cn/%e5%88%9d%e5%ad%a6%e8%80%85%e6%8a%a5%e9%81%93%ef%bc%882%ef%bc%89%ef%bc%9a%e5%ae%9e%e7%8e%b0-1-gram%e5%88%86%e8%af%8d%e7%ae%97%e6%b3%95' rel='bookmark' title='初学者报道（2）：实现 1-gram分词算法'>初学者报道（2）：实现 1-gram分词算法</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e6%96%87%e7%8c%ae' rel='bookmark' title='中文分词入门之文献'>中文分词入门之文献</a></li>
<li><a href='http://www.52nlp.cn/maximum-matching-method-of-chinese-word-segmentation' rel='bookmark' title='中文分词入门之最大匹配法'>中文分词入门之最大匹配法</a></li>
<li><a href='http://www.52nlp.cn/the-character-based-tagging-method-of-chinese-word-segmentation' rel='bookmark' title='基于字标注的中文分词方法'>基于字标注的中文分词方法</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%80%e4%b8%aa%e4%b8%8d%e9%94%99%e7%9a%84%e8%87%aa%e7%84%b6%e8%af%ad%e8%a8%80%e5%a4%84%e7%90%86%e8%af%8d%e5%85%b8' rel='bookmark' title='一个不错的自然语言处理词典'>一个不错的自然语言处理词典</a></li>
<li><a href='http://www.52nlp.cn/%e5%88%9d%e5%ad%a6%e8%80%85%e6%8a%a5%e5%88%b0-%e5%ae%9e%e7%8e%b0%e4%ba%86%e4%b8%80%e4%b8%aa%e6%9c%80%e5%a4%a7%e5%8c%b9%e9%85%8d%e7%9a%84%e5%88%86%e8%af%8d%e7%ae%97%e6%b3%95' rel='bookmark' title='初学者报到: 实现了一个最大匹配的分词算法'>初学者报到: 实现了一个最大匹配的分词算法</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e8%b5%84%e6%ba%90' rel='bookmark' title='中文分词入门之资源'>中文分词入门之资源</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e5%ad%97%e6%a0%87%e6%b3%a8%e6%b3%951' rel='bookmark' title='中文分词入门之字标注法1'>中文分词入门之字标注法1</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e6%9c%80%e5%a4%a7%e5%8c%b9%e9%85%8d%e6%b3%95%e6%89%a9%e5%b1%951' rel='bookmark' title='中文分词入门之最大匹配法扩展1'>中文分词入门之最大匹配法扩展1</a></li>
<li><a href='http://www.52nlp.cn/acl09-full-paper-accepted-details' rel='bookmark' title='ACL09 Full Paper录用情况'>ACL09 Full Paper录用情况</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>作者：王增才</p>
<p>邮箱：<a href="mailto:wzc@zencai.com">wzc@zencai.com</a></p>
<p><strong>摘要</strong> 词典是许多中文分词系统的一个重要的组成部分。其查询速度直接影响到分词系统的处理速度。本文使用汇编语言设计了一种高效的基于哈希表和二叉树的分词词典。</p>
<p><strong>关键词</strong> 中文分词 哈希表 二叉树 词典</p>
<h1>Study on Chinese Word Segmentation Based on Hash Table and Binary Tree</h1>
<p>Abstract The dictionary mechanism serves as one of the important components in a lot of Chinese word segmentation systems. Its perfomance influences the segmentation speed significantly. In this paper,we design a highly efficient dictionary mechanism in Assemble language, which is based on Hash table and binary tree.</p>
<p>Key words Chinese segmentation; Hash table; Binary tree; Dictionary</p>
<h2>一 介绍</h2>
<p>虽然有人提出了不需要词典的中文分词算法，如胥桂仙等人利用统计提出了基于“找最长字共现”原则的分词算法。[2] 但是，不管是基于规则方法还是统计方法，大部分中文分词算法都有自己的词典。词典的查询速度直接影响到分词系统的处理速度。本文使用汇编语言（编译器MASM32V10）设计了一种高效的基于哈希表和二叉树的分词词典。该算法为：将所有的汉字利用哈希表存储，即根据汉字机内码的编码规律，通过直接寻址哈希函数实现词语首字的快速查找，其查找时间为O(1)；然后将首字相同的词语用二叉树存储；最后将二叉树的内存地址与哈希表进行绑定。<span id="more-3551"></span></p>
<h2>二 首字哈希算法</h2>
<p>一个汉语词典动不动就上十万条词语，词典的查询速度是决定分词算法效率的决定性因素之一。为了提高查询效率，本文词典对词语的首字采用哈希表来存储。</p>
<p>在具体阐述首字哈希算法之前，我们需要明确三个概念：国标码，区位码，机内码。</p>
<p>国标码是汉字信息交换的标准编码，又称汉字交换码。例如中华人民共和国国家标准局于1981年5月颁布了《信息交换用汉字编码字符集—基本集》，代号为GB2312-80，即著名的国标码GB2312-80。该编码共对6763个汉字和682个图形字符进行了编码，每个字符用两个字节表示。[5]</p>
<p>所有的国标码汉字及符号组成一个94行94列的二维代码表中。在此方阵中，每一行称为一个”区”，每一列称为一个”位”。这个方阵实际上组成一个有94个区（编号由01到94），每个区有94个位（编号由01到94）的汉字字符集。每两个字节分别用两位十进制编码，前字节的编码称为区码，后字节的编码称为位码，此即区位码，其中，高两位为区号，低两位为位号。这样区位码可以唯一地确定某一汉字或字符；反之，任何一个汉字或符号都对应一个唯一的区位码，没有重码。如“保”字在二维代码表中处于17区第3位，区位码即为“1703 ”。[6]</p>
<p>国标码并不等于区位码，它是由区位码稍作转换得到,其转换方法为：先将十进制区码和位码分别转换为十六进制的区码和位码，;这样就得了一个与国标码有一个相对位置差的代码，再将这个代码的第一个字节和第二个字节分别加上20(十六进制)，就得到国标码。如：“保”字的国标码为3123H。[6]它是经过下面的转换得到的：1703D－&gt;1103H-&gt;+20H－&gt;3123H。</p>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="189" valign="top"></td>
<td width="189" valign="top">第一字节</td>
<td width="189" valign="top">第二字节</td>
</tr>
<tr>
<td width="189" valign="top">十进制区位码</td>
<td width="189" valign="top">17（区码，十进制）</td>
<td width="189" valign="top">03（位码，十进制）</td>
</tr>
<tr>
<td width="189" valign="top">转换为十六进制区位码</td>
<td width="189" valign="top">11（区码，十六进制）</td>
<td width="189" valign="top">03（位码，十六进制）</td>
</tr>
<tr>
<td width="189" valign="top">第一个字节和第二个字节分别加上20(十六进制)</td>
<td width="189" valign="top">31（十六进制）</td>
<td width="189" valign="top">23（十六进制）</td>
</tr>
</tbody>
</table>
<p>机内码即国标码在电脑内的编码，它与国标码、区位码有一个对应关系。为了不与ASCII码发生冲突，机内码采用的是变形的国标码，其变换方法为：将国标码的每个字节都加上128，即将两个字节的最高位由0改1，其余7位不变，如：由上面我们知道，“保”字的国标码为3123（十六进制），前字节为00110001（二进制），后字节为00100011（二进制），高位改1为10110001（二进制）和10100011（二进制） 即为B1A3（十六进制），因此，“保”字的机内码就是B1A3（十六进制）。</p>
<p>下面我们来看一个验证上述理论的程序：</p>
<p>源代码a.asm：</p>
<p>.386</p>
<p>.model flat,stdcall</p>
<p>option casemap:none</p>
<p>include windows.inc</p>
<p>include user32.inc</p>
<p>includelib user32.lib</p>
<p>include kernel32.inc</p>
<p>includelib kernel32.lib</p>
<p>.data</p>
<p>szCaption db &#8216;消息框!&#8217;,0</p>
<p>;汉字“保”的机内码</p>
<p>szText db 0b1h,0a3h,0</p>
<p>.code</p>
<p>start:</p>
<p>invoke MessageBox,NULL,offset szText,offset szCaption,MB_OK</p>
<p>invoke ExitProcess,NULL</p>
<p>end start</p>
<p>Makefile文件：</p>
<p>NAME=A</p>
<p>OBJS=$(NAME).obj</p>
<p>LINK_FLAG=/subsystem:windows</p>
<p>ML_FLAG=/c /coff</p>
<p>$(NAME).exe:$(OBJS)</p>
<p>Link $(LINK_FLAG) $(OBJS)</p>
<p>.asm.obj:</p>
<p>ml  $(ML_FLAG) $&lt;</p>
<p>clean:</p>
<p>del   *.obj</p>
<p>我们使用机内码到其区位码的映射作为哈希函数。假设汉字的机内码key的第一个字节为char1，第二个字节为char2，即</p>
<p>f(char1)=(char1-160)</p>
<p>f(char2)=(char2-160)</p>
<p>f(key)=f(char1)*256+f(char2)-257</p>
<p>源代码B.asm如下：</p>
<p>.386</p>
<p>.model    flat,stdcall</p>
<p>option    casemap:none</p>
<p>include   windows.inc</p>
<p>include     user32.inc</p>
<p>includelib               user32.lib</p>
<p>include   kernel32.inc</p>
<p>includelib             kernel32.lib</p>
<p>include    HashTable.inc</p>
<p>include    masm32.inc</p>
<p>includelib       masm32.lib</p>
<p>include           ole32.inc</p>
<p>includelib       ole32.lib</p>
<p>.data</p>
<p>;哈希表的初始化</p>
<p>HashA     HashTable        23902    dup(&lt;0,0&gt;)</p>
<p>szCaption       db     &#8216;消息框!&#8217;,0</p>
<p>szText      db               60000     dup(0)</p>
<p>filePath db &#8216;e:gb2312.txt&#8217;,0</p>
<p>.code</p>
<p>; 用机内码到其区位码的映射创建哈希表的一个结点</p>
<p>;ht:ptr HashTable</p>
<p>;key:word&#8211;机内码</p>
<p>CreateNode    proc              uses        esi  ebx  ht:ptr    HashTable,key:word,data:dword</p>
<p>local char1:byte</p>
<p>local char2:byte</p>
<p>mov              esi,ht</p>
<p>mov         ax,key</p>
<p>;char1=ah,char2=al</p>
<p>;f(key)=(char1-160)*256+(char2-160)-257</p>
<p>;计算出存储位置</p>
<p>mov char1,ah</p>
<p>mov char2,al</p>
<p>sub  ah,160</p>
<p>mov ebx,256</p>
<p>movzx eax,ah</p>
<p>mul  ebx</p>
<p>movzx     ebx,char2</p>
<p>add  eax,ebx</p>
<p>sub  eax,417</p>
<p>mov              ebx,type               HashTable</p>
<p>mul               ebx</p>
<p>add               esi,eax</p>
<p>;寻址</p>
<p>mov        ax,key</p>
<p>mov         (HashTable   ptr  [esi]).key,ax</p>
<p>mov              eax,data</p>
<p>mov         (HashTable     ptr        [esi]).data,eax</p>
<p>ret</p>
<p>CreateNode           endp</p>
<p>;用机内码到其区位码的映射查找某个结点</p>
<p>;返回data</p>
<p>HashSearch           proc         uses      esi ebx  ht:ptr      HashTable,key:word</p>
<p>local char1:byte</p>
<p>local char2:byte</p>
<p>mov              esi,ht</p>
<p>mov         ax,key</p>
<p>;char1=ah,char2=al</p>
<p>;f(key)=(char1-160)*256+(char2-160)-257</p>
<p>;计算出存储位置</p>
<p>mov char1,ah</p>
<p>mov char2,al</p>
<p>sub  ah,160</p>
<p>mov ebx,256</p>
<p>movzx eax,ah</p>
<p>mul  ebx</p>
<p>movzx     ebx,char2</p>
<p>add  eax,ebx</p>
<p>sub  eax,417</p>
<p>mov              ebx,type               HashTable</p>
<p>mul               ebx</p>
<p>add               esi,eax</p>
<p>mov eax,(HashTable        ptr [esi]).data</p>
<p>ret</p>
<p>HashSearch    endp</p>
<p>;初始化哈希表</p>
<p>InitHashTable               proc         uses      esi ebx  ht:ptr      HashTable</p>
<p>local key:word</p>
<p>local i:dword</p>
<p>local j:dword</p>
<p>mov              esi,ht</p>
<p>mov eax,1</p>
<p>mov i,eax</p>
<p>mov j,eax</p>
<p>;机内码key=(区码+160）*256+（位码+160）</p>
<p>AreaFor:</p>
<p>;区码i</p>
<p>mov eax,i</p>
<p>cmp eax,95</p>
<p>je InitHashTableReturnLine</p>
<p>mov ebx,1</p>
<p>mov j,ebx</p>
<p>;位码j</p>
<p>PosFor:</p>
<p>mov eax,i</p>
<p>mov ebx,j</p>
<p>cmp ebx,95</p>
<p>je IAddOne</p>
<p>;计算出key</p>
<p>add eax,160</p>
<p>mov ebx,256</p>
<p>mul ebx</p>
<p>mov ebx,j</p>
<p>add eax,ebx</p>
<p>add eax,160</p>
<p>invoke CreateNode,esi,ax,0</p>
<p>inc j</p>
<p>jmp PosFor</p>
<p>IAddOne:</p>
<p>inc   i</p>
<p>jmp AreaFor</p>
<p>InitHashTableReturnLine:</p>
<p>ret</p>
<p>InitHashTable        endp</p>
<p>;将哈希表每个元素的key复制到字符串中</p>
<p>WriteHashTable            proc         uses      esi ebx  ht:ptr      HashTable</p>
<p>local key:word</p>
<p>local i:dword</p>
<p>local j:dword</p>
<p>local index:dword</p>
<p>mov              esi,ht</p>
<p>mov eax,0</p>
<p>mov index,0</p>
<p>mov eax,1</p>
<p>mov i,eax</p>
<p>mov j,eax</p>
<p>;机内码key=(区码+160）*256+（位码+160）</p>
<p>AreaFor:</p>
<p>;区码i</p>
<p>mov eax,i</p>
<p>cmp eax,95</p>
<p>je WriteHashTableReturnLine</p>
<p>mov ebx,1</p>
<p>mov j,ebx</p>
<p>;位码j</p>
<p>PosFor:</p>
<p>mov eax,i</p>
<p>mov ebx,j</p>
<p>cmp ebx,95</p>
<p>je IAddOne</p>
<p>;计算出key</p>
<p>add eax,160</p>
<p>mov ebx,256</p>
<p>mul ebx</p>
<p>mov ebx,j</p>
<p>add eax,ebx</p>
<p>add eax,160</p>
<p>mov ebx,index</p>
<p>mov szText[ebx],ah</p>
<p>inc index</p>
<p>mov ebx,index</p>
<p>mov szText[ebx],al</p>
<p>inc index</p>
<p>inc j</p>
<p>jmp PosFor</p>
<p>IAddOne:</p>
<p>inc   i</p>
<p>jmp AreaFor</p>
<p>WriteHashTableReturnLine:</p>
<p>invoke MessageBox,NULL,offset szText,offset szCaption,MB_OK</p>
<p>invoke write_disk_file,offset filePath,offset szText,index</p>
<p>ret</p>
<p>WriteHashTable     endp</p>
<p>start:</p>
<p>;初始化</p>
<p>invoke    InitHashTable, addr       HashA</p>
<p>invoke     WriteHashTable,addr HashA</p>
<p>mov ax,0b1a3h</p>
<p>invoke     HashSearch,addr HashA,ax</p>
<p>invoke      ExitProcess,NULL</p>
<p>end               start</p>
<p>哈希表结构HashTable.inc：</p>
<p>HashTable       struct</p>
<p>key  word       0</p>
<p>data dword     0</p>
<p>HashTable       ends</p>
<p>nmake文件：</p>
<p>NAME=B</p>
<p>OBJS=$(NAME).obj</p>
<p>LINK_FLAG=/subsystem:windows</p>
<p>ML_FLAG=/c /coff</p>
<p>$(NAME).exe:$(OBJS)</p>
<p>Link $(LINK_FLAG) $(OBJS)</p>
<p>.asm.obj:</p>
<p>ml  $(ML_FLAG) $&lt;</p>
<p>clean:</p>
<p>del   *.obj</p>
<h2>参考资料：</h2>
<p>1. 孙茂松等，《汉语自动分词词典机制的实验研究》，《中文信息学报》第14卷第1期</p>
<p>2. 胥桂仙等，《中文文本挖掘中的无词典分词的算法及其应用》，《吉林工学院学报》，2002年3月</p>
<p>3. 姚兴山，《基于Hash算法的中文分词研究》，《现代图书情报技术》，2008年第3期</p>
<p>4. 黄新亚等，《信息编码技术及其应用大全》，电子工业出版社，1994年8月</p>
<p>5. 国家标准局，《信息交换用汉字编码字符集—基本集》，1981年5月</p>
<p>6. 百度百科机内码词条</p>
<p>相关文章:<ol>
<li><a href='http://www.52nlp.cn/%e5%88%9d%e5%ad%a6%e8%80%85%e6%8a%a5%e9%81%93%ef%bc%882%ef%bc%89%ef%bc%9a%e5%ae%9e%e7%8e%b0-1-gram%e5%88%86%e8%af%8d%e7%ae%97%e6%b3%95' rel='bookmark' title='初学者报道（2）：实现 1-gram分词算法'>初学者报道（2）：实现 1-gram分词算法</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e6%96%87%e7%8c%ae' rel='bookmark' title='中文分词入门之文献'>中文分词入门之文献</a></li>
<li><a href='http://www.52nlp.cn/maximum-matching-method-of-chinese-word-segmentation' rel='bookmark' title='中文分词入门之最大匹配法'>中文分词入门之最大匹配法</a></li>
<li><a href='http://www.52nlp.cn/the-character-based-tagging-method-of-chinese-word-segmentation' rel='bookmark' title='基于字标注的中文分词方法'>基于字标注的中文分词方法</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%80%e4%b8%aa%e4%b8%8d%e9%94%99%e7%9a%84%e8%87%aa%e7%84%b6%e8%af%ad%e8%a8%80%e5%a4%84%e7%90%86%e8%af%8d%e5%85%b8' rel='bookmark' title='一个不错的自然语言处理词典'>一个不错的自然语言处理词典</a></li>
<li><a href='http://www.52nlp.cn/%e5%88%9d%e5%ad%a6%e8%80%85%e6%8a%a5%e5%88%b0-%e5%ae%9e%e7%8e%b0%e4%ba%86%e4%b8%80%e4%b8%aa%e6%9c%80%e5%a4%a7%e5%8c%b9%e9%85%8d%e7%9a%84%e5%88%86%e8%af%8d%e7%ae%97%e6%b3%95' rel='bookmark' title='初学者报到: 实现了一个最大匹配的分词算法'>初学者报到: 实现了一个最大匹配的分词算法</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e8%b5%84%e6%ba%90' rel='bookmark' title='中文分词入门之资源'>中文分词入门之资源</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e5%ad%97%e6%a0%87%e6%b3%a8%e6%b3%951' rel='bookmark' title='中文分词入门之字标注法1'>中文分词入门之字标注法1</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e6%9c%80%e5%a4%a7%e5%8c%b9%e9%85%8d%e6%b3%95%e6%89%a9%e5%b1%951' rel='bookmark' title='中文分词入门之最大匹配法扩展1'>中文分词入门之最大匹配法扩展1</a></li>
<li><a href='http://www.52nlp.cn/acl09-full-paper-accepted-details' rel='bookmark' title='ACL09 Full Paper录用情况'>ACL09 Full Paper录用情况</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.52nlp.cn/%e5%9f%ba%e4%ba%8e%e5%93%88%e5%b8%8c%e8%a1%a8%e5%92%8c%e4%ba%8c%e5%8f%89%e6%a0%91%e7%9a%84%e8%af%8d%e5%85%b8%e7%a0%94%e7%a9%b6%e4%b8%80/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>推荐张华平老师的中文分词工具ICTCLAS2010</title>
		<link>http://www.52nlp.cn/%e6%8e%a8%e8%8d%90%e5%bc%a0%e5%8d%8e%e5%b9%b3%e8%80%81%e5%b8%88%e7%9a%84%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%b7%a5%e5%85%b7-ictclas2010</link>
		<comments>http://www.52nlp.cn/%e6%8e%a8%e8%8d%90%e5%bc%a0%e5%8d%8e%e5%b9%b3%e8%80%81%e5%b8%88%e7%9a%84%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%b7%a5%e5%85%b7-ictclas2010#comments</comments>
		<pubDate>Mon, 03 May 2010 14:53:17 +0000</pubDate>
		<dc:creator>52nlp</dc:creator>
				<category><![CDATA[中文信息处理]]></category>
		<category><![CDATA[中文分词]]></category>
		<category><![CDATA[ICTCLAS]]></category>
		<category><![CDATA[ICTCLAS2010]]></category>
		<category><![CDATA[张华平]]></category>
		<category><![CDATA[自然语言处理]]></category>

		<guid isPermaLink="false">http://www.52nlp.cn/?p=3356</guid>
		<description><![CDATA[　　在国内的自然语言处理领域，估计没有人不知道大名鼎鼎的中文分词工具ICTCLAS了，所以用不着我来推荐。不过今天收到ICTCLAS的作者张华平老师的来信，希望我这里收录一下他最近刚发布的ICTCLAS2010共享版本，这个版本对于研究人员非商业免费使用一年，所以在这里做个推荐，非常感谢张老师对于中文信息处理领域的贡献! 　　我已将下载链接放在了“资源”页面里的“中文分词相关工具”下，该版本无需注册，非商用免费使用一年，下载地址是： http://cid-51de2738d3ea0fdd.skydrive.live.com/self.aspx/.Public/ICTCLAS2010-packet-release.rar 　　关于ICTCLAS2010共享版的详细情况，可以参考张华平老师博客中的这篇文章：《发布ICTCLAS2010共享版-无需注册，非商用免费1年》 　　更多关于中文信息处理及中文分词的问题可以参考张老师的博客：http://hi.baidu.com/drkevinzhang 　　这个博客虽然刚刚建立不久，但是张老师已经提供了一些很不错的自然语言处理方面的有用资源，非常值得关注。 注：转载请注明出处“我爱自然语言处理”：www.52nlp.cn 本文链接地址：http://www.52nlp.cn/推荐张华平老师的中文分词工具-ictclas2010 相关文章: 百度搜索研发部专场招聘会——3月26日（周六） 中文分词入门之文献 摘录：祖国应该做海外华人更好的娘家-新马之旅观感 LDC上免费的中文信息处理资源 中文分词入门之最大匹配法扩展2 中文分词入门之篇外 中文分词入门之字标注法2 中文分词入门之字标注法1 中文分词入门之资源 Matrix67：漫话中文分词算法
相关文章:<ol>
<li><a href='http://www.52nlp.cn/%e7%99%be%e5%ba%a6%e6%90%9c%e7%b4%a2%e7%a0%94%e5%8f%91%e9%83%a8%e4%b8%93%e5%9c%ba%e6%8b%9b%e8%81%98%e4%bc%9a-3%e6%9c%8826%e6%97%a5%e5%91%a8%e5%85%ad' rel='bookmark' title='百度搜索研发部专场招聘会——3月26日（周六）'>百度搜索研发部专场招聘会——3月26日（周六）</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e6%96%87%e7%8c%ae' rel='bookmark' title='中文分词入门之文献'>中文分词入门之文献</a></li>
<li><a href='http://www.52nlp.cn/%e6%91%98%e5%bd%95-%e7%a5%96%e5%9b%bd%e5%ba%94%e8%af%a5%e5%81%9a%e6%b5%b7%e5%a4%96%e5%8d%8e%e4%ba%ba%e6%9b%b4%e5%a5%bd%e7%9a%84%e5%a8%98%e5%ae%b6-%e6%96%b0%e9%a9%ac%e4%b9%8b%e6%97%85%e8%a7%82' rel='bookmark' title='摘录：祖国应该做海外华人更好的娘家-新马之旅观感'>摘录：祖国应该做海外华人更好的娘家-新马之旅观感</a></li>
<li><a href='http://www.52nlp.cn/free-resources-of-chinese-information-processing-in-ldc' rel='bookmark' title='LDC上免费的中文信息处理资源'>LDC上免费的中文信息处理资源</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e6%9c%80%e5%a4%a7%e5%8c%b9%e9%85%8d%e6%b3%95%e6%89%a9%e5%b1%952' rel='bookmark' title='中文分词入门之最大匹配法扩展2'>中文分词入门之最大匹配法扩展2</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e7%af%87%e5%a4%96' rel='bookmark' title='中文分词入门之篇外'>中文分词入门之篇外</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e5%ad%97%e6%a0%87%e6%b3%a8%e6%b3%952' rel='bookmark' title='中文分词入门之字标注法2'>中文分词入门之字标注法2</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e5%ad%97%e6%a0%87%e6%b3%a8%e6%b3%951' rel='bookmark' title='中文分词入门之字标注法1'>中文分词入门之字标注法1</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e8%b5%84%e6%ba%90' rel='bookmark' title='中文分词入门之资源'>中文分词入门之资源</a></li>
<li><a href='http://www.52nlp.cn/matrix67-%e6%bc%ab%e8%af%9d%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e7%ae%97%e6%b3%95' rel='bookmark' title='Matrix67：漫话中文分词算法'>Matrix67：漫话中文分词算法</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>　　在国内的自然语言处理领域，估计没有人不知道大名鼎鼎的中文分词工具ICTCLAS了，所以用不着我来推荐。不过今天收到ICTCLAS的作者张华平老师的来信，希望我这里收录一下他最近刚发布的ICTCLAS2010共享版本，这个版本对于研究人员非商业免费使用一年，所以在这里做个推荐，非常感谢张老师对于中文信息处理领域的贡献!<span id="more-3356"></span><br />
　　我已将下载链接放在了“<a href="http://www.52nlp.cn/resources">资源</a>”页面里的“中文分词相关工具”下，该版本无需注册，非商用免费使用一年，下载地址是：<br />
<a href="http://cid-51de2738d3ea0fdd.skydrive.live.com/self.aspx/.Public/ICTCLAS2010-packet-release.rar"target=_blank>http://cid-51de2738d3ea0fdd.skydrive.live.com/self.aspx/.Public/ICTCLAS2010-packet-release.rar</a><br />
　　关于ICTCLAS2010共享版的详细情况，可以参考张华平老师博客中的这篇文章：《<a href="http://hi.baidu.com/drkevinzhang/blog/item/f9e5752782bf8c27d50742cd.html"target=_blank>发布ICTCLAS2010共享版-无需注册，非商用免费1年</a>》<br />
　　更多关于中文信息处理及中文分词的问题可以参考张老师的博客：<a href="http://hi.baidu.com/drkevinzhang"target=_blank>http://hi.baidu.com/drkevinzhang</a><br />
　　这个博客虽然刚刚建立不久，但是张老师已经提供了一些很不错的自然语言处理方面的有用资源，非常值得关注。</p>
<p>注：转载请注明出处“<a href="http://www.52nlp.cn">我爱自然语言处理</a>”：<a href="http://www.52nlp.cn">www.52nlp.cn</a></p>
<p>本文链接地址：<a href="http://www.52nlp.cn/推荐张华平老师的中文分词工具-ictclas2010">http://www.52nlp.cn/推荐张华平老师的中文分词工具-ictclas2010</a></p>
<p>
<!-- Begin Google Adsense code -->
<script type="text/javascript"><!--
google_ad_client = "pub-4332174469367599";
/* 336x280, 创建于 09-2-7 */
google_ad_slot = "5707022987";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Google Adsense code -->
</p>
<p>相关文章:<ol>
<li><a href='http://www.52nlp.cn/%e7%99%be%e5%ba%a6%e6%90%9c%e7%b4%a2%e7%a0%94%e5%8f%91%e9%83%a8%e4%b8%93%e5%9c%ba%e6%8b%9b%e8%81%98%e4%bc%9a-3%e6%9c%8826%e6%97%a5%e5%91%a8%e5%85%ad' rel='bookmark' title='百度搜索研发部专场招聘会——3月26日（周六）'>百度搜索研发部专场招聘会——3月26日（周六）</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e6%96%87%e7%8c%ae' rel='bookmark' title='中文分词入门之文献'>中文分词入门之文献</a></li>
<li><a href='http://www.52nlp.cn/%e6%91%98%e5%bd%95-%e7%a5%96%e5%9b%bd%e5%ba%94%e8%af%a5%e5%81%9a%e6%b5%b7%e5%a4%96%e5%8d%8e%e4%ba%ba%e6%9b%b4%e5%a5%bd%e7%9a%84%e5%a8%98%e5%ae%b6-%e6%96%b0%e9%a9%ac%e4%b9%8b%e6%97%85%e8%a7%82' rel='bookmark' title='摘录：祖国应该做海外华人更好的娘家-新马之旅观感'>摘录：祖国应该做海外华人更好的娘家-新马之旅观感</a></li>
<li><a href='http://www.52nlp.cn/free-resources-of-chinese-information-processing-in-ldc' rel='bookmark' title='LDC上免费的中文信息处理资源'>LDC上免费的中文信息处理资源</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e6%9c%80%e5%a4%a7%e5%8c%b9%e9%85%8d%e6%b3%95%e6%89%a9%e5%b1%952' rel='bookmark' title='中文分词入门之最大匹配法扩展2'>中文分词入门之最大匹配法扩展2</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e7%af%87%e5%a4%96' rel='bookmark' title='中文分词入门之篇外'>中文分词入门之篇外</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e5%ad%97%e6%a0%87%e6%b3%a8%e6%b3%952' rel='bookmark' title='中文分词入门之字标注法2'>中文分词入门之字标注法2</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e5%ad%97%e6%a0%87%e6%b3%a8%e6%b3%951' rel='bookmark' title='中文分词入门之字标注法1'>中文分词入门之字标注法1</a></li>
<li><a href='http://www.52nlp.cn/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%85%a5%e9%97%a8%e4%b9%8b%e8%b5%84%e6%ba%90' rel='bookmark' title='中文分词入门之资源'>中文分词入门之资源</a></li>
<li><a href='http://www.52nlp.cn/matrix67-%e6%bc%ab%e8%af%9d%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e7%ae%97%e6%b3%95' rel='bookmark' title='Matrix67：漫话中文分词算法'>Matrix67：漫话中文分词算法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.52nlp.cn/%e6%8e%a8%e8%8d%90%e5%bc%a0%e5%8d%8e%e5%b9%b3%e8%80%81%e5%b8%88%e7%9a%84%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e5%b7%a5%e5%85%b7-ictclas2010/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Beautiful Data-统计语言模型的应用三：分词8</title>
		<link>http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d8</link>
		<comments>http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d8#comments</comments>
		<pubDate>Mon, 19 Apr 2010 16:19:17 +0000</pubDate>
		<dc:creator>52nlp</dc:creator>
				<category><![CDATA[中文分词]]></category>
		<category><![CDATA[语言模型]]></category>
		<category><![CDATA[Beautiful Data]]></category>
		<category><![CDATA[Bruce Eckel]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Peter Norvig]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[Python Decorator]]></category>
		<category><![CDATA[分词]]></category>
		<category><![CDATA[统计语言模型]]></category>

		<guid isPermaLink="false">http://www.52nlp.cn/?p=3318</guid>
		<description><![CDATA[　　对于一个包含n个字符的单词来说，利用语言模型进行分词的前提是首先枚举出所有的候选切分，而segment函数中： 　　candidates = ( [first] + segment( rem ) for first, rem in splits( text ) ) 的作用正是如此，它包含了递归调用，因此能枚举出所有的候选切分。那么，这个函数的时间复杂度是多少呢？一个包含n个字符的字符串有2^(n-1)种不同的分词方案（在字符之间有n-1个位置，每一个位置既可以作为单词边界也可以不作为边界）,因此segment函数的时间复杂度为O（2^n),难怪之前的测试当字符串比较长时就跑不出结果了！ 　　那么，我们应该如何来改进这个递归的分词程序呢？如果你了解一些算法知识，大概会想到动态规划算法： 　　动态规划是一种在数学和计算机科学中使用的，用于求解包含重叠子问题的最优化问题的方法。其基本思想是，将原问题分解为相似的子问题，在求解的过程中通过子问题的解求出原问题的解。 　　动态规划在查找有很多重叠子问题的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题，它们的结果都逐渐被计算并被保存，从简单的问题直到整个问题都被解决。因此，动态规划保存递归时的结果，因而不会在解决同样的问题时花费时间。（注：引自维基百科） 　　在segment.py中，segment函数的确是将问题划归成[first] + segment( rem )的子问题进行处理了，因此利用动态规划算法优化来改进segment函数应该成为首选了！不过， Peter Norvig大牛利用了Decorator。事实上，我也是python新手，当我读Beautiful Data中的这段源程序时，Decorator是最让我丈二和尚摸不着头脑的，所以找了一些关于Python Decorator的资料来学习，觉得对于本例，最需要注意的两点是： 　　第一，在Python中，一个函数可以将另一个函数作为参数，对另一个函数进行“包装“以加入新的相关操作，并最终返回一个新的函数。这话说得不太清楚，我们来看一个例子，例子来源于”The Quick Python Book, 2nd”中9.8节的例子，基于Python3.0，这里稍作调整： 　　首先定义一个myfunction: 　　>>> def myfunction( parameter &#8230; <a href="http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d8">继续阅读 <span class="meta-nav">&#8594;</span></a>
相关文章:<ol>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d3' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词3'>Beautiful Data-统计语言模型的应用三：分词3</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d6' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词6'>Beautiful Data-统计语言模型的应用三：分词6</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d4' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词4'>Beautiful Data-统计语言模型的应用三：分词4</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d7' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词7'>Beautiful Data-统计语言模型的应用三：分词7</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d5' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词5'>Beautiful Data-统计语言模型的应用三：分词5</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d1' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词1'>Beautiful Data-统计语言模型的应用三：分词1</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d2' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词2'>Beautiful Data-统计语言模型的应用三：分词2</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%80%e7%bc%98%e8%b5%b7' rel='bookmark' title='Beautiful Data-统计语言模型的应用一：缘起'>Beautiful Data-统计语言模型的应用一：缘起</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%ba%8c%e8%83%8c%e6%99%af' rel='bookmark' title='Beautiful Data-统计语言模型的应用二：背景'>Beautiful Data-统计语言模型的应用二：背景</a></li>
<li><a href='http://www.52nlp.cn/%e5%88%9d%e5%ad%a6%e8%80%85%e6%8a%a5%e9%81%93%ef%bc%882%ef%bc%89%ef%bc%9a%e5%ae%9e%e7%8e%b0-1-gram%e5%88%86%e8%af%8d%e7%ae%97%e6%b3%95' rel='bookmark' title='初学者报道（2）：实现 1-gram分词算法'>初学者报道（2）：实现 1-gram分词算法</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>　　对于一个包含n个字符的单词来说，利用语言模型进行分词的前提是首先枚举出所有的候选切分，而segment函数中：<br />
　　candidates = ( [first] + segment( rem ) for first, rem in splits( text ) )<br />
的作用正是如此，它包含了递归调用，因此能枚举出所有的候选切分。那么，这个函数的时间复杂度是多少呢？一个包含n个字符的字符串有2^(n-1)种不同的分词方案（在字符之间有n-1个位置，每一个位置既可以作为单词边界也可以不作为边界）,因此segment函数的时间复杂度为O（2^n),难怪之前的测试当字符串比较长时就跑不出结果了！<span id="more-3318"></span><br />
　　那么，我们应该如何来改进这个递归的分词程序呢？如果你了解一些算法知识，大概会想到动态规划算法：</p>
<blockquote><p>　　动态规划是一种在数学和计算机科学中使用的，用于求解包含重叠子问题的最优化问题的方法。其基本思想是，将原问题分解为相似的子问题，在求解的过程中通过子问题的解求出原问题的解。<br />
　　动态规划在查找有很多重叠子问题的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题，它们的结果都逐渐被计算并被保存，从简单的问题直到整个问题都被解决。因此，动态规划保存递归时的结果，因而不会在解决同样的问题时花费时间。（注：引自维基百科）</p></blockquote>
<p>　　在segment.py中，segment函数的确是将问题划归成[first] + segment( rem )的子问题进行处理了，因此利用动态规划算法优化来改进segment函数应该成为首选了！不过， Peter Norvig大牛利用了Decorator。事实上，我也是python新手，当我读Beautiful Data中的这段源程序时，Decorator是最让我丈二和尚摸不着头脑的，所以找了一些关于Python Decorator的资料来学习，觉得对于本例，最需要注意的两点是：<br />
　　第一，在Python中，一个函数可以将另一个函数作为参数，对另一个函数进行“包装“以加入新的相关操作，并最终返回一个新的函数。这话说得不太清楚，我们来看一个例子，例子来源于”The Quick Python Book, 2nd”中9.8节的例子，基于Python3.0，这里稍作调整：<br />
　　首先定义一个myfunction:<br />
　　>>> def myfunction( parameter ):<br />
　　&#8230;     　　print( parameter )<br />
　　&#8230;<br />
　　测试myfunciton:<br />
　　>>> myfunction( “Hello, Python Decorator!” )<br />
　　Hello, Python Decorator!<br />
　　然后定义一个decorate:<br />
　　>>> def decorate( func ):<br />
　　&#8230;     　　print ( “in decorate function, decroating”, func.__name__ )<br />
　　&#8230;     　　def wrapper_func( *args ):<br />
　　&#8230;             　　　　print( “Executing”, func.__name__ )<br />
　　&#8230;             　　　　return func( *args )<br />
　　&#8230;     　　return wrapper_func<br />
　　用decorate“包装”myfunction:<br />
　　>>> myfunction = decorate( myfunction )<br />
　　(&#8216;in decorate function, decroating&#8217;, &#8216;myfunction&#8217;)<br />
　　再执行：<br />
　　>>> myfunction( “Hello, Python Decorator!” )<br />
　　(&#8216;Executing&#8217;, &#8216;myfunction&#8217;)<br />
　　Hello, Python Decorator!<br />
　　看看输出结果，myfunction的确已经被“包装”了，事实上这一过程中没有什么新东西，不过就是重新返回了一个 wrapper_func函数给myfunction了，其实Python Decorator做得是同一样的事，只不过它的code更简洁和易读，所以被称之为Syntax sugar(语法糖），关于为何名为Syntax sugar, Bruce Eckel的“<a href="http://blog.csdn.net/beckel/archive/2008/12/22/3585352.aspx"target=_blank>Python Decorators入门</a>“介绍中译者给了如下的解释： </p>
<blockquote><p>　　意指那些没有给计算机语言添加新功能，而只是对人类来说更“甜蜜“的语法。语法糖往往给程序员提供了更实用的编码方式，有益于更好的编码风格，更易读。不过其并没有给语言添加什么新东西。</p></blockquote>
<p>　　解释的真是贴切，我们继续这个例子，为了区别对待myfunction，我们重新定义一个ourfunciton，不过在定义ourfunction之前先加上这块儿语法糖“＠”，表明其是Python Decorator程序:<br />
　　>>> @decorate<br />
　　&#8230; def ourfunction( parameter ):<br />
　　&#8230;     　　print( parameter )<br />
　　&#8230;<br />
　　(&#8216;in decorate function, decroating&#8217;, &#8216;ourfunction&#8217;)<br />
　　以上的输出以表明ourfunction被decorate”包装“，继续测试ourfunction，<br />
　　>>> ourfunction( “Hello, Python Decorator!” )<br />
　　(&#8216;Executing&#8217;, &#8216;ourfunction&#8217;)<br />
　　Hello, Python Decorator!<br />
　　效果确实与上同，只不过这一次的代码要简洁很多。</p>
<p>未完待续&#8230;</p>
<p>注：原创文章，转载请注明出处“<a href="http://www.52nlp.cn">我爱自然语言处理</a>”：<a href="http://www.52nlp.cn">www.52nlp.cn</a></p>
<p>本文链接地址：<a href="http://www.52nlp.cn/beautiful-data-统计语言模型的应用三分词8">http://www.52nlp.cn/beautiful-data-统计语言模型的应用三分词8</a></p>
<p>
<!-- Begin Google Adsense code -->
<script type="text/javascript"><!--
google_ad_client = "pub-4332174469367599";
/* 336x280, 创建于 09-2-7 */
google_ad_slot = "5707022987";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Google Adsense code -->
</p>
<p>相关文章:<ol>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d3' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词3'>Beautiful Data-统计语言模型的应用三：分词3</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d6' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词6'>Beautiful Data-统计语言模型的应用三：分词6</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d4' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词4'>Beautiful Data-统计语言模型的应用三：分词4</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d7' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词7'>Beautiful Data-统计语言模型的应用三：分词7</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d5' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词5'>Beautiful Data-统计语言模型的应用三：分词5</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d1' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词1'>Beautiful Data-统计语言模型的应用三：分词1</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d2' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词2'>Beautiful Data-统计语言模型的应用三：分词2</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%80%e7%bc%98%e8%b5%b7' rel='bookmark' title='Beautiful Data-统计语言模型的应用一：缘起'>Beautiful Data-统计语言模型的应用一：缘起</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%ba%8c%e8%83%8c%e6%99%af' rel='bookmark' title='Beautiful Data-统计语言模型的应用二：背景'>Beautiful Data-统计语言模型的应用二：背景</a></li>
<li><a href='http://www.52nlp.cn/%e5%88%9d%e5%ad%a6%e8%80%85%e6%8a%a5%e9%81%93%ef%bc%882%ef%bc%89%ef%bc%9a%e5%ae%9e%e7%8e%b0-1-gram%e5%88%86%e8%af%8d%e7%ae%97%e6%b3%95' rel='bookmark' title='初学者报道（2）：实现 1-gram分词算法'>初学者报道（2）：实现 1-gram分词算法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d8/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Beautiful Data-统计语言模型的应用三：分词7</title>
		<link>http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d7</link>
		<comments>http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d7#comments</comments>
		<pubDate>Wed, 07 Apr 2010 12:36:36 +0000</pubDate>
		<dc:creator>52nlp</dc:creator>
				<category><![CDATA[中文分词]]></category>
		<category><![CDATA[语言模型]]></category>
		<category><![CDATA[Beautiful Data]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Peter Norvig]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[分词]]></category>
		<category><![CDATA[统计语言模型]]></category>

		<guid isPermaLink="false">http://www.52nlp.cn/?p=3245</guid>
		<description><![CDATA[　　走到这一步，我们利用Google的一元语言模型进行分词的程序基本上已经完成了，先看一下已完成的segment.py程序吧： 1234567891011121314151617181920212223242526272829303132333435363738394041424344import operator def segment&#40; text &#41;: &#160; &#160; &#160; &#160; &#34;&#34;&#34;Return a list of words that is the best segmentation of text.&#34;&#34;&#34; &#160; &#160; &#160; &#160; if not text : return &#91;&#93; &#160; &#160; &#160; &#160; candidates = &#40; &#8230; <a href="http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d7">继续阅读 <span class="meta-nav">&#8594;</span></a>
相关文章:<ol>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d3' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词3'>Beautiful Data-统计语言模型的应用三：分词3</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d4' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词4'>Beautiful Data-统计语言模型的应用三：分词4</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d5' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词5'>Beautiful Data-统计语言模型的应用三：分词5</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d6' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词6'>Beautiful Data-统计语言模型的应用三：分词6</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d8' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词8'>Beautiful Data-统计语言模型的应用三：分词8</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d2' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词2'>Beautiful Data-统计语言模型的应用三：分词2</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d1' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词1'>Beautiful Data-统计语言模型的应用三：分词1</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%ba%8c%e8%83%8c%e6%99%af' rel='bookmark' title='Beautiful Data-统计语言模型的应用二：背景'>Beautiful Data-统计语言模型的应用二：背景</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%80%e7%bc%98%e8%b5%b7' rel='bookmark' title='Beautiful Data-统计语言模型的应用一：缘起'>Beautiful Data-统计语言模型的应用一：缘起</a></li>
<li><a href='http://www.52nlp.cn/%e5%88%9d%e5%ad%a6%e8%80%85%e6%8a%a5%e9%81%93%ef%bc%882%ef%bc%89%ef%bc%9a%e5%ae%9e%e7%8e%b0-1-gram%e5%88%86%e8%af%8d%e7%ae%97%e6%b3%95' rel='bookmark' title='初学者报道（2）：实现 1-gram分词算法'>初学者报道（2）：实现 1-gram分词算法</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>　　走到这一步，我们利用Google的一元语言模型进行分词的程序基本上已经完成了，先看一下已完成的segment.py程序吧：<span id="more-3245"></span></p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br /></div></td><td><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">operator</span> <br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> segment<span style="color: black;">&#40;</span> text <span style="color: black;">&#41;</span>: <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">&quot;&quot;&quot;Return a list of words that is the best segmentation of text.&quot;&quot;&quot;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> text : <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; candidates <span style="color: #66cc66;">=</span> <span style="color: black;">&#40;</span> <span style="color: black;">&#91;</span>first<span style="color: black;">&#93;</span> + segment<span style="color: black;">&#40;</span> rem <span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> first<span style="color: #66cc66;">,</span> rem <span style="color: #ff7700;font-weight:bold;">in</span> splits<span style="color: black;">&#40;</span> text <span style="color: black;">&#41;</span> <span style="color: black;">&#41;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">max</span><span style="color: black;">&#40;</span> candidates<span style="color: #66cc66;">,</span> key <span style="color: #66cc66;">=</span> Pwords <span style="color: black;">&#41;</span> <br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> splits<span style="color: black;">&#40;</span> text<span style="color: #66cc66;">,</span> L <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">20</span> <span style="color: black;">&#41;</span>: <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">&quot;&quot;&quot;Return a list of all possible ( first, rem ) pairs, len( first ) &lt;=L&quot;&quot;&quot;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#91;</span> <span style="color: black;">&#40;</span> text<span style="color: black;">&#91;</span>:i+<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span> text<span style="color: black;">&#91;</span>i+<span style="color: #ff4500;">1</span>:<span style="color: black;">&#93;</span> <span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span> <span style="color: #008000;">min</span><span style="color: black;">&#40;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span>text<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> L <span style="color: black;">&#41;</span> <span style="color: black;">&#41;</span> <span style="color: black;">&#93;</span> <br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> Pwords<span style="color: black;">&#40;</span> words <span style="color: black;">&#41;</span>: <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">&quot;&quot;&quot;The Naive Bayes probability of a sequence of words.&quot;&quot;&quot;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> product<span style="color: black;">&#40;</span> Pw<span style="color: black;">&#40;</span>w<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> w <span style="color: #ff7700;font-weight:bold;">in</span> words <span style="color: black;">&#41;</span> <br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> product<span style="color: black;">&#40;</span> nums <span style="color: black;">&#41;</span>: <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">&quot;&quot;&quot;Return the product of a sequence of numbers.&quot;&quot;&quot;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">reduce</span><span style="color: black;">&#40;</span> <span style="color: #dc143c;">operator</span>.<span style="color: black;">mul</span><span style="color: #66cc66;">,</span> nums<span style="color: #66cc66;">,</span> <span style="color: #ff4500;">1</span> <span style="color: black;">&#41;</span> <br />
<br />
<span style="color: #ff7700;font-weight:bold;">class</span> Pdist<span style="color: black;">&#40;</span> <span style="color: #008000;">dict</span> <span style="color: black;">&#41;</span>: <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">&quot;&quot;&quot;A probability distribution estimated from counts in datafile.&quot;&quot;&quot;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span> <span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> data<span style="color: #66cc66;">,</span> N <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span><span style="color: #66cc66;">,</span> missingfn <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span> <span style="color: black;">&#41;</span>: <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> key<span style="color: #66cc66;">,</span> count <span style="color: #ff7700;font-weight:bold;">in</span> data: <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span><span style="color: black;">&#91;</span>key<span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">self</span>.<span style="color: black;">get</span><span style="color: black;">&#40;</span> key<span style="color: #66cc66;">,</span> <span style="color: #ff4500;">0</span> <span style="color: black;">&#41;</span> + <span style="color: #008000;">int</span><span style="color: black;">&#40;</span> count <span style="color: black;">&#41;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">N</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">float</span><span style="color: black;">&#40;</span> N <span style="color: #ff7700;font-weight:bold;">or</span> <span style="color: #008000;">sum</span><span style="color: black;">&#40;</span> <span style="color: #008000;">self</span>.<span style="color: black;">itervalues</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#41;</span> <span style="color: black;">&#41;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">missingfn</span> <span style="color: #66cc66;">=</span> missingfn <span style="color: #ff7700;font-weight:bold;">or</span> <span style="color: black;">&#40;</span> <span style="color: #ff7700;font-weight:bold;">lambda</span> k<span style="color: #66cc66;">,</span> N: <span style="color: #ff4500;">1</span>./N <span style="color: black;">&#41;</span> <br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__call__</span><span style="color: black;">&#40;</span> <span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> key <span style="color: black;">&#41;</span>: <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> key <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>: <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span><span style="color: black;">&#91;</span>key<span style="color: black;">&#93;</span> / <span style="color: #008000;">self</span>.<span style="color: black;">N</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>: <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">missingfn</span><span style="color: black;">&#40;</span> key<span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span>.<span style="color: black;">N</span> <span style="color: black;">&#41;</span> <br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> datafile<span style="color: black;">&#40;</span> name<span style="color: #66cc66;">,</span> sep <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\t</span>'</span> <span style="color: black;">&#41;</span>: <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">&quot;&quot;&quot;Read key, value pairs from file.&quot;&quot;&quot;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> line <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">file</span><span style="color: black;">&#40;</span> name <span style="color: black;">&#41;</span>: <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">yield</span> line.<span style="color: black;">split</span><span style="color: black;">&#40;</span> sep <span style="color: black;">&#41;</span> <br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> avoid_long_words<span style="color: black;">&#40;</span> word<span style="color: #66cc66;">,</span> N <span style="color: black;">&#41;</span>: <br />
　　<span style="color: #483d8b;">&quot;&quot;&quot;Estimate the probability of an unknown word.&quot;&quot;&quot;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #ff4500;">10</span>./<span style="color: black;">&#40;</span> N * <span style="color: #ff4500;">10</span>**<span style="color: #008000;">len</span><span style="color: black;">&#40;</span> word <span style="color: black;">&#41;</span> <span style="color: black;">&#41;</span> <br />
<br />
N <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">1024908267229</span> &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">## Number of tokens in corpus </span><br />
<br />
Pw <span style="color: #66cc66;">=</span> Pdist<span style="color: black;">&#40;</span> datafile<span style="color: black;">&#40;</span> <span style="color: #483d8b;">'count_1w.txt'</span> <span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> N<span style="color: #66cc66;">,</span> avoid_long_words <span style="color: black;">&#41;</span></div></td></tr></tbody></table></div>
<p>　　其中Pwords和segment两个函数还没有测试，先利用Python解释器测一下。先测count_1w.txt里前三个单词the,of,and，其中：<br />
　　Count(the) = 23135851162<br />
　　Count(of) = 13151942776<br />
　　Count(and) = 12997637966 </p>
<p>　　>>> segment.N<br />
　　1024908267229L<br />
　　>>> segment.Pw( “the” )<br />
　　0.022573582340740989<br />
　　>>> 23135851162. / segment.N<br />
　　0.022573582340740989<br />
　　>>> segment.Pw( “of” )<br />
　　0.012832312116632971<br />
　　>>> 13151942776. / segment.N<br />
　　0.012832312116632971<br />
　　>>> segment.Pw( “and” )<br />
　　0.012681757364628494<br />
　　>>> 12997637966. / segment.N<br />
　　0.012681757364628494<br />
　　测一个造出来的未登录词“theofand”:<br />
　　>>> segment.Pw( “theofand” )<br />
　　9.7569707648437317e-20<br />
　　>>> 10. / ( segment.N * 10 ** len( “theofand” ) )<br />
　　9.7569707648437317e-20 </p>
<p>　　再来看Pwords函数，它返回“product( Pw(w) for w in words )”:<br />
　　>>> segment.Pwords( ["the", "of", "and"] )<br />
　　3.6735405611059254e-06<br />
　　也就是等于：<br />
　　>>> segment.Pw( “the” ) * segment.Pw( “of” ) * segment.Pw( “and” )<br />
　　3.6735405611059254e-06 </p>
<p>　　最后我们来看segment函数了，先测一下分词第一节所举的两个例子：<br />
　　>>> segment.segment( “choosespain” )<br />
　　['choose', 'spain']<br />
　　>>> segment.segment( “insufficientnumbers” )<br />
　　['insufficient', 'numbers']<br />
　　不错，全分正确了，再试一下“自然语言处理”的英文单词：<br />
　　>>> segment.segment( “naturallanguageprocessing” )<br />
　　&#8230;<br />
　　陷入了长时间的停顿，看看你机器的CPU，总有一个在100％的全力运行， 但不管怎么说，还是等到了正确的分词结果：<br />
　　['natural', 'language', 'processing']<br />
　　如果读者愿意，可以继续试一下，譬如“我爱自然语言处理”：<br />
　　>>> segment.segment( “Ilovenaturallanguageprocessing” )<br />
　　&#8230;<br />
　　这一次，我实在等不下去了。问题出在了什么地方？再回顾一下segment函数的代码吧：</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff7700;font-weight:bold;">def</span> segment<span style="color: black;">&#40;</span> text <span style="color: black;">&#41;</span>: <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">&quot;&quot;&quot;Return a list of words that is the best segmentation of text.&quot;&quot;&quot;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> text : <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; candidates <span style="color: #66cc66;">=</span> <span style="color: black;">&#40;</span> <span style="color: black;">&#91;</span>first<span style="color: black;">&#93;</span> + segment<span style="color: black;">&#40;</span> rem <span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> first<span style="color: #66cc66;">,</span> rem <span style="color: #ff7700;font-weight:bold;">in</span> splits<span style="color: black;">&#40;</span> text <span style="color: black;">&#41;</span> <span style="color: black;">&#41;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">max</span><span style="color: black;">&#40;</span> candidates<span style="color: #66cc66;">,</span> key <span style="color: #66cc66;">=</span> Pwords <span style="color: black;">&#41;</span></div></td></tr></tbody></table></div>
<p>　　关于“max(candidates,key=Pwords)”这里引用前一节评论中热心读者navygong的解释:</p>
<blockquote><p>candidates实际上是个generator(生成器)，你提到的这两行代码就是计算每种候选分词方式的概率，并从中取概率最大的那种。如”wheninthecourse”可能的分词方式有<br />
['w', 'henin', 'the', 'course']<br />
['wh', 'en', 'in', 'the', 'course']<br />
['whe', 'n', 'in', 'the', 'course']<br />
…<br />
['wheninthecour', 'se']<br />
['wheninthecours', 'e']<br />
['wheninthecourse']。<br />
以['wh', 'en', 'in', 'the', 'course']为例，Pwords函数作用到这个列表上后得到的是各个词出现的概率的乘积。然后用max函数取出最大乘积的那种候选分词方式。</p></blockquote>
<p>未完待续：<a href="http://www.52nlp.cn/beautiful-data-%E7%BB%9F%E8%AE%A1%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B%E7%9A%84%E5%BA%94%E7%94%A8%E4%B8%89%E5%88%86%E8%AF%8D8">分词8</a></p>
<p>注：原创文章，转载请注明出处“<a href="http://www.52nlp.cn">我爱自然语言处理</a>”：<a href="http://www.52nlp.cn">www.52nlp.cn</a></p>
<p>本文链接地址：<a href="http://www.52nlp.cn/beautiful-data-统计语言模型的应用三分词7">http://www.52nlp.cn/beautiful-data-统计语言模型的应用三分词7</a></p>
<p>
<!-- Begin Google Adsense code -->
<script type="text/javascript"><!--
google_ad_client = "pub-4332174469367599";
/* 336x280, 创建于 09-2-7 */
google_ad_slot = "5707022987";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Google Adsense code -->
</p>
<p>相关文章:<ol>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d3' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词3'>Beautiful Data-统计语言模型的应用三：分词3</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d4' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词4'>Beautiful Data-统计语言模型的应用三：分词4</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d5' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词5'>Beautiful Data-统计语言模型的应用三：分词5</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d6' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词6'>Beautiful Data-统计语言模型的应用三：分词6</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d8' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词8'>Beautiful Data-统计语言模型的应用三：分词8</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d2' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词2'>Beautiful Data-统计语言模型的应用三：分词2</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d1' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词1'>Beautiful Data-统计语言模型的应用三：分词1</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%ba%8c%e8%83%8c%e6%99%af' rel='bookmark' title='Beautiful Data-统计语言模型的应用二：背景'>Beautiful Data-统计语言模型的应用二：背景</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%80%e7%bc%98%e8%b5%b7' rel='bookmark' title='Beautiful Data-统计语言模型的应用一：缘起'>Beautiful Data-统计语言模型的应用一：缘起</a></li>
<li><a href='http://www.52nlp.cn/%e5%88%9d%e5%ad%a6%e8%80%85%e6%8a%a5%e9%81%93%ef%bc%882%ef%bc%89%ef%bc%9a%e5%ae%9e%e7%8e%b0-1-gram%e5%88%86%e8%af%8d%e7%ae%97%e6%b3%95' rel='bookmark' title='初学者报道（2）：实现 1-gram分词算法'>初学者报道（2）：实现 1-gram分词算法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d7/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Beautiful Data-统计语言模型的应用三：分词6</title>
		<link>http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d6</link>
		<comments>http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d6#comments</comments>
		<pubDate>Wed, 31 Mar 2010 13:58:42 +0000</pubDate>
		<dc:creator>52nlp</dc:creator>
				<category><![CDATA[中文分词]]></category>
		<category><![CDATA[语言模型]]></category>
		<category><![CDATA[Beautiful Data]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Peter Norvig]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[yield]]></category>
		<category><![CDATA[__call__]]></category>
		<category><![CDATA[分词]]></category>
		<category><![CDATA[统计语言模型]]></category>

		<guid isPermaLink="false">http://www.52nlp.cn/?p=3219</guid>
		<description><![CDATA[　　说完了Python中的__call__函数，我们继续来完善segment.py，首先将Pw函数删除： 　　def Pw( word ): 　　　　pass 　　然后，在程序中添加Pdist类的Pw对象： 　　Pw = Pdist( datafile( &#8216;count_1w.txt&#8217; ), N, avoid_long_words ) 　　Pdist类中分别调用了datafile和avoid_long_words函数，以及变量N，所以需要在此句之前添加： 12345678910　　def datafile&#40; name, sep = '\t' &#41;: 　　&#34;&#34;&#34;Read key, value pairs from file.&#34;&#34;&#34; 　　　　for line in file&#40; name &#41;: 　　　　　　yield line.split&#40; sep &#41; &#8230; <a href="http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d6">继续阅读 <span class="meta-nav">&#8594;</span></a>
相关文章:<ol>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d7' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词7'>Beautiful Data-统计语言模型的应用三：分词7</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d5' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词5'>Beautiful Data-统计语言模型的应用三：分词5</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d4' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词4'>Beautiful Data-统计语言模型的应用三：分词4</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d3' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词3'>Beautiful Data-统计语言模型的应用三：分词3</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d8' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词8'>Beautiful Data-统计语言模型的应用三：分词8</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d2' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词2'>Beautiful Data-统计语言模型的应用三：分词2</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d1' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词1'>Beautiful Data-统计语言模型的应用三：分词1</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%80%e7%bc%98%e8%b5%b7' rel='bookmark' title='Beautiful Data-统计语言模型的应用一：缘起'>Beautiful Data-统计语言模型的应用一：缘起</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%ba%8c%e8%83%8c%e6%99%af' rel='bookmark' title='Beautiful Data-统计语言模型的应用二：背景'>Beautiful Data-统计语言模型的应用二：背景</a></li>
<li><a href='http://www.52nlp.cn/maximum-matching-method-of-chinese-word-segmentation' rel='bookmark' title='中文分词入门之最大匹配法'>中文分词入门之最大匹配法</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>　　说完了Python中的__call__函数，我们继续来完善segment.py，首先将Pw函数删除：<span id="more-3219"></span><br />
　　def Pw( word ):<br />
　　　　pass</p>
<p>　　然后，在程序中添加Pdist类的Pw对象：<br />
　　Pw = Pdist( datafile( &#8216;count_1w.txt&#8217; ), N, avoid_long_words )  </p>
<p>　　Pdist类中分别调用了datafile和avoid_long_words函数，以及变量N，所以需要在此句之前添加：</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">　　<span style="color: #ff7700;font-weight:bold;">def</span> datafile<span style="color: black;">&#40;</span> name<span style="color: #66cc66;">,</span> sep <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\t</span>'</span> <span style="color: black;">&#41;</span>: <br />
　　<span style="color: #483d8b;">&quot;&quot;&quot;Read key, value pairs from file.&quot;&quot;&quot;</span> <br />
　　　　<span style="color: #ff7700;font-weight:bold;">for</span> line <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">file</span><span style="color: black;">&#40;</span> name <span style="color: black;">&#41;</span>: <br />
　　　　　　<span style="color: #ff7700;font-weight:bold;">yield</span> line.<span style="color: black;">split</span><span style="color: black;">&#40;</span> sep <span style="color: black;">&#41;</span> <br />
<br />
　　<span style="color: #ff7700;font-weight:bold;">def</span> avoid_long_words<span style="color: black;">&#40;</span> word<span style="color: #66cc66;">,</span> N <span style="color: black;">&#41;</span>: <br />
　　　　<span style="color: #483d8b;">&quot;&quot;&quot;Estimate the probability of an unknown word.&quot;&quot;&quot;</span> <br />
　　　　<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #ff4500;">10</span>./<span style="color: black;">&#40;</span> N * <span style="color: #ff4500;">10</span>**<span style="color: #008000;">len</span><span style="color: black;">&#40;</span> word <span style="color: black;">&#41;</span> <span style="color: black;">&#41;</span> <br />
<br />
　　N <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">1024908267229</span> &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">## Number of tokens in corpus</span></div></td></tr></tbody></table></div>
<p>　　datafile函数中调用了yield生成器，网上的解释很多，看得有点晕，不过我觉得下面这句话最形象或者和我们这个例子最相关：</p>
<blockquote><p>yield就相当于往一个list中塞东西而已，只不过写法很奇怪罢了。</p></blockquote>
<p>　　还记得我们的测试例子吗？<br />
　　>>> data_pair = [("A", 1), ("B", 2), ("C", 3), ("D", 4)]<br />
　　data_pair就是一个list，而 datafile函数说白了，就是利用yield生成器来生成一个类似的list。多说无意，我们还是来看一个例子，首先在segment.py所在的目录下建立一个test_data的文件，内容如下：</p>
<blockquote><p>A　　　　1<br />
B　　　　2<br />
C　　　　3<br />
D　　　　4</p></blockquote>
<p>　　在python解释器中：<br />
　　>>> reload( segment )<br />
　　在datafile函数读入test_data文件：<br />
　　>>> test = segment.datafile( “test_data” )<br />
　　观察一下test，是一个generator:<br />
　　>>> test<br />
　　&lt;generator object datafile at 0xb76b7eb4&gt;<br />
　　利用next()，遍历test:<br />
　　>>> test.next()<br />
　　['A', '1\n']<br />
　　>>> test.next()<br />
　　['B', '2\n']<br />
　　>>> test.next()<br />
　　['C', '3\n']<br />
　　>>> test.next()<br />
　　['D', '4\n']<br />
　　>>> test.next()<br />
　　Traceback (most recent call last):<br />
　　File “<stdin>“, line 1, in <module><br />
　　StopIteration<br />
　　重新试一次：<br />
　　>>> test = segment.datafile( “test_data” )<br />
　　并且：<br />
　　>>> for data in test:<br />
　　&#8230;     print data,<br />
　　&#8230;<br />
　　['A', '1\n'] ['B', '2\n'] ['C', '3\n'] ['D', '4\n']<br />
　　读者现在大概可以弄明白datafile函数的作用了吧！继续：<br />
　　>>> Pw = segment.Pdist( segment.datafile( &#8216;test_data&#8217;) )<br />
　　>>> Pw.N<br />
　　10.0<br />
　　>>> Pw(“A”)<br />
　　0.10000000000000001<br />
　　>>> Pw(“D”)<br />
　　0.40000000000000002<br />
　　>>> Pw(“E”)<br />
　　0.10000000000000001<br />
　　和我们之前定义的data_pair结果完全一样，只不过这一次我们把它们写在文件里了。<br />
　　至于avoid_long_words函数，就是重载的未登录词处理函数，即为了避免过长的单词拥有过高的概率，我们从概率10/N出发，对于候选单词的每增加一个字母就除以10：<br />
　　10. / ( N * 10**len( word ) ) </p>
<p>　　可以在python解释器中测试一下：<br />
　　>>> segment.avoid_long_words(“e”, Pw.N)<br />
　　0.10000000000000001<br />
　　>>> segment.avoid_long_words(“we”, Pw.N)<br />
　　0.01<br />
　　>>> segment.avoid_long_words(“the”, Pw.N)<br />
　　0.001 </p>
<p>未完待续：<a href="http://www.52nlp.cn/beautiful-data-%E7%BB%9F%E8%AE%A1%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B%E7%9A%84%E5%BA%94%E7%94%A8%E4%B8%89%E5%88%86%E8%AF%8D7">分词7</a></p>
<p>注：原创文章，转载请注明出处“<a href="http://www.52nlp.cn">我爱自然语言处理</a>”：<a href="http://www.52nlp.cn">www.52nlp.cn</a></p>
<p>本文链接地址：<a href="http://www.52nlp.cn/beautiful-data-统计语言模型的应用三分词6">http://www.52nlp.cn/beautiful-data-统计语言模型的应用三分词6</a></p>
<p>
<!-- Begin Google Adsense code -->
<script type="text/javascript"><!--
google_ad_client = "pub-4332174469367599";
/* 336x280, 创建于 09-2-7 */
google_ad_slot = "5707022987";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Google Adsense code -->
</p>
<p>相关文章:<ol>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d7' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词7'>Beautiful Data-统计语言模型的应用三：分词7</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d5' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词5'>Beautiful Data-统计语言模型的应用三：分词5</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d4' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词4'>Beautiful Data-统计语言模型的应用三：分词4</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d3' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词3'>Beautiful Data-统计语言模型的应用三：分词3</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d8' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词8'>Beautiful Data-统计语言模型的应用三：分词8</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d2' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词2'>Beautiful Data-统计语言模型的应用三：分词2</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d1' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词1'>Beautiful Data-统计语言模型的应用三：分词1</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%80%e7%bc%98%e8%b5%b7' rel='bookmark' title='Beautiful Data-统计语言模型的应用一：缘起'>Beautiful Data-统计语言模型的应用一：缘起</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%ba%8c%e8%83%8c%e6%99%af' rel='bookmark' title='Beautiful Data-统计语言模型的应用二：背景'>Beautiful Data-统计语言模型的应用二：背景</a></li>
<li><a href='http://www.52nlp.cn/maximum-matching-method-of-chinese-word-segmentation' rel='bookmark' title='中文分词入门之最大匹配法'>中文分词入门之最大匹配法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d6/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Beautiful Data-统计语言模型的应用三：分词5</title>
		<link>http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d5</link>
		<comments>http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d5#comments</comments>
		<pubDate>Fri, 26 Mar 2010 16:36:33 +0000</pubDate>
		<dc:creator>52nlp</dc:creator>
				<category><![CDATA[中文分词]]></category>
		<category><![CDATA[语言模型]]></category>
		<category><![CDATA[Beautiful Data]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[lambda]]></category>
		<category><![CDATA[Peter Norvig]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[__call__]]></category>
		<category><![CDATA[分词]]></category>
		<category><![CDATA[统计语言模型]]></category>

		<guid isPermaLink="false">http://www.52nlp.cn/?p=3206</guid>
		<description><![CDATA[　　上一节我们已经解读了Pdist类中的__init__函数，这一节重点关注一下Python类中的__call__函数。首先简单的回顾一下上一节提到的一段话：缺省的情况，对于未知的单词，其概率均为1/N，但是对于每一个实例，Pdist均提供一个函数重载这个缺省值。为了避免过长 的单词拥有过高的概率，我们从概率10/N出发，对于候选单词的每一个字母都除以10。 　　要实现这个功能，Peter Norvig大牛利用了Python中的__call__函数,在Pdist类中加入: 　　class Pdist( dict ): 　　　　”"”A probability distribution estimated from counts in datafile.”"” 　　　　def __init__( self, data, N = None, missingfn = None ): 　　　　　　… 　　　　def _ _call_ _(self, key): 　　　　　　if key in self: return self[key]/self.N 　　　　　　else: &#8230; <a href="http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d5">继续阅读 <span class="meta-nav">&#8594;</span></a>
相关文章:<ol>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d6' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词6'>Beautiful Data-统计语言模型的应用三：分词6</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d4' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词4'>Beautiful Data-统计语言模型的应用三：分词4</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d7' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词7'>Beautiful Data-统计语言模型的应用三：分词7</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d3' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词3'>Beautiful Data-统计语言模型的应用三：分词3</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d2' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词2'>Beautiful Data-统计语言模型的应用三：分词2</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d8' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词8'>Beautiful Data-统计语言模型的应用三：分词8</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d1' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词1'>Beautiful Data-统计语言模型的应用三：分词1</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%80%e7%bc%98%e8%b5%b7' rel='bookmark' title='Beautiful Data-统计语言模型的应用一：缘起'>Beautiful Data-统计语言模型的应用一：缘起</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%ba%8c%e8%83%8c%e6%99%af' rel='bookmark' title='Beautiful Data-统计语言模型的应用二：背景'>Beautiful Data-统计语言模型的应用二：背景</a></li>
<li><a href='http://www.52nlp.cn/%e5%be%ae%e8%bd%af-web-n-gram-services' rel='bookmark' title='微软：Web N-gram Services'>微软：Web N-gram Services</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>　　上一节我们已经解读了Pdist类中的__init__函数，这一节重点关注一下Python类中的__call__函数。首先简单的回顾一下上一节提到的一段话：缺省的情况，对于未知的单词，其概率均为1/N，但是对于每一个实例，Pdist均提供一个函数重载这个缺省值。为了避免过长 的单词拥有过高的概率，我们从概率10/N出发，对于候选单词的每一个字母都除以10。<span id="more-3206"></span><br />
　　要实现这个功能，Peter Norvig大牛利用了Python中的__call__函数,在Pdist类中加入:<br />
　　class Pdist( dict ):<br />
　　　　”"”A probability distribution estimated from counts in datafile.”"”<br />
　　　　def __init__( self, data, N = None, missingfn = None ):<br />
　　　　　　…<br />
　　　　def _ _call_ _(self, key):<br />
　　　　　　if key in self: return self[key]/self.N<br />
　　　　　　else: return self.missingfn(key, self.N)<br />
　　这个函数本身的意思比较清楚，通俗点讲，如果在语料库中找到了该单词及其计数，那么返回的概率就是 count(word)/N，否则就采用处理未登录词的函数，目前的缺省采用lambda函数: lambda k, N: 1./N，也就是返回1/N的概率值。<br />
　　但是为什么要采用__call_函数呢？首先看一下Pythont中关于__call__的标准解释：<br />
　　object.__call__(self[, args...])<br />
　　　　Called when the instance is “called” as a function; if this method is defined, x(arg1, arg2, &#8230;) is a shorthand for x.__call__(arg1, arg2, &#8230;).<br />
　　这个我一开始还没看明白，后来找了一段中文资料才算弄明白：</p>
<blockquote><p>　　Python中有一个有趣的语法，只要定义类型的时候，实现__call__函数，这个类型就成为可调用的。<br />
　　换句话说，我们可以把这个类型的对象当作函数来使用，相当于重载了括号运算符。</p></blockquote>
<p>　　重点是第二句话，“可以把这个类型的对象当作函数来使用”。如果读者还记着我们在第三节时定义了一个辅助函数Pw:<br />
　　def Pw( word ):<br />
　　　　pass<br />
　　当时的主要目的是为了能顺利的reload( segment )，事实上，在《Beautiful Data》的源代码中，这个函数是不存在的，确切的说，Pw是Pdist类的一个对象：<br />
　　Pw = Pdist(datafile(&#8216;vocab_common&#8217;), N, avoid_long_words)<br />
　　再回顾一下Python中__call__的作用：“可以把这个类型的对象当作函数来使用”，所以Pdist类中有了__call__函数的定义之后，其对象Pw就可以当作函数使用了。<br />
　　我们在Python解释器中测试一下：<br />
　　>>> reload( segment )<br />
　　重新定义一个数据集data_pair<br />
　　>>> data_pair = [("A", 1), ("B", 2), ("C", 3), ("D", 4)]<br />
　　初始化Pdist类的一个对象Pw,这里N和missgfun都采用缺省值:<br />
　　>>> Pw = segment.Pdist( data_pair )<br />
　　>>> Pw.N<br />
　　10.0<br />
　　以下开始调用__call__函数，A,B,C,D均在data_pair中存在，因此其概率为1/10, 2/10, 3/10, 4/10：<br />
　　>>> Pw( “A” )<br />
　　0.10000000000000001<br />
　　>>> Pw( “B” )<br />
　　0.20000000000000001<br />
　　>>> Pw( “C” )<br />
　　0.29999999999999999<br />
　　>>> Pw( “D” )<br />
　　0.40000000000000002<br />
　　而对于E和UNK，在data_pair中不存在，因此调用未登录词处理函数，这里默认的概率为1/N，也就是1/10:<br />
　　>>> Pw( “E” )<br />
　　0.10000000000000001<br />
　　>>> Pw( “UNK” )<br />
　　0.10000000000000001</p>
<p>未完待续：<a href="http://www.52nlp.cn/beautiful-data-%E7%BB%9F%E8%AE%A1%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B%E7%9A%84%E5%BA%94%E7%94%A8%E4%B8%89%E5%88%86%E8%AF%8D6">分词6</a></p>
<p>注：原创文章，转载请注明出处“<a href="http://www.52nlp.cn">我爱自然语言处理</a>”：<a href="http://www.52nlp.cn">www.52nlp.cn</a></p>
<p>本文链接地址：<a href="http://www.52nlp.cn/beautiful-data-统计语言模型的应用三分词5">http://www.52nlp.cn/beautiful-data-统计语言模型的应用三分词5</a></p>
<p>
<!-- Begin Google Adsense code -->
<script type="text/javascript"><!--
google_ad_client = "pub-4332174469367599";
/* 336x280, 创建于 09-2-7 */
google_ad_slot = "5707022987";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Google Adsense code -->
</p>
<p>相关文章:<ol>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d6' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词6'>Beautiful Data-统计语言模型的应用三：分词6</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d4' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词4'>Beautiful Data-统计语言模型的应用三：分词4</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d7' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词7'>Beautiful Data-统计语言模型的应用三：分词7</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d3' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词3'>Beautiful Data-统计语言模型的应用三：分词3</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d2' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词2'>Beautiful Data-统计语言模型的应用三：分词2</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d8' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词8'>Beautiful Data-统计语言模型的应用三：分词8</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d1' rel='bookmark' title='Beautiful Data-统计语言模型的应用三：分词1'>Beautiful Data-统计语言模型的应用三：分词1</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%80%e7%bc%98%e8%b5%b7' rel='bookmark' title='Beautiful Data-统计语言模型的应用一：缘起'>Beautiful Data-统计语言模型的应用一：缘起</a></li>
<li><a href='http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%ba%8c%e8%83%8c%e6%99%af' rel='bookmark' title='Beautiful Data-统计语言模型的应用二：背景'>Beautiful Data-统计语言模型的应用二：背景</a></li>
<li><a href='http://www.52nlp.cn/%e5%be%ae%e8%bd%af-web-n-gram-services' rel='bookmark' title='微软：Web N-gram Services'>微软：Web N-gram Services</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.52nlp.cn/beautiful-data-%e7%bb%9f%e8%ae%a1%e8%af%ad%e8%a8%80%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%89%e5%88%86%e8%af%8d5/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

