<?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/language-model/feed" rel="self" type="application/rss+xml" />
	<link>http://www.52nlp.cn</link>
	<description>I Love Natural Language Processing</description>
	<lastBuildDate>Wed, 21 Jul 2010 15:33:24 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>微软：Web N-gram Services</title>
		<link>http://www.52nlp.cn/%e5%be%ae%e8%bd%af-web-n-gram-services</link>
		<comments>http://www.52nlp.cn/%e5%be%ae%e8%bd%af-web-n-gram-services#comments</comments>
		<pubDate>Wed, 12 May 2010 18:07:12 +0000</pubDate>
		<dc:creator>52nlp</dc:creator>
				<category><![CDATA[语料库]]></category>
		<category><![CDATA[语言模型]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[n-gram]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Web N-gram Services]]></category>
		<category><![CDATA[云存储]]></category>
		<category><![CDATA[微软]]></category>

		<guid isPermaLink="false">http://www.52nlp.cn/?p=3369</guid>
		<description><![CDATA[　　微软研究院的官方网站上近期发布了一篇文章：“Microsoft Web N-gram Services&#8220;，大意是邀请整个社区使用其提供的&#8221;Web N-gram services&#8221;,这个服务旨在通过基于云的存储平台，推动网络搜索，自然语言处理，语音技术等相关领域，在研究现实世界的大规模网络数据时，利用该服务所提供动态数据对项目中的常规数据进行补充更新，进而有所发现和创新。
　　有意思的是它的副标题：“Access petabytes of data via the Web N-gram services (Public Beta)”，注意微软这个服务提供的是PB(petabytes)级别的数据:
　　1PB = 1PeraByte = 1024 TB = 1024 * 1024 * 1024 MB
　　如果说Google的1T n-gram语言模型还可以压缩到大硬盘里使用的话，那么PB级别的n-gram语言模型目前来说最好的存储平台就是“云端”了。
　　微软的这项&#8221;Web N-gram Services&#8221;包括如下服务内容：
    　　* Content types: Document Body, Document Title, Anchor Texts
    　　* Model types: Smoothed models
    　　* [...]


相关文章:<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%ba%8c%e8%83%8c%e6%99%af' rel='bookmark' title='Permanent Link: 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%89%e5%88%86%e8%af%8d8' rel='bookmark' title='Permanent Link: Beautiful Data-统计语言模型的应用三：分词8'>Beautiful Data-统计语言模型的应用三：分词8</a></li>
<li><a href='http://www.52nlp.cn/hmm-learn-best-practices-seven-forward-backward-algorithm-2' rel='bookmark' title='Permanent Link: HMM学习最佳范例七：前向-后向算法2'>HMM学习最佳范例七：前向-后向算法2</a></li>
<li><a href='http://www.52nlp.cn/language-model-training-tools-srilm-details' rel='bookmark' title='Permanent Link: 语言模型训练工具SRILM详解'>语言模型训练工具SRILM详解</a></li>
<li><a href='http://www.52nlp.cn/hmm-learn-best-practices-seven-forward-backward-algorithm-5' rel='bookmark' title='Permanent Link: HMM学习最佳范例七：前向-后向算法5'>HMM学习最佳范例七：前向-后向算法5</a></li>
<li><a href='http://www.52nlp.cn/language-modeling-toolkit-irstlm-installation-and-trial-noting' rel='bookmark' title='Permanent Link: 语言模型工具IRSTLM安装及试用手记'>语言模型工具IRSTLM安装及试用手记</a></li>
<li><a href='http://www.52nlp.cn/mit-nlp-second-lesson-word-counting-first-part' rel='bookmark' title='Permanent Link: MIT自然语言处理第二讲：单词计数（第一部分）'>MIT自然语言处理第二讲：单词计数（第一部分）</a></li>
<li><a href='http://www.52nlp.cn/mit-nlp-third-lesson-probabilistic-language-modeling-first-part' rel='bookmark' title='Permanent Link: MIT自然语言处理第三讲：概率语言模型（第一部分）'>MIT自然语言处理第三讲：概率语言模型（第一部分）</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='Permanent Link: 推荐张华平老师的中文分词工具ICTCLAS2010'>推荐张华平老师的中文分词工具ICTCLAS2010</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='Permanent Link: Beautiful Data-统计语言模型的应用三：分词7'>Beautiful Data-统计语言模型的应用三：分词7</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>　　微软研究院的官方网站上近期发布了一篇文章：“<a href="http://research.microsoft.com/en-us/collaboration/focus/cs/bingiton.aspx"target=_blank>Microsoft Web N-gram Services</a>&#8220;，大意是邀请整个社区使用其提供的&#8221;Web N-gram services&#8221;,这个服务旨在通过基于云的存储平台，推动网络搜索，自然语言处理，语音技术等相关领域，在研究现实世界的大规模网络数据时，利用该服务所提供动态数据对项目中的常规数据进行补充更新，进而有所发现和创新。<span id="more-3369"></span><br />
　　有意思的是它的副标题：“Access petabytes of data via the Web N-gram services (Public Beta)”，注意微软这个服务提供的是PB(petabytes)级别的数据:<br />
　　1PB = 1PeraByte = 1024 TB = 1024 * 1024 * 1024 MB<br />
　　如果说Google的1T n-gram语言模型还可以压缩到大硬盘里使用的话，那么PB级别的n-gram语言模型目前来说最好的存储平台就是“云端”了。<br />
　　微软的这项&#8221;Web N-gram Services&#8221;包括如下服务内容：<br />
    　　* Content types: Document Body, Document Title, Anchor Texts<br />
    　　* Model types: Smoothed models<br />
    　　* N-gram availability: unigram, bigram, trigram, N-gram with N=4, 5.（最大也是5元）<br />
    　　* Training size (Body): All documents indexed by Bing<br />
    　　* Access: Hosted Services by Microsoft<br />
    　　* Updates: Periodical updates<br />
　　查了一下微软的这个“Web N-gram Services”，大致是在4月下旬WWW2010会议上公开的，之前一年属于&#8221;private beta”，目前是“public beta”，不过这篇文章最后说得是：“We are now expanding access in the Public Beta Web N-gram Services to include professors and students at accredited colleges and universities worldwide.” 似乎只针对授权的大学教授和学生开放。<br />
　　不过网上目前可以查到如何使用该服务的文章：<a href="http://data-gov.tw.rpi.edu/wiki/How_to_use_Microsoft_Web_N-gram_service"target=_blank>How to use Microsoft Web N-gram service</a>，微软自己也有一个“Quick Start&#8221;，需要你”read the terms of use”并点击“I agree&#8221;之后就能看到，或者，可以试一下下面这个网页：</p>
<p><a href="http://web-ngram.research.microsoft.com/info/quickstart.htm">http://web-ngram.research.microsoft.com/info/quickstart.htm</a></p>
<p>　　这两份文档都比较详细，有兴趣和条件的读者可以试一下。</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/微软-web-n-gram-services">http://www.52nlp.cn/微软-web-n-gram-services</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%ba%8c%e8%83%8c%e6%99%af' rel='bookmark' title='Permanent Link: 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%89%e5%88%86%e8%af%8d8' rel='bookmark' title='Permanent Link: Beautiful Data-统计语言模型的应用三：分词8'>Beautiful Data-统计语言模型的应用三：分词8</a></li>
<li><a href='http://www.52nlp.cn/hmm-learn-best-practices-seven-forward-backward-algorithm-2' rel='bookmark' title='Permanent Link: HMM学习最佳范例七：前向-后向算法2'>HMM学习最佳范例七：前向-后向算法2</a></li>
<li><a href='http://www.52nlp.cn/language-model-training-tools-srilm-details' rel='bookmark' title='Permanent Link: 语言模型训练工具SRILM详解'>语言模型训练工具SRILM详解</a></li>
<li><a href='http://www.52nlp.cn/hmm-learn-best-practices-seven-forward-backward-algorithm-5' rel='bookmark' title='Permanent Link: HMM学习最佳范例七：前向-后向算法5'>HMM学习最佳范例七：前向-后向算法5</a></li>
<li><a href='http://www.52nlp.cn/language-modeling-toolkit-irstlm-installation-and-trial-noting' rel='bookmark' title='Permanent Link: 语言模型工具IRSTLM安装及试用手记'>语言模型工具IRSTLM安装及试用手记</a></li>
<li><a href='http://www.52nlp.cn/mit-nlp-second-lesson-word-counting-first-part' rel='bookmark' title='Permanent Link: MIT自然语言处理第二讲：单词计数（第一部分）'>MIT自然语言处理第二讲：单词计数（第一部分）</a></li>
<li><a href='http://www.52nlp.cn/mit-nlp-third-lesson-probabilistic-language-modeling-first-part' rel='bookmark' title='Permanent Link: MIT自然语言处理第三讲：概率语言模型（第一部分）'>MIT自然语言处理第三讲：概率语言模型（第一部分）</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='Permanent Link: 推荐张华平老师的中文分词工具ICTCLAS2010'>推荐张华平老师的中文分词工具ICTCLAS2010</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='Permanent Link: Beautiful Data-统计语言模型的应用三：分词7'>Beautiful Data-统计语言模型的应用三：分词7</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.52nlp.cn/%e5%be%ae%e8%bd%af-web-n-gram-services/feed</wfw:commentRss>
		<slash:comments>7</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;     　　print( parameter )
　　&#8230;
　　测试myfunciton:
　　>>> myfunction( &#8220;Hello, Python Decorator!&#8221; )
　　Hello, Python Decorator!
　　然后定义一个decorate:
　　>>> def decorate( func ):
　　&#8230;     　　print [...]


相关文章:<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='Permanent Link: 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%8d5' rel='bookmark' title='Permanent Link: 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%8d7' rel='bookmark' title='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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%8d1' rel='bookmark' title='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: Beautiful Data-统计语言模型的应用二：背景'>Beautiful Data-统计语言模型的应用二：背景</a></li>
<li><a href='http://www.52nlp.cn/googles-python-class-sos' rel='bookmark' title='Permanent Link: Google&#8217;s Python Class &#8211; SOS'>Google&#8217;s Python Class &#8211; SOS</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( &#8220;Hello, Python Decorator!&#8221; )<br />
　　Hello, Python Decorator!<br />
　　然后定义一个decorate:<br />
　　>>> def decorate( func ):<br />
　　&#8230;     　　print ( &#8220;in decorate function, decroating&#8221;, func.__name__ )<br />
　　&#8230;     　　def wrapper_func( *args ):<br />
　　&#8230;             　　　　print( &#8220;Executing&#8221;, 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( &#8220;Hello, Python Decorator!&#8221; )<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( &#8220;Hello, Python Decorator!&#8221; )<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='Permanent Link: 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%8d5' rel='bookmark' title='Permanent Link: 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%8d7' rel='bookmark' title='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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%8d1' rel='bookmark' title='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: Beautiful Data-统计语言模型的应用二：背景'>Beautiful Data-统计语言模型的应用二：背景</a></li>
<li><a href='http://www.52nlp.cn/googles-python-class-sos' rel='bookmark' title='Permanent Link: Google&#8217;s Python Class &#8211; SOS'>Google&#8217;s Python Class &#8211; SOS</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>0</slash:comments>
		</item>
		<item>
		<title>安装Srilm的一点新变化</title>
		<link>http://www.52nlp.cn/%e5%ae%89%e8%a3%85srilm%e7%9a%84%e4%b8%80%e7%82%b9%e6%96%b0%e5%8f%98%e5%8c%96</link>
		<comments>http://www.52nlp.cn/%e5%ae%89%e8%a3%85srilm%e7%9a%84%e4%b8%80%e7%82%b9%e6%96%b0%e5%8f%98%e5%8c%96#comments</comments>
		<pubDate>Sat, 10 Apr 2010 12:44:58 +0000</pubDate>
		<dc:creator>52nlp</dc:creator>
				<category><![CDATA[机器翻译]]></category>
		<category><![CDATA[语言模型]]></category>
		<category><![CDATA[SRILM]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.52nlp.cn/?p=3268</guid>
		<description><![CDATA[　　读者Fanlc昨天在《Ubuntu 64位系统下SRILM的配置详解》下留言：“为什么我下载到的1.5.10版本，没有test文件夹呢?编译之后也没有……这怎么测试”。我手头没有Srilm的1.5.10版本，于是下载了一个看看，发现主目录下的确没有test文件夹，对比了一下1.5.9版本的Srilm目录，发现这是一点新变化。
　　对比了一下Srilm 1.5.10和1.5.9里自带的INSTALL文件,以下是diff后的结果：
103c103
&#60;  7 &#8211; To test the compiled tools, change into the $SRILM/test directory and run
&#8212;
&#62; 7 &#8211; To test the compiled tools, run
105c105,107
&#60; 	gnumake all
&#8212;
&#62; 	gnumake test
&#62;
&#62;     from the top-level directory.
109,110c111,113
&#60;     reported, examine the output files in $SRILM/test/output and compare them
    [...]


相关文章:<ol><li><a href='http://www.52nlp.cn/ubuntu-64-bit-system-srilm-configuration' rel='bookmark' title='Permanent Link: Ubuntu 64位系统下SRILM的配置详解'>Ubuntu 64位系统下SRILM的配置详解</a></li>
<li><a href='http://www.52nlp.cn/ubuntu-moses-platform-build-process-record' rel='bookmark' title='Permanent Link: Ubuntu8.10下moses测试平台搭建全记录'>Ubuntu8.10下moses测试平台搭建全记录</a></li>
<li><a href='http://www.52nlp.cn/language-model-training-tools-srilm-details' rel='bookmark' title='Permanent Link: 语言模型训练工具SRILM详解'>语言模型训练工具SRILM详解</a></li>
<li><a href='http://www.52nlp.cn/moses-introduction' rel='bookmark' title='Permanent Link: Moses相关介绍'>Moses相关介绍</a></li>
<li><a href='http://www.52nlp.cn/language-modeling-toolkit-irstlm-installation-and-trial-noting' rel='bookmark' title='Permanent Link: 语言模型工具IRSTLM安装及试用手记'>语言模型工具IRSTLM安装及试用手记</a></li>
<li><a href='http://www.52nlp.cn/euromatrix-and-spirit-of-openness' rel='bookmark' title='Permanent Link: EuroMatrix与开放精神'>EuroMatrix与开放精神</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='Permanent Link: Beautiful Data-统计语言模型的应用三：分词6'>Beautiful Data-统计语言模型的应用三：分词6</a></li>
<li><a href='http://www.52nlp.cn/moses-basic-framework' rel='bookmark' title='Permanent Link: Moses基本框架'>Moses基本框架</a></li>
<li><a href='http://www.52nlp.cn/%e7%ac%ac%e5%8d%81%e4%ba%8c%e5%b1%8a%e6%9c%ba%e5%99%a8%e7%bf%bb%e8%af%91%e5%b3%b0%e4%bc%9a%e5%92%8cnist2009%e6%9c%ba%e5%99%a8%e7%bf%bb%e8%af%91%e8%af%84%e6%b5%8b%e7%ae%80%e4%bb%8b2' rel='bookmark' title='Permanent Link: 第十二届机器翻译峰会和NIST2009机器翻译评测研讨会简介2'>第十二届机器翻译峰会和NIST2009机器翻译评测研讨会简介2</a></li>
<li><a href='http://www.52nlp.cn/compile-stardict-tools-and-use-stardict2txt' rel='bookmark' title='Permanent Link: 编译stardict-tools-3.0.1及使用stardict2txt'>编译stardict-tools-3.0.1及使用stardict2txt</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>　　读者Fanlc昨天在《<a href="http://www.52nlp.cn/ubuntu-64-bit-system-srilm-configuration">Ubuntu 64位系统下SRILM的配置详解</a>》下留言：“为什么我下载到的1.5.10版本，没有test文件夹呢?编译之后也没有……这怎么测试”。我手头没有Srilm的1.5.10版本，于是下载了一个看看，发现主目录下的确没有test文件夹，对比了一下1.5.9版本的Srilm目录，发现这是一点新变化。<span id="more-3268"></span><br />
　　对比了一下Srilm 1.5.10和1.5.9里自带的INSTALL文件,以下是diff后的结果：</p>
<blockquote><p>103c103<br />
&lt;  7 &#8211; To test the compiled tools, change into the $SRILM/test directory and run<br />
&#8212;<br />
&gt; 7 &#8211; To test the compiled tools, run<br />
105c105,107<br />
&lt; 	gnumake all<br />
&#8212;<br />
&gt; 	gnumake test<br />
&gt;<br />
&gt;     from the top-level directory.<br />
109,110c111,113<br />
&lt;     reported, examine the output files in $SRILM/test/output and compare them<br />
     reported, examine the output files in $SRILM//test/output and<br />
&gt;     compare them to the corresponding files in $SRILM//test/reference,<br />
&gt;     where  is a subdirectory name (lm, flm, lattice).<br />
157c160<br />
157c160<br />
&lt; $Date: 2009/06/28 09:12:45 $<br />
&#8212;<br />
&gt; $Date: 2009/12/02 19:39:04 $</p></blockquote>
<p>　　主要是第7步test时有变化，以前是：</p>
<blockquote><p>cd test<br />
make all</p></blockquote>
<p>　　现在改为了：</p>
<blockquote><p>make test</p></blockquote>
<p>　　而1.5.10里test文件已不在主目录下，而是分别位于：$SRILM/lm &amp; flm &amp; lattice下。<br />
　　晚上我在一台新机器上试着编译了一下1.5.10版本的Srilm，依然是检查安装依赖软件，修改Makefile，以及make World编译，而在测试时改变为“make test”，同样一大堆的IDENTICAL及少量DIFFERS出现。<br />
　　写在这里，做个备忘，同时提醒将来可能会遇到此问题的读者，最后感谢Fanlc读者的提示！</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/安装Srilm的一点新变化">http://www.52nlp.cn/安装Srilm的一点新变化</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/ubuntu-64-bit-system-srilm-configuration' rel='bookmark' title='Permanent Link: Ubuntu 64位系统下SRILM的配置详解'>Ubuntu 64位系统下SRILM的配置详解</a></li>
<li><a href='http://www.52nlp.cn/ubuntu-moses-platform-build-process-record' rel='bookmark' title='Permanent Link: Ubuntu8.10下moses测试平台搭建全记录'>Ubuntu8.10下moses测试平台搭建全记录</a></li>
<li><a href='http://www.52nlp.cn/language-model-training-tools-srilm-details' rel='bookmark' title='Permanent Link: 语言模型训练工具SRILM详解'>语言模型训练工具SRILM详解</a></li>
<li><a href='http://www.52nlp.cn/moses-introduction' rel='bookmark' title='Permanent Link: Moses相关介绍'>Moses相关介绍</a></li>
<li><a href='http://www.52nlp.cn/language-modeling-toolkit-irstlm-installation-and-trial-noting' rel='bookmark' title='Permanent Link: 语言模型工具IRSTLM安装及试用手记'>语言模型工具IRSTLM安装及试用手记</a></li>
<li><a href='http://www.52nlp.cn/euromatrix-and-spirit-of-openness' rel='bookmark' title='Permanent Link: EuroMatrix与开放精神'>EuroMatrix与开放精神</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='Permanent Link: Beautiful Data-统计语言模型的应用三：分词6'>Beautiful Data-统计语言模型的应用三：分词6</a></li>
<li><a href='http://www.52nlp.cn/moses-basic-framework' rel='bookmark' title='Permanent Link: Moses基本框架'>Moses基本框架</a></li>
<li><a href='http://www.52nlp.cn/%e7%ac%ac%e5%8d%81%e4%ba%8c%e5%b1%8a%e6%9c%ba%e5%99%a8%e7%bf%bb%e8%af%91%e5%b3%b0%e4%bc%9a%e5%92%8cnist2009%e6%9c%ba%e5%99%a8%e7%bf%bb%e8%af%91%e8%af%84%e6%b5%8b%e7%ae%80%e4%bb%8b2' rel='bookmark' title='Permanent Link: 第十二届机器翻译峰会和NIST2009机器翻译评测研讨会简介2'>第十二届机器翻译峰会和NIST2009机器翻译评测研讨会简介2</a></li>
<li><a href='http://www.52nlp.cn/compile-stardict-tools-and-use-stardict2txt' rel='bookmark' title='Permanent Link: 编译stardict-tools-3.0.1及使用stardict2txt'>编译stardict-tools-3.0.1及使用stardict2txt</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.52nlp.cn/%e5%ae%89%e8%a3%85srilm%e7%9a%84%e4%b8%80%e7%82%b9%e6%96%b0%e5%8f%98%e5%8c%96/feed</wfw:commentRss>
		<slash:comments>12</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; &#91;first&#93; + segment&#40; rem &#41; for first, rem in splits&#40; text &#41; &#41; 
&#160; &#160; &#160; [...]


相关文章:<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='Permanent Link: 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%8d5' rel='bookmark' title='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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%8d8' rel='bookmark' title='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: Beautiful Data-统计语言模型的应用一：缘起'>Beautiful Data-统计语言模型的应用一：缘起</a></li>
<li><a href='http://www.52nlp.cn/mit-nlp-third-lesson-probabilistic-language-modeling-fifth-part' rel='bookmark' title='Permanent Link: MIT自然语言处理第三讲：概率语言模型（第五部分）'>MIT自然语言处理第三讲：概率语言模型（第五部分）</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: 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, 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, key = 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, L = <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>, 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>, 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>, nums, <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>, data, N = <span style="color: #008000;">None</span>, missingfn = <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, 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: #008000;">self</span>.<span style="color: black;">get</span><span style="color: black;">&#40;</span> key, <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: #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> = 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, 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>, 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: #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, sep = <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, 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: #66cc66;">*</span> <span style="color: #ff4500;">10</span><span style="color: #66cc66;">**</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: #ff4500;">1024908267229</span> &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">## Number of tokens in corpus </span><br />
<br />
Pw = 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>, N, 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( &#8220;the&#8221; )<br />
　　0.022573582340740989<br />
　　>>> 23135851162. / segment.N<br />
　　0.022573582340740989<br />
　　>>> segment.Pw( &#8220;of&#8221; )<br />
　　0.012832312116632971<br />
　　>>> 13151942776. / segment.N<br />
　　0.012832312116632971<br />
　　>>> segment.Pw( &#8220;and&#8221; )<br />
　　0.012681757364628494<br />
　　>>> 12997637966. / segment.N<br />
　　0.012681757364628494<br />
　　测一个造出来的未登录词“theofand”:<br />
　　>>> segment.Pw( &#8220;theofand&#8221; )<br />
　　9.7569707648437317e-20<br />
　　>>> 10. / ( segment.N * 10 ** len( &#8220;theofand&#8221; ) )<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( &#8220;the&#8221; ) * segment.Pw( &#8220;of&#8221; ) * segment.Pw( &#8220;and&#8221; )<br />
　　3.6735405611059254e-06 </p>
<p>　　最后我们来看segment函数了，先测一下分词第一节所举的两个例子：<br />
　　>>> segment.segment( &#8220;choosespain&#8221; )<br />
　　['choose', 'spain']<br />
　　>>> segment.segment( &#8220;insufficientnumbers&#8221; )<br />
　　['insufficient', 'numbers']<br />
　　不错，全分正确了，再试一下“自然语言处理”的英文单词：<br />
　　>>> segment.segment( &#8220;naturallanguageprocessing&#8221; )<br />
　　&#8230;<br />
　　陷入了长时间的停顿，看看你机器的CPU，总有一个在100％的全力运行， 但不管怎么说，还是等到了正确的分词结果：<br />
　　['natural', 'language', 'processing']<br />
　　如果读者愿意，可以继续试一下，譬如“我爱自然语言处理”：<br />
　　>>> segment.segment( &#8220;Ilovenaturallanguageprocessing&#8221; )<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: 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, 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, key = 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='Permanent Link: 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%8d5' rel='bookmark' title='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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%8d8' rel='bookmark' title='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: Beautiful Data-统计语言模型的应用一：缘起'>Beautiful Data-统计语言模型的应用一：缘起</a></li>
<li><a href='http://www.52nlp.cn/mit-nlp-third-lesson-probabilistic-language-modeling-fifth-part' rel='bookmark' title='Permanent Link: MIT自然语言处理第三讲：概率语言模型（第五部分）'>MIT自然语言处理第三讲：概率语言模型（第五部分）</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; 

　　def avoid_long_words&#40; word, N &#41;: 
　　　　&#34;&#34;&#34;Estimate the probability of an unknown word.&#34;&#34;&#34; 
　　　　return 10./&#40; N * 10**len&#40; word &#41; [...]


相关文章:<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%8d5' rel='bookmark' title='Permanent Link: 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%8d7' rel='bookmark' title='Permanent Link: 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%8d4' rel='bookmark' title='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: Beautiful Data-统计语言模型的应用二：背景'>Beautiful Data-统计语言模型的应用二：背景</a></li>
<li><a href='http://www.52nlp.cn/maximum-matching-method-of-chinese-word-segmentation' rel='bookmark' title='Permanent Link: 中文分词入门之最大匹配法'>中文分词入门之最大匹配法</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, sep = <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, 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: #66cc66;">*</span> <span style="color: #ff4500;">10</span><span style="color: #66cc66;">**</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: #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( &#8220;test_data&#8221; )<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 &#8220;<stdin>&#8220;, line 1, in <module><br />
　　StopIteration<br />
　　重新试一次：<br />
　　>>> test = segment.datafile( &#8220;test_data&#8221; )<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(&#8220;A&#8221;)<br />
　　0.10000000000000001<br />
　　>>> Pw(&#8220;D&#8221;)<br />
　　0.40000000000000002<br />
　　>>> Pw(&#8220;E&#8221;)<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(&#8220;e&#8221;, Pw.N)<br />
　　0.10000000000000001<br />
　　>>> segment.avoid_long_words(&#8220;we&#8221;, Pw.N)<br />
　　0.01<br />
　　>>> segment.avoid_long_words(&#8220;the&#8221;, 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%8d5' rel='bookmark' title='Permanent Link: 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%8d7' rel='bookmark' title='Permanent Link: 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%8d4' rel='bookmark' title='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: Beautiful Data-统计语言模型的应用二：背景'>Beautiful Data-统计语言模型的应用二：背景</a></li>
<li><a href='http://www.52nlp.cn/maximum-matching-method-of-chinese-word-segmentation' rel='bookmark' title='Permanent Link: 中文分词入门之最大匹配法'>中文分词入门之最大匹配法</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 ):
　　　　&#8221;"&#8221;A probability distribution estimated from counts in datafile.&#8221;"&#8221;
　　　　def __init__( self, data, N = None, missingfn = None ):
　　　　　　…
　　　　def _ _call_ _(self, key):
　　　　　　if key in self: return self[key]/self.N
　　　　　　else: return self.missingfn(key, self.N)
　　这个函数本身的意思比较清楚，通俗点讲，如果在语料库中找到了该单词及其计数，那么返回的概率就是 count(word)/N，否则就采用处理未登录词的函数，目前的缺省采用lambda函数: lambda k, N: 1./N，也就是返回1/N的概率值。
　　但是为什么要采用__call_函数呢？首先看一下Pythont中关于__call__的标准解释：
　　object.__call__(self[, args...])
　　　　Called when the instance is “called” as a function; if this method is defined, x(arg1, [...]


相关文章:<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='Permanent Link: 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%8d7' rel='bookmark' title='Permanent Link: 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%8d4' rel='bookmark' title='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: Beautiful Data-统计语言模型的应用二：背景'>Beautiful Data-统计语言模型的应用二：背景</a></li>
<li><a href='http://www.52nlp.cn/maximum-matching-method-of-chinese-word-segmentation' rel='bookmark' title='Permanent Link: 中文分词入门之最大匹配法'>中文分词入门之最大匹配法</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 />
　　　　&#8221;"&#8221;A probability distribution estimated from counts in datafile.&#8221;"&#8221;<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( &#8220;A&#8221; )<br />
　　0.10000000000000001<br />
　　>>> Pw( &#8220;B&#8221; )<br />
　　0.20000000000000001<br />
　　>>> Pw( &#8220;C&#8221; )<br />
　　0.29999999999999999<br />
　　>>> Pw( &#8220;D&#8221; )<br />
　　0.40000000000000002<br />
　　而对于E和UNK，在data_pair中不存在，因此调用未登录词处理函数，这里默认的概率为1/N，也就是1/10:<br />
　　>>> Pw( &#8220;E&#8221; )<br />
　　0.10000000000000001<br />
　　>>> Pw( &#8220;UNK&#8221; )<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='Permanent Link: 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%8d7' rel='bookmark' title='Permanent Link: 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%8d4' rel='bookmark' title='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: Beautiful Data-统计语言模型的应用二：背景'>Beautiful Data-统计语言模型的应用二：背景</a></li>
<li><a href='http://www.52nlp.cn/maximum-matching-method-of-chinese-word-segmentation' rel='bookmark' title='Permanent Link: 中文分词入门之最大匹配法'>中文分词入门之最大匹配法</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>
		<item>
		<title>Beautiful Data-统计语言模型的应用三：分词4</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%8d4</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%8d4#comments</comments>
		<pubDate>Sun, 14 Mar 2010 15:13: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[lambda]]></category>
		<category><![CDATA[Peter Norvig]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[分词]]></category>
		<category><![CDATA[统计语言模型]]></category>

		<guid isPermaLink="false">http://www.52nlp.cn/?p=3140</guid>
		<description><![CDATA[　　对于Pw函数，这里稍微多做一点说。首先我们从一元语言模型的文件里读取单词及其计数，如果一个单词在语料库中出现，它的概率就是Count(word)/N，这里N是语料库的单词数目的规模。事实上，相对于使用完整的1千3百万单词（词型）的一元语言模型，Peter Norvig大牛对这个一元语言模型进行了简化：（a) 创建了一个更通用的词汇表，并且其中的单词是大小写不敏感（不区分）的，故“the”,”The”以及“THE”的计数是加在一起作为“the”的计数的；(b)只有由字母(letter)组合的单词才被计入其中，而对于其他包含数字或者标点的“单词”则被过滤，故“+170.002”以及“can’t”都不会被计入；(c)只列出其中最常用的1百万单词中的前1/3，也就是333333个单词。
　　即使是一个trillion-word的语料库，某些单词也不一定能被其单词列表包括，这对于Pw来说也是一个问题，因为我们不能让它返回一个0概率，事实上，这就是统计语言模型中非常重要的平滑问题。
　　对于一个语料库中未出现的单词来说，如果不能返回0概率，那应该返回多少？Google语料库中的词例(token)数目N大约有1万亿个(a trillion)，在简化了的一元语言模型中，最小的常见单词的计数是12,711个。所以，一个未知单词的概率应该介于0到12,710/N之间。 所有的未知词概率都一样也不大可能：一个20个字母组成的随机序列（单词）的概率就很可能比6个字母组成的随机序列（单词）的概率要小。
　　我们将定义一个概率分布的类Pdist，它将加载类似(key, count)形式数据文件。缺省的情况，对于未知的单词，其概率均为1/N，但是对于每一个实例，Pdist均提供一个函数重载这个缺省值。为了避免过长的单词拥有过高的概率，我们从概率10/N出发，对于候选单词的每一个字母都除以10。
　　好了，现在我们在segment.py中加入Pdist类：
　　class Pdist( dict ):
　　　　&#8221;"&#8221;A probability distribution estimated from counts in datafile.&#8221;"&#8221;
　　　　def __init__( self, data, N = None, missingfn = None ):
　　　　　　for key, count in data:
　　　　　　　　self[key] = self.get( key, 0 ) + int( count )
　　　　　　self.N = float( N or sum( self.inervalues() ) )
　　　　　　self.missingfn = missingfn or ( lambda k, N: 1./N [...]


相关文章:<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%8d5' rel='bookmark' title='Permanent Link: 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%8d7' rel='bookmark' title='Permanent Link: 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='Permanent Link: 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%8d3' rel='bookmark' title='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: Beautiful Data-统计语言模型的应用一：缘起'>Beautiful Data-统计语言模型的应用一：缘起</a></li>
<li><a href='http://www.52nlp.cn/mit-nlp-third-lesson-probabilistic-language-modeling-fifth-part' rel='bookmark' title='Permanent Link: MIT自然语言处理第三讲：概率语言模型（第五部分）'>MIT自然语言处理第三讲：概率语言模型（第五部分）</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>　　对于Pw函数，这里稍微多做一点说。首先我们从一元语言模型的文件里读取单词及其计数，如果一个单词在语料库中出现，它的概率就是Count(word)/N，这里N是语料库的单词数目的规模。事实上，相对于使用完整的1千3百万单词（词型）的一元语言模型，Peter Norvig大牛对这个一元语言模型进行了简化：（a) 创建了一个更通用的词汇表，并且其中的单词是大小写不敏感（不区分）的，故“the”,”The”以及“THE”的计数是加在一起作为“the”的计数的；(b)只有由字母(letter)组合的单词才被计入其中，而对于其他包含数字或者标点的“单词”则被过滤，故“+170.002”以及“can’t”都不会被计入；(c)只列出其中最常用的1百万单词中的前1/3，也就是333333个单词。<span id="more-3140"></span><br />
　　即使是一个trillion-word的语料库，某些单词也不一定能被其单词列表包括，这对于Pw来说也是一个问题，因为我们不能让它返回一个0概率，事实上，这就是统计语言模型中非常重要的平滑问题。<br />
　　对于一个语料库中未出现的单词来说，如果不能返回0概率，那应该返回多少？Google语料库中的词例(token)数目N大约有1万亿个(a trillion)，在简化了的一元语言模型中，最小的常见单词的计数是12,711个。所以，一个未知单词的概率应该介于0到12,710/N之间。 所有的未知词概率都一样也不大可能：一个20个字母组成的随机序列（单词）的概率就很可能比6个字母组成的随机序列（单词）的概率要小。<br />
　　我们将定义一个概率分布的类Pdist，它将加载类似(key, count)形式数据文件。缺省的情况，对于未知的单词，其概率均为1/N，但是对于每一个实例，Pdist均提供一个函数重载这个缺省值。为了避免过长的单词拥有过高的概率，我们从概率10/N出发，对于候选单词的每一个字母都除以10。<br />
　　好了，现在我们在segment.py中加入Pdist类：<br />
　　class Pdist( dict ):<br />
　　　　&#8221;"&#8221;A probability distribution estimated from counts in datafile.&#8221;"&#8221;<br />
　　　　def __init__( self, data, N = None, missingfn = None ):<br />
　　　　　　for key, count in data:<br />
　　　　　　　　self[key] = self.get( key, 0 ) + int( count )<br />
　　　　　　self.N = float( N or sum( self.inervalues() ) )<br />
　　　　　　self.missingfn = missingfn or ( lambda k, N: 1./N )<br />
　　在python中 __init__ 方法的作用与C++中的构造函数功能类似但不完全相同，具体解释如下：</p>
<blockquote><p>__init__ 在类的实例创建后被立即调用。它可能会引诱你称之为类的构造函数，但这种说法并不正确。说它引诱，是因为它看上去像 (按照习惯，__init__ 是类中第一个定义的方法)，行为也像 (在一个新创建的类实例中，它是首先被执行的代码)，并且叫起来也像 (“init”当然意味着构造的本性)。说它不正确，是因为对象在调用 __init__ 时已经被构造出来了，你已经有了一个对类的新实例的有效引用。但 __init__ 是在 Python 中你可以得到的最接近构造函数的东西，并且它也扮演着非常相似的角色。<br />
每个类方法的第一个参数，包括 __init__，都是指向类的当前实例的引用。按照习惯这个参数总是被称为 self。在 __init__ 方法中，self 指向新创建的对象；在其它的类方法中，它指向方法被调用的类实例。尽管当定义方法时你需要明确指定 self，但在调用方法时，你不 用指定它，Python 会替你自动加上的。<br />
__init__ 方法可以接受任意数目的参数，就像函数一样，参数可以用缺省值定义，即可以设置成对于调用者可选。</p></blockquote>
<p>　　在本例中，N和missingfn都有一个缺省值 None，即 Python的空值，这两个参数稍后再定义。我们具体来看看 Pdist类中 __init__ 方法的作用：</p>
<blockquote><p>for key, count in data:<br />
　　self[key] = self.get( key, 0 ) + int( count )</p></blockquote>
<p>　　由于要读取的一元语言模型文件形式如下：	</p>
<blockquote><p>the     23135851162<br />
of      13151942776<br />
…</p></blockquote>
<p>　　这里利用了python中dictionary的get()函数，其作用是返回dict中指定键(key)的相应值(value)，如果没有找到key,则采用默认值： dict.get(key, default=None)。对于本例，key就是词型如the, count就是其计数，而对于未出现的单词，默认的初始化值为0。</p>
<blockquote><p>self.N = float( N or sum( self.itervalues() ) )</p></blockquote>
<p>　　这个表达式的作用是初始化参数N，即一元语言模型中总的词例数，可以由用户指定，如果用户没有指定，就利用dic.itervalues()方法遍历dic中的所有value，本例中也就是所有单词的计数，并求和：<br />
　　dic.itervalues(): return an iterator over the mapping&#8217;s values</p>
<blockquote><p>self.missingfn = missingfn or ( lambda k, N: 1./N )</p></blockquote>
<p>　　missingfun参数的作用是调用一个处理未登录词的函数，如果用户没有指定，则调用lambda表达式：<br />
　　lambda k, N: 1./N<br />
　　lambda表达式是Python支持一种有趣的语法，它允许你快速定义单行的最小函数，这些也可以称之为 lambda函数，是从 Lisp 借用来的，可以用在任何需要函数的地方。可以利用python解释器来测试一下上面的lambda函数：<br />
　　>>> ( lambda k, N : 1. / N )( 1, 2 )<br />
　　0.5<br />
　　>>> ( lambda k, N : 1. / N )( 2, 2 )<br />
　　0.5<br />
　　>>> ( lambda k, N : 1. / N )( 2, 5 )<br />
　　0.20000000000000001<br />
　　>>> ( lambda k, N : 1. / N )( 2, 10 )<br />
　　0.10000000000000001<br />
　　第一个参数k在这里似乎还没有任何作用，而该lambda函数的作用就是：缺省的情况，对于未知的单词其返回概率均为1/N。<br />
　　现在我们可以利用python解释器来测试一下Pdist类中的__init__函数：<br />
　　首先定义一组测试数据：<br />
　　>>> data_pair = [ ("A", 1), ("B", 2), ("C", 3) ]<br />
　　然后reload:<br />
　　>>> reload( segment )<br />
　　&lt;module &#8217;segment&#8217; from &#8217;segment.py&#8217;&gt;<br />
　　最后生成一个Pdist类的对象test:<br />
　　>>> test = segment.Pdist( data_pair )<br />
　　>>> test.N<br />
　　6.0<br />
　　>>> test.missingfn<br />
　　&lt;function &lt;lambda&gt; at 0xb7d4cd84><br />
　　注意其中的参数N和missingfun都采用缺省值,因此test.N返回的是data_pair中的value和，而test.missingfn返回的是__init__中定义的lambda函数: lambda k, N: 1./N,可以继续测试一下：<br />
　　>>> test.missingfn( 1, 5 )<br />
　　0.20000000000000001<br />
　　>>> test.missingfn( 2, 5 )<br />
　　0.20000000000000001<br />
　　>>> test.missingfn( 2, test.N )<br />
　　0.16666666666666666<br />
　　>>> test.missingfn( 2, 6 )<br />
　　0.16666666666666666</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%8D5">分词5</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-统计语言模型的应用三分词4">http://www.52nlp.cn/beautiful-data-统计语言模型的应用三分词4</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%8d5' rel='bookmark' title='Permanent Link: 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%8d7' rel='bookmark' title='Permanent Link: 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='Permanent Link: 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%8d3' rel='bookmark' title='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: Beautiful Data-统计语言模型的应用一：缘起'>Beautiful Data-统计语言模型的应用一：缘起</a></li>
<li><a href='http://www.52nlp.cn/mit-nlp-third-lesson-probabilistic-language-modeling-fifth-part' rel='bookmark' title='Permanent Link: MIT自然语言处理第三讲：概率语言模型（第五部分）'>MIT自然语言处理第三讲：概率语言模型（第五部分）</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%8d4/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Beautiful Data-统计语言模型的应用三：分词3</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%8d3</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%8d3#comments</comments>
		<pubDate>Tue, 09 Mar 2010 16:47:49 +0000</pubDate>
		<dc:creator>52nlp</dc:creator>
				<category><![CDATA[中文分词]]></category>
		<category><![CDATA[语言模型]]></category>
		<category><![CDATA[Beautiful Data]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Naive Bayes]]></category>
		<category><![CDATA[Peter Norvig]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[分词]]></category>
		<category><![CDATA[朴素贝叶斯]]></category>
		<category><![CDATA[统计语言模型]]></category>

		<guid isPermaLink="false">http://www.52nlp.cn/?p=3121</guid>
		<description><![CDATA[　　本节我们进入《Beautiful Data》中分词的编码阶段，完整的程序及数据大家可以在“Natural Language Corpus Data: Beautiful Data”上下载ngrams.zip，我这里主要做一些解读。程序由python实现，无论在Linux或者Windows平台下，只要安装了相应的python版本，程序均可以通过测试，不过我所使用的是python2.6，注意，在python3.0上会有一些问题。
　　首先新建一个segment.py文件，依据上一节的思路，我们定义一个segment函数：
　　
　　def segment( text ):
　　　　&#8221;"&#8221;Return a list of words that is the best segmentation of text.&#8221;"&#8221;
　　　　if not text : return []
　　　　candidates = ( [first] + segment( rem ) for first, rem in splits( text ) )
　　　　return max( candidates, key = Pwords )
　　segment函数的目标就是“ 对于所有的候选切分， 选择P(first) × P(remaining) 乘积最高的那一个作为最佳切分”，事实上它里面包括了递归调用，最终返回的是最佳的分词短语，这个我们暂且不说，且看看它另外调用的两个函数splits和Pwords，在segment.py中加入如下的代码：	
　　def splits( text, L [...]


相关文章:<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='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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%8d5' rel='bookmark' title='Permanent Link: 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%8d2' rel='bookmark' title='Permanent Link: 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%8d4' rel='bookmark' title='Permanent Link: 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%8d1' rel='bookmark' title='Permanent Link: 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='Permanent Link: 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='Permanent Link: Beautiful Data-统计语言模型的应用二：背景'>Beautiful Data-统计语言模型的应用二：背景</a></li>
<li><a href='http://www.52nlp.cn/mit-nlp-third-lesson-probabilistic-language-modeling-first-part' rel='bookmark' title='Permanent Link: MIT自然语言处理第三讲：概率语言模型（第一部分）'>MIT自然语言处理第三讲：概率语言模型（第一部分）</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>　　本节我们进入《Beautiful Data》中分词的编码阶段，完整的程序及数据大家可以在“<a href="http://norvig.com/ngrams/"target=_blank>Natural Language Corpus Data: Beautiful Data</a>”上下载ngrams.zip，我这里主要做一些解读。程序由python实现，无论在Linux或者Windows平台下，只要安装了相应的python版本，程序均可以通过测试，不过我所使用的是python2.6，注意，在python3.0上会有一些问题。<span id="more-3121"></span><br />
　　首先新建一个segment.py文件，依据上一节的思路，我们定义一个segment函数：<br />
　　<br />
　　def segment( text ):</p>
<p>　　　　&#8221;"&#8221;Return a list of words that is the best segmentation of text.&#8221;"&#8221;</p>
<p>　　　　if not text : return []</p>
<p>　　　　candidates = ( [first] + segment( rem ) for first, rem in splits( text ) )</p>
<p>　　　　return max( candidates, key = Pwords )</p>
<p>　　segment函数的目标就是“ 对于所有的候选切分， 选择P(first) × P(remaining) 乘积最高的那一个作为最佳切分”，事实上它里面包括了递归调用，最终返回的是最佳的分词短语，这个我们暂且不说，且看看它另外调用的两个函数splits和Pwords，在segment.py中加入如下的代码：	</p>
<p>　　def splits( text, L = 20 ):</p>
<p>　　　　&#8221;"&#8221;Return a list of all possible ( first, rem ) pairs, len( first ) <=L"""</p>
<p>　　　　return [ ( text[:i+1], text[i+1:] ) for i in range( min(len(text), L ) ) ]</p>
<p>　　def Pwords( words ):</p>
<p>　　　　pass</p>
<p>　　splits函数的作用是返回所有可能的将字符串切分成首词和剩余字符串切分结果，Pwords稍后再论，暂且”pass”，我们利用python解释器来测试一下splits函数：<br />
　　nlp@52nlp:~/python/beautiful$ python</p>
<p>　　Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41) </p>
<p>　　[GCC 4.3.3] on linux2</p>
<p>　　Type "help", "copyright", "credits" or "license" for more information.</p>
<p>　　>>> import segment</p>
<p>　　>>> split = segment.splits( &#8220;12345&#8243; )</p>
<p>　　>>> print split</p>
<p>　　[('1', '2345'), ('12', '345'), ('123', '45'), ('1234', '5'), ('12345', '')]</p>
<p>　　>>> split = segment.splits( &#8220;wheninthecourse&#8221; )</p>
<p>　　>>> print split</p>
<p>　　[('w', 'heninthecourse'), ('wh', 'eninthecourse'), ('whe', 'ninthecourse'), ('when', 'inthecourse'), ('wheni', 'nthecourse'), ('whenin', 'thecourse'), ('whenint', 'hecourse'), ('wheninth', 'ecourse'), ('wheninthe', 'course'), ('wheninthec', 'ourse'), ('whenintheco', 'urse'), ('wheninthecou', 'rse'), ('wheninthecour', 'se'), ('wheninthecours', 'e'), ('wheninthecourse', '')]</p>
<p>　　当然，你也可以测试一下:<br />
　　>>> split = segment.splits<br />
( &#8220;wheninthecourseofhumaneventsitbecomesnecessary&#8221; )<br />
　　print之后的结果会比较长。</p>
<p>　　再来看Pwords函数，在segment.py中将其修改为：<br />
　　def Pwords( words ):</p>
<p>　　　　&#8221;"&#8221;The Naive Bayes probability of a sequence of words.&#8221;"&#8221;</p>
<p>　　　　return product( Pw(w) for w in words )</p>
<p>　　《Beautiful Data》中的标准解释是“The Naive Bayes probability of a sequence of words”，既“单词序列的朴素贝叶斯（Naive Bayes，简称NB）概率“，朴素贝叶斯概率的核心在于它假设向量的所有分量之间是独立的，这里的向量是单词序列，故假设的是所有单词之间是独立的，这也是我们利用一元语言模型的一个前提假设。回顾&#8217;wheninrome&#8217;这个分词例子，它有很多候选分词短语，譬如“when in rome”，利用一元语言模型，只需计算P(when) × P(in) × P(rome)。<br />
　　不过Pwords函数同样调用了两个辅助函数:product和Pw(w)，在segment.py中加入如下的代码：<br />
　　def product( nums ):</p>
<p>　　　　&#8221;"&#8221;Return the product of a sequence of numbers.&#8221;"&#8221;</p>
<p>　　　　return reduce( operator.mul, nums, 1 )</p>
<p>　　def Pw( word ):</p>
<p>　　　　pass</p>
<p>　　并且在segment.py的开始处加入：<br />
　　import operator</p>
<p>　　因为product函数调用了operator模块中的二元乘积mul函数：<br />
　　operator.mul(a, b)<br />
　　operator.__mul__(a, b)<br />
　　　　Return a * b, for a and b numbers.<br />
　　事实上operator.mul是被producet中的reduce函数调用的，reduce在python2.6中是内建函数（注意在python3.0中已不是，需要“from functools import reduce”）:<br />
　　reduce(func,seq[,init])：func 为二元函数，将func作用于seq序列的元素，每次携带一对（先前的结果以及下一个序列的元素），连续的将现有的结果和下一个值作用在获得的随后的结果 上，最后减少我们的序列为一个单一的返回值：如果初始值init给定，第一个比较会是init和第一个序列元素而不是序列的头两个元素。<br />
　　这里的func为operator.mul，最终reduce返回给product的结果是数字序列的乘积结果，可以在python的解释器中做如下验证：<br />
　　>>> reload( segment )<br />
　　&lt;module &#8217;segment&#8217; from &#8217;segment.py&#8217;&gt;<br />
　　>>> segment.product( [1, 2, 3, 4, 5] )<br />
　　120</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%8D4">分词4</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-统计语言模型的应用三分词3">http://www.52nlp.cn/beautiful-data-统计语言模型的应用三分词3</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='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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%8d5' rel='bookmark' title='Permanent Link: 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%8d2' rel='bookmark' title='Permanent Link: 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%8d4' rel='bookmark' title='Permanent Link: 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%8d1' rel='bookmark' title='Permanent Link: 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='Permanent Link: 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='Permanent Link: Beautiful Data-统计语言模型的应用二：背景'>Beautiful Data-统计语言模型的应用二：背景</a></li>
<li><a href='http://www.52nlp.cn/mit-nlp-third-lesson-probabilistic-language-modeling-first-part' rel='bookmark' title='Permanent Link: MIT自然语言处理第三讲：概率语言模型（第一部分）'>MIT自然语言处理第三讲：概率语言模型（第一部分）</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%8d3/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Beautiful Data-统计语言模型的应用三：分词2</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%8d2</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%8d2#comments</comments>
		<pubDate>Tue, 02 Mar 2010 13:06:15 +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[分词]]></category>
		<category><![CDATA[统计语言模型]]></category>

		<guid isPermaLink="false">http://www.52nlp.cn/?p=3101</guid>
		<description><![CDATA[　　现在，我们就可以应用这个方法来进行分词了。首先定义一个函数：segment，其输入是一串没有空格的字符串，而输出则是一个单词列表，既最好的分词结果：
　　>>> segment(&#8216;choosespain&#8217;)
　　['choose', 'spain']
　　让我们从第一步概率语言模型开始。一个单词序列的概率是给定单词的上下文——在这里是前面的所有的单词——每一个单词概率之积。用数学公式可以如下表达：
　　P(W1:n) = Πk=1:nP(Wk &#124; W1:k–1)
　　我们没有足够的数据来准确计算这个概率，所以我们可以通过使用小一点的语料库来近似地计算这个概率（公式）。由于Google语言模型最大到5元(5-grams),所以我们可以使用5-grams来计算整个单词序列的概率，故一个n-word序列的概率等于给定前4个单词（并不是前面所有单词）每一个单词的概率之积。
　　关于5元语言模型，存在三个困难。首先，Google语言模型中5-gram数据大约有30G，一般机器的内存是无法加载的。其次，很多5元短语的计数为0，我们需要一些方法来回退（或者平滑），既使用较短的（短语）序列来估计这些计数为0的5元短语概率。第三，候选短语的搜索空间将会很大，因为其所依赖的单词数目达到4个。当然，只要想点办法，所有的这三个困难都是可以克服的。但是我们可以先简化一下这个问题，仅考虑一元(unigram)语言模型，这样就能立即解决这三个问题。利用一元语言模型，单词序列的概率就等于每一个单词自身（没有依赖）概率之积，而每一个单词概率与其他单词概率是独立的： 
　　 P(W1:n) = Πk=1:nP(Wk)
　　相应的，我们来看&#8217;wheninrome&#8217;这个分词例子，它有很多候选分词短语，譬如“when in rome”，利用一元语言模型，只需计算P(when) × P(in) × P(rome)。如果这个乘积结果比其他任何候选短语的乘积都高，那么“when in rome”就是最好的分词结果。
　　一个包含n个字符的字符串有2^(n-1)种不同的分词方案（在字符之间有n-1个位置，每一个位置既可以作为单词边界也可以不作为边界）。因此，对于字符串“ wheninthecourseofhumaneventsitbecomesnecessary”,有35万亿(trillion)种切分方法。但是可以肯定，你能够在几秒钟之内找到正确的分词形式，并且不需要枚举所有的候选分词短语。首先扫描“w”,然后是”wh”以及”whe”,并且拒绝这些不大可能的“单词”，但是接受“when”作为可能的“单词”。之后再扫描剩余的部分，与前面同理，依次找到可能的分词，并最终找到最佳的分词短语。一旦我们对问题做了简化，既每一个单词相互是独立的，那么也就意味着我们不需要考虑单词之间的所有组合。
　　这给了我们一个大致的分词函数轮廓：考虑将字符串切分成首词和剩余字符串所有分法（可以任意限定最长的单词长度，例如，L＝20字符）。对于每一种可能的分法，搜索剩余字符串最好的切分方法。对于所有的候选切分， P(first) × P(remaining) 乘积最高的那一个就是最佳分法。
未完待续：分词3
注：原创文章，转载请注明出处“我爱自然语言处理”：www.52nlp.cn
本文链接地址：http://www.52nlp.cn/beautiful-data-统计语言模型的应用三分词2










相关文章:Beautiful Data-统计语言模型的应用三：分词3
Beautiful Data-统计语言模型的应用三：分词7
Beautiful Data-统计语言模型的应用三：分词6
Beautiful Data-统计语言模型的应用三：分词5
Beautiful Data-统计语言模型的应用三：分词4
Beautiful Data-统计语言模型的应用三：分词8
Beautiful Data-统计语言模型的应用三：分词1
Beautiful Data-统计语言模型的应用一：缘起
Beautiful Data-统计语言模型的应用二：背景
微软：Web N-gram Services



相关文章:<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='Permanent Link: 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%8d7' rel='bookmark' title='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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%8d8' rel='bookmark' title='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: 微软：Web N-gram Services'>微软：Web N-gram Services</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>　　现在，我们就可以应用这个方法来进行分词了。首先定义一个函数：segment，其输入是一串没有空格的字符串，而输出则是一个单词列表，既最好的分词结果：<span id="more-3101"></span></p>
<blockquote><p>　　>>> segment(&#8216;choosespain&#8217;)<br />
　　['choose', 'spain']</p></blockquote>
<p>　　让我们从第一步概率语言模型开始。一个单词序列的概率是给定单词的上下文——在这里是前面的所有的单词——每一个单词概率之积。用数学公式可以如下表达：</p>
<blockquote><p>　　P(W1:n) = Πk=1:nP(Wk | W1:k–1)</p></blockquote>
<p>　　我们没有足够的数据来准确计算这个概率，所以我们可以通过使用小一点的语料库来近似地计算这个概率（公式）。由于Google语言模型最大到5元(5-grams),所以我们可以使用5-grams来计算整个单词序列的概率，故一个n-word序列的概率等于给定前4个单词（并不是前面所有单词）每一个单词的概率之积。<br />
　　关于5元语言模型，存在三个困难。首先，Google语言模型中5-gram数据大约有30G，一般机器的内存是无法加载的。其次，很多5元短语的计数为0，我们需要一些方法来回退（或者平滑），既使用较短的（短语）序列来估计这些计数为0的5元短语概率。第三，候选短语的搜索空间将会很大，因为其所依赖的单词数目达到4个。当然，只要想点办法，所有的这三个困难都是可以克服的。但是我们可以先简化一下这个问题，仅考虑一元(unigram)语言模型，这样就能立即解决这三个问题。利用一元语言模型，单词序列的概率就等于每一个单词自身（没有依赖）概率之积，而每一个单词概率与其他单词概率是独立的： </p>
<blockquote><p>　　 P(W1:n) = Πk=1:nP(Wk)</p></blockquote>
<p>　　相应的，我们来看&#8217;wheninrome&#8217;这个分词例子，它有很多候选分词短语，譬如“when in rome”，利用一元语言模型，只需计算P(when) × P(in) × P(rome)。如果这个乘积结果比其他任何候选短语的乘积都高，那么“when in rome”就是最好的分词结果。<br />
　　一个包含n个字符的字符串有2^(n-1)种不同的分词方案（在字符之间有n-1个位置，每一个位置既可以作为单词边界也可以不作为边界）。因此，对于字符串“ wheninthecourseofhumaneventsitbecomesnecessary”,有35万亿(trillion)种切分方法。但是可以肯定，你能够在几秒钟之内找到正确的分词形式，并且不需要枚举所有的候选分词短语。首先扫描“w”,然后是”wh”以及”whe”,并且拒绝这些不大可能的“单词”，但是接受“when”作为可能的“单词”。之后再扫描剩余的部分，与前面同理，依次找到可能的分词，并最终找到最佳的分词短语。一旦我们对问题做了简化，既每一个单词相互是独立的，那么也就意味着我们不需要考虑单词之间的所有组合。<br />
　　这给了我们一个大致的分词函数轮廓：考虑将字符串切分成首词和剩余字符串所有分法（可以任意限定最长的单词长度，例如，L＝20字符）。对于每一种可能的分法，搜索剩余字符串最好的切分方法。对于所有的候选切分， P(first) × P(remaining) 乘积最高的那一个就是最佳分法。</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%8D3">分词3</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-统计语言模型的应用三分词2">http://www.52nlp.cn/beautiful-data-统计语言模型的应用三分词2</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='Permanent Link: 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%8d7' rel='bookmark' title='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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%8d8' rel='bookmark' title='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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='Permanent Link: 微软：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%8d2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Beautiful Data-统计语言模型的应用三：分词1</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%8d1</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%8d1#comments</comments>
		<pubDate>Fri, 26 Feb 2010 15:43:45 +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[分词]]></category>
		<category><![CDATA[统计语言模型]]></category>

		<guid isPermaLink="false">http://www.52nlp.cn/?p=3091</guid>
		<description><![CDATA[　　本节我们开始《Beautiful Data》中的“Word Segmentation”之旅，虽然Peter Norvig大牛从中文分词的需求讲起，但本节事实上讲得是英文分词，毕竟Google语言模型是以英文语料库为基础的，用中文分词举例Google语言模型就无用武之地了。一般说来，英文是不需要分词的，基本上tokenization就够了。但是某些时候，譬如英文网址（URLs)就没有空格，对于搜索引擎或者文字处理程序来说正确的分词就很重要了。不过，无论英文分词还是中文分词，利用统计语言模型来分词的思想本质是一样的。
　　首先来看一个例子，如“choosespain.com”，这是一个希望说服你“choose Spain”(选择西班牙）作为旅游目的地的网站。如果被分成“chooses pain”（选择痛苦），其结果可想而知。对于人类来说，凭借多年的经验，做出正确的分词应该没什么问题，但是对于计算机，将这些经验进行编码几乎是不可能的任务。不过还是有“捷径”可以走的：对于这两条候选的分词短语，在Google语言模型中的二元（bigram）表中进行查找，其中“choose Spain”出现了3,210次，而”chooses pain”则没有出现，这也就意味着”chooses pain”在Google的trillion-word语料库中出现的次数少于40次。因此，“choose Spain”至少有80倍的可能作为正确的分词结果。
　　再来看另一个例子，假设存在这样一个未分词的短语“insufficientnumbers”，如果我们不考虑Google语言模型里的单词的大小写问题，以下两种分法的计数结果是：
　　insufficient numbers 20751
　　in sufficient numbers 32378
　　虽然后者比前者多了大约50％，但是相对于Google语料库的规模，区别不是很明显，尽管我们可以猜测哪一个是正确的分词结果，却不能肯定这个猜测。对于不确定的问题，我们没有任何办法计算出一个百分百正确的答案，也没有一个完整的模型使得只有一个结果是正确的，事实上对于人类专家来说也是如此。不过，对于解决这类不确定的问题，还是有一套既定的方法：
　　1.定义一个概率模型。我们不能通过定义所有的要素（语义、语法、词汇等）来决定“choose Spain”是否是一个更好的候选分词结果，但是可以通过一个简化的模型给出一个近似的概率。对于较短的候选短语如“choose Spain”,可以通过在语料库数据中查找n-gram次数的方式来决定其概率。对于较长的候选短语，可以通过将其分解为较小短语的方式来得到相关的概率。至于未登录词，也可以通过一些方法估计其概率。这里的关键点就是定义一个语言模型(language model)——一个覆盖了大多数字符串的某种语言的概率分布——并且通过语料库数据学习相关的参数，然后利用该模型来决定每一个候选短语的概率。
　　2.枚举候选短语。我们不能确定”insufficient numbers”或者”in sufficient numbers”中哪一个是更可能的分词短语，但是我们可以将这两个均看作是候选短语，甚至““in suffi cient numb ers”也是候选。在这一步里，我们暂时不做判断，而是尽可能多的枚举各种可能的候选短语，或者仔细的挑选样本。
　　3.选择最可能的候选短语。对于每一个候选短语，利用语言模型计算其概率，然后选择获得最高概率的那一个短语作为最佳结果。
　　如果你喜欢数学公式，那么这个方法可以定义为：
　　　best = argmax c∈candidates P(c)
　　或者，如果你喜欢计算机编码（我们将使用Python)，也可以如下描述：
　　　best = max(c in candidates, key=P)
未完待续：分词2
注：原创文章，转载请注明出处“我爱自然语言处理”：www.52nlp.cn
本文链接地址：http://www.52nlp.cn/beautiful-data-统计语言模型的应用三分词1










相关文章:Beautiful Data-统计语言模型的应用三：分词7
Beautiful Data-统计语言模型的应用三：分词3
Beautiful Data-统计语言模型的应用三：分词2
Beautiful Data-统计语言模型的应用三：分词5
Beautiful Data-统计语言模型的应用三：分词6
Beautiful Data-统计语言模型的应用三：分词8
Beautiful Data-统计语言模型的应用三：分词4
Beautiful Data-统计语言模型的应用一：缘起
Beautiful Data-统计语言模型的应用二：背景
MIT自然语言处理第三讲：概率语言模型（第一部分）



相关文章:<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='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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%8d5' rel='bookmark' title='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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%8d4' rel='bookmark' title='Permanent Link: 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%80%e7%bc%98%e8%b5%b7' rel='bookmark' title='Permanent Link: 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='Permanent Link: Beautiful Data-统计语言模型的应用二：背景'>Beautiful Data-统计语言模型的应用二：背景</a></li>
<li><a href='http://www.52nlp.cn/mit-nlp-third-lesson-probabilistic-language-modeling-first-part' rel='bookmark' title='Permanent Link: MIT自然语言处理第三讲：概率语言模型（第一部分）'>MIT自然语言处理第三讲：概率语言模型（第一部分）</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>　　本节我们开始《Beautiful Data》中的“Word Segmentation”之旅，虽然Peter Norvig大牛从中文分词的需求讲起，但本节事实上讲得是英文分词，毕竟Google语言模型是以英文语料库为基础的，用中文分词举例Google语言模型就无用武之地了。一般说来，英文是不需要分词的，基本上tokenization就够了。但是某些时候，譬如英文网址（URLs)就没有空格，对于搜索引擎或者文字处理程序来说正确的分词就很重要了。不过，无论英文分词还是中文分词，利用统计语言模型来分词的思想本质是一样的。<span id="more-3091"></span><br />
　　首先来看一个例子，如“choosespain.com”，这是一个希望说服你“choose Spain”(选择西班牙）作为旅游目的地的网站。如果被分成“chooses pain”（选择痛苦），其结果可想而知。对于人类来说，凭借多年的经验，做出正确的分词应该没什么问题，但是对于计算机，将这些经验进行编码几乎是不可能的任务。不过还是有“捷径”可以走的：对于这两条候选的分词短语，在Google语言模型中的二元（bigram）表中进行查找，其中“choose Spain”出现了3,210次，而”chooses pain”则没有出现，这也就意味着”chooses pain”在Google的trillion-word语料库中出现的次数少于40次。因此，“choose Spain”至少有80倍的可能作为正确的分词结果。<br />
　　再来看另一个例子，假设存在这样一个未分词的短语“insufficientnumbers”，如果我们不考虑Google语言模型里的单词的大小写问题，以下两种分法的计数结果是：</p>
<blockquote><p>　　insufficient numbers 20751<br />
　　in sufficient numbers 32378</p></blockquote>
<p>　　虽然后者比前者多了大约50％，但是相对于Google语料库的规模，区别不是很明显，尽管我们可以猜测哪一个是正确的分词结果，却不能肯定这个猜测。对于不确定的问题，我们没有任何办法计算出一个百分百正确的答案，也没有一个完整的模型使得只有一个结果是正确的，事实上对于人类专家来说也是如此。不过，对于解决这类不确定的问题，还是有一套既定的方法：<br />
　　1.<strong>定义一个概率模型</strong>。我们不能通过定义所有的要素（语义、语法、词汇等）来决定“choose Spain”是否是一个更好的候选分词结果，但是可以通过一个简化的模型给出一个近似的概率。对于较短的候选短语如“choose Spain”,可以通过在语料库数据中查找n-gram次数的方式来决定其概率。对于较长的候选短语，可以通过将其分解为较小短语的方式来得到相关的概率。至于未登录词，也可以通过一些方法估计其概率。这里的关键点就是定义一个语言模型(language model)——一个覆盖了大多数字符串的某种语言的概率分布——并且通过语料库数据学习相关的参数，然后利用该模型来决定每一个候选短语的概率。<br />
　　2.<strong>枚举候选短语</strong>。我们不能确定”insufficient numbers”或者”in sufficient numbers”中哪一个是更可能的分词短语，但是我们可以将这两个均看作是候选短语，甚至““in suffi cient numb ers”也是候选。在这一步里，我们暂时不做判断，而是尽可能多的枚举各种可能的候选短语，或者仔细的挑选样本。<br />
　　3.<strong>选择最可能的候选短语</strong>。对于每一个候选短语，利用语言模型计算其概率，然后选择获得最高概率的那一个短语作为最佳结果。<br />
　　如果你喜欢数学公式，那么这个方法可以定义为：<br />
　　　best = argmax c∈candidates P(c)<br />
　　或者，如果你喜欢计算机编码（我们将使用Python)，也可以如下描述：<br />
　　　best = max(c in candidates, key=P)</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%8D2">分词2</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-统计语言模型的应用三分词1">http://www.52nlp.cn/beautiful-data-统计语言模型的应用三分词1</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='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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%8d5' rel='bookmark' title='Permanent Link: 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='Permanent Link: 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='Permanent Link: 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%8d4' rel='bookmark' title='Permanent Link: 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%80%e7%bc%98%e8%b5%b7' rel='bookmark' title='Permanent Link: 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='Permanent Link: Beautiful Data-统计语言模型的应用二：背景'>Beautiful Data-统计语言模型的应用二：背景</a></li>
<li><a href='http://www.52nlp.cn/mit-nlp-third-lesson-probabilistic-language-modeling-first-part' rel='bookmark' title='Permanent Link: MIT自然语言处理第三讲：概率语言模型（第一部分）'>MIT自然语言处理第三讲：概率语言模型（第一部分）</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%8d1/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
