<?xml version="1.0" encoding="UTF-8"?><!-- generator="WordPress/2.8" -->
<rss version="0.92">
<channel>
	<title>琥珀春秋</title>
	<link>http://amberlife.net</link>
	<description>No pain No gain.</description>
	<lastBuildDate>Sun, 25 Dec 2011 16:47:29 +0000</lastBuildDate>
	<docs>http://backend.userland.com/rss092</docs>
	<language>en</language>
	
	<item>
		<title>R语言读书笔记</title>
		<description>最近项目需要，所以要学习下R语言，对于数学基础不好的我，着实有点痛苦，现在再次看到线性代数和概率统计的东西着实让我难受，天下无难事，努力做好最重要。
下面是我自己学习R语言的一些笔记，不是很完善，如果想系统学习R语言，建议先在网上找一本完整的学习手册进行学习。这是我个人的一些理解，不正确的地方，还望大家共同讨论。
1 索引向量：在R语言中，向量vector是个很常见的数据结构，回忆下线代这门课，就应该知道向量代表什么了。而索引向量，所起的作用就是当你需要获取一个向量的子集的时候，可以通过在向量名后面的方括号中加入索引向量而得到。简单的讲，就像是我们编程中用得数组，比如向量A，要获取向量A的第1，2,3个元素，那么写成Asubset&#60;- A[1:3]即可。1:3就是代表1到3的索引向量。
索引向量可以是下面的四种形式。
1 逻辑向量 。当索引向量是逻辑向量时，索引向量必须同被挑选元素的向量长度一致，向量中对应索引向量为true的元素被选中。

2 正整数向量。索引向量必须是[1,2,...,length(x)]的子向量，注意从1开始

3负整数向量。指定被排除的元素而不是包括进来的元素。

4 字符串向量，当一个向量中的元素可以用names属性来识别的时候，字符串向量很有用。

2 R语言对象及它的模式和属性。

在R中，任何被操作的实体都被称之为对象。

实数，向量（字符型，逻辑型）都被称为“原子型”对象。这是因为它们的元素都是同样的类型。

向量：必须保证所有的元素都是一样的模式

列表：可以为任何模式的对象的有序序列

函数、表达式：具有递归结构的对象。

在对象中，有两个内在的属性，是任何对象都有的。他们就是对象的模式（mode）和对象的长度（length）。

对象的属性，可以通过attributes(object)获取。

对象模式（mode）可以通过下面的方式转换：

as.character(obj) 将obj对象模式转换成字符型

as.integer(obj) 将obj对象模式转换成整型。

对象长度的转换。

增加长度：对象长度可以通过给定一个不在先前索引范围内的索引值而得到改变。例如：

e&#60;-character()  给e赋一个空的字符型对象，显然这个时候length(e)是等于1的。

e[3]&#60;-'a' ; length(e)=3 .当给e一个不再先前索引范围内的索引值（先前索引范围为1，现在索引反胃为1,2,3）这时候，对象e的长度就为3了。

删减长度：对象长度的减少，只需要做相应的赋值操作即可。例如：

a&#60;-a[2*1:5]，由于“：”的优先级高，所以此时的索引向量为[2,4,6,8,10].此操作相当于只保留a对象中偶数索引位[2,4,6,8,10]的值。所以此时length(a)=5.

我们继续操作a这个对象，length(a)&#60;-3 .这样就把a的长度删减到3了。这个操作同样也适用于扩充对象.

设置或读取对象属性

attributes(object) 读取对象非内在属性。

attr(object,name) 读取或设置属性名为name的属性值

attr(Z,'dim')&#60;-c(10,10).对象Z有一个dim的属性，dim属性被赋值为10*10.它表示的意思是Z对象可以被当做一个10*10的矩阵，（dim属性表示一个对象为一个矩阵） </description>
		<link>http://amberlife.net/2011/12/r%e8%af%ad%e8%a8%80%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0/</link>
			</item>
	<item>
		<title>搜索引擎读书笔记－nutch 和heritrix的区别和联系</title>
		<description>Heritrix 和 Nutch。二者均为Java开源框架，Heritrix 是 SourceForge上的开源产品，Nutch为Apache的一个子项目，它们都称作网络爬虫/蜘蛛（ Web Crawler），它们实现的原理基本一致：深度遍历网站的资源，将这些资源抓取到本地，使用的方法都是分析网站每一个有效的URI，并提交Http请求，从而获得相应结果，生成本地文件及相应的日志信息等。
Heritrix 是个 "archival crawler" -- 用来获取完整的、精确的、站点内容的深度复制。包括获取图像以及其他非文本内容。抓取并存储相关的内容。对内容来者不拒，不对页面进行内容上的修改。重新爬行对相同的URL不针对先前的进行替换。爬虫通过Web用户界面启动、监控、调整，允许弹性的定义要获取的URL。
二者的差异：
Nutch 只获取并保存可索引的内容。Heritrix则是照单全收。力求保存页面原貌
Nutch 可以修剪内容，或者对内容格式进行转换。
Nutch 保存内容为数据库优化格式便于以后索引；刷新替换旧的内容。而Heritrix 是添加(追加)新的内容。
Nutch 从命令行运行、控制。Heritrix 有 Web 控制管理界面。
Nutch 的定制能力不够强，不过现在已经有了一定改进。Heritrix 可控制的参数更多。 </description>
		<link>http://amberlife.net/2011/12/%e6%90%9c%e7%b4%a2%e5%bc%95%e6%93%8e%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0%ef%bc%8dnutch-%e5%92%8cheritrix%e7%9a%84%e5%8c%ba%e5%88%ab%e5%92%8c%e8%81%94%e7%b3%bb/</link>
			</item>
	<item>
		<title>搜索引擎lucene + heritrix读书笔记</title>
		<description>索引文件格式：

.fnm格式：包含Document中的所有field名称

.fdt格式： 用于存储具有Store.YES属性的field的数据

.fdx格式：是一个索引，用于存储Document在.fdt的位置

.tis格式：用于存储分词后的词条

.tii格式：是.tis对应的索引文件，标明每个.tis文件中的词条的位置

.cfs 复合索引格式. 当IndexWriter的属性useCompoundFile为true时，就是使用复合索引格式来保存索引。

索引建立过程中的关键组件：IndexWriter， IndexReader，IndexModifer </description>
		<link>http://amberlife.net/2011/12/%e6%90%9c%e7%b4%a2%e5%bc%95%e6%93%8elucene-heritrix%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0/</link>
			</item>
	<item>
		<title>HTML协议系统学习详解</title>
		<description>






1. 基础概念篇
1.1 介绍
HTTP是Hyper Text Transfer Protocol（超文本传输协议）的缩写。它的发展是万维网协会（World Wide Web Consortium）和Internet工作小组IETF（Internet Engineering Task Force）合作的结果，（他们）最终发布了一系 列的RFC，RFC 1945定义了HTTP/1.0版本。其中最著名的就是RFC 2616。RFC 2616定义了今天普遍使用的一个版本——HTTP 1.1。 
HTTP协议（HyperText Transfer Protocol，超文本传输协议）是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效，使网络传输减少。它不仅保证计算 机正确快速地传输超文本文档，还确定传输文档中的哪一部分，以及哪部分内容首先显示(如文本先于图形)等。
HTTP是一个应用层协议，由请求和响应构成，是一个标准的客户端服 务器模型。HTTP是一个无状态的协议。


1.2 在TCP/IP协议栈中的位置
HTTP协议通常承载于TCP协 议之上，有时也承载于TLS或SSL协议层之上，这个时候，就成了我们常说的HTTPS。如下图所示：

默认HTTP的端口 号为80，HTTPS的端口号为443。

1.3 HTTP的请求响应模型
HTTP协议永远都是客户端发起请求，服务器回送响应。见下图：

这样就限制了使用HTTP协议，无法实现在客户端没有发起请求的时候，服务器将消息推送给客户端。
HTTP协议是一个无状态的协议，同一个客户端的这次请求和上次请求 是没有对应关系。


 
 
 

1.4 工作流程
一次HTTP操作称为一个事务，其工作过程可分为四步：
1）首先客户机与服务器需要建立连接。只要单击某个超级链接，HTTP的工作开始。
2）建立连接后，客户机发送一个请求给服务器，请求方式的格式为：统一资源标识符（URL）、协议版本号，后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
3）服务器接到请求后，给予相应的响应信息，其格式为一个状态行，包括信息的协议版本号、一个成功或错 误的代码，后边是MIME信息包括服务器信息、实体信息和可能的内容。
4）客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上，然后客户机与服务器断开连接。
如果在以上过程中的某一步出现错误，那么产生错误的信息将返回到客户端，有显示屏输 出。对于用户来说，这些过程是由HTTP自己完成的，用户只要用鼠标点击，等待信息显示就可以了。

1.5 使用Wireshark抓TCP、http包
打开Wireshark，选择工具栏上的“Capture”-&#62;“Options”，界面选择如图1所 示：


图1 设置Capture选项

一般读者只需要选择最上边的下拉框，选择合适的Device，而后点击“Capture Filter”，此处选择的是“HTTP TCP port（80）”，选择后 点击上图的“Start”开始抓包。


图2 选择Capture Filter

例如在浏览器中打开http://image.baidu.com/，抓包如图3所示：


图3   抓包
在上图中，可清晰的看到客户端浏览器（ip为192.168.2.33）与服务器的交互过程：
1）No1：浏览器（192.168.2.33）向服务器（220.181.50.118）发出连接请求。此为TCP三次握手第一步，此时从图中可以看出，为SYN，seq:X （x=0）
2）No2：服务器（220.181.50.118）回应了浏览器（192.168.2.33）的请求，并要求确认，此时为：SYN，ACK，此时seq：y（y为0），ACK：x+1（为1）。此为三次握手的第二步；
3）No3：浏览器（192.168.2.33）回应了服务器（220.181.50.118）的确认，连接成功。为：ACK，此时seq：x+1（为1），ACK：y+1（为1）。此为三次握手的第三步；
4）No4：浏览器（192.168.2.33）发出一个页面HTTP请求；
5）No5：服务器（220.181.50.118）确认；
6）No6：服务器（220.181.50.118）发送数据；
7）No7：客户端浏 览器（192.168.2.33）确认；
8）No14：客户端 （192.168.2.33）发出一个图片HTTP请求；
9）No15：服务器 （220.181.50.118）发送状态响应码200 OK
……

1.6 头域
每个头域由一个域名，冒号（:）和域值三部分组成。域名是大小写无关的，域值前可以添加任何数量的空格符，头域可以被扩展为多 行，在每行开始处，使用至少一个空格或制表符。

在抓包的图中，No14点开可看到如图4所 示：


图4 http请求消息

回应的消息如图5所示：


图5 http状态响应信息

1.6.1 host头域
Host头域指定请求资源的Intenet主机和端口号，必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域，否则系统会以400状态码返回。

图5中host那行为：


1.6.2 Referer头域
Referer头域允许客户端指定请求uri的源资源地址，这可以允许服务器生成回退链表，可用来登陆、优化cache等。他也允许废除的或错误的连接由于维护的目的被追踪。如果请求的uri没有自己的uri地址，Referer不能被发送。如果指定的是部分uri地址，则此地址应该是一个相对地址。

在图4中，Referer行 的内容为：


1.6.3 User-Agent头域
User-Agent头域的内容包含发出请求的用户信息。

在图4中，User-Agent行的内容为：


 
 ...</description>
		<link>http://amberlife.net/2011/12/html%e5%8d%8f%e8%ae%ae%e7%b3%bb%e7%bb%9f%e5%ad%a6%e4%b9%a0%e8%af%a6%e8%a7%a3/</link>
			</item>
	<item>
		<title>人在不知不觉中，走向伪善</title>
		<description>昨天晚上晚饭后，看了黑泽明的《罗生门》。起初看完这部电影后，好困好困 。 
感觉剧情在重复，好无聊啊。 
然而今天一天，剧情中的场景，却一遍一遍的在这 个世界发生着。 
方舟子打假，讲李开复造假。李开复说自己没造假。新闻后面的评论足以让人无语，各种说辞都有。有说李开复在google时，如何挤压同事的。说李开复是CIA在中国的间谍，说wikipeak上有爆料李开复的。有骂方舟子是个疯狗的，有讲方舟子应该去打官员造假去。总是七七八八，魑魅魍魉。
方宏进和老婆的离婚案在网上闹得沸沸扬扬，把方宏进的女儿也拉出来当主角了。双方讲的话，可谓是完全相反的。
人心最深的地方，埋藏了多少阴暗而不可告人的秘密。幽暗破旧的罗生门下，是个鬼魂都觉得害怕的地方
人在不知不觉中，走向伪善，企图以此来掩盖自我的罪恶。魑魅魍魉，每个字都有个鬼字，确是人丑恶的最好体现。
今天还有个新闻足以让人内心感到慰藉，
美国宇航局证实发现首颗适合居住类地行星----开普勒-22b。




 </description>
		<link>http://amberlife.net/2011/12/%e4%ba%ba%e5%9c%a8%e4%b8%8d%e7%9f%a5%e4%b8%8d%e8%a7%89%e4%b8%ad%ef%bc%8c%e8%b5%b0%e5%90%91%e4%bc%aa%e5%96%84/</link>
			</item>
	<item>
		<title>131hours  to 37mins</title>
		<description>上周到这周四一直都在解决我的mapreduce程序的模式问题，应该说写的这个mapreduce程序经历过三次改变，就叫做v1，v2，v3三个版本吧。

v1版本出来后，在写入hbase中的时候，key值没有经过任何的处理，完全按照unicode码的方式存储。起初认为这个过程导致key值的分布过于紧密，因此考虑用md5加密对key值进行映射，使key值离散。然而在v2效率更低，原因猜测是key值在hbase中存储时，还是要按照顺序排放，那么的话就存在大量的io操作，再者经过md5加密后，key值变成了32位的字符串，可能也加大了寻找key值的难度。

第二：程序中存在大量的临时变量，在集群的几千万条记录中来回创建，回收内存，也是会耗费大量的时间和内存。虽然java存在垃圾回收机制，但是也不完美。所以，在从v1到v2的变化中，主要在于代码的优化，能够用静态变量来代替的就用静态变量来处理，以减少变量的来回创建。

v2版本的运行时间是131hours，这简直是无法忍受的。因此必须改变，必须从编程模型中改变。在v1，v2版本中，只是简单的运用了mapreduce这一编程模型中的map部分，对reduce部分没有运用，起初的想法也很简单，从一个表中读取数据，处理过后，放到另外一个表中，很简单。只需要运用到mapreduce分布式这一个特点就可以解决。事实证明，当时的想法过于简单了。 当涉及大量的io操作后，通过将数据以块的形式写入表中，而不是记录的方式，来减少io操作。这是我当时考虑的第一点。后来就想到利用mapreduce这一整个模型来计算。这一点，我和国华师兄不谋而合。

下面就把我的编程模型写下来：

新的优化方案，要减少io操作。涉及mapper,combiner,reducer整个过程，之前的方案只运用了mapper。

mapper设计思路：

1  从unindexedPapers 表中读取每篇paper的authors

2  进行分词

3  以名为key值（经SHA－1加密）, 姓＋次数（num表示） 作为value 作为输出。 list()

combiner思路：

1  以mapper输出作为输入

2  key2值相同，value2值也相同的，将num相加；key2值相同，value2值不同的，将其组合成一个集合即可

3  将 作为输出

reducer思路

1 将combiner传来的数据再次进行类似的combiner操作

2 从hbase中，以key2作为关键字从hbase中获取records，进行计算合并。

3 计算合并结果，再次插入hbase中。

今天早上在集群上运行这个程序后，最终以37mins中在6台电脑的集群上跑完了3000万条记录。证明方案是可行的。

早上小高兴了一把，不过随之而来的就是以前要考虑的一个问题，如何给出一个合理的数学公式，设计出一个合理的权重出来。下一阶段，要把概率统计的课本在翻看下，和国华师兄在好好分析分析，找出点idea，设计一个合理的数学公式出来。

科研的路真是不容易，各种绊脚石都存在，一一克服吧。 </description>
		<link>http://amberlife.net/2011/11/131hours-to-37mins/</link>
			</item>
	<item>
		<title>贪心算法的基本要素</title>
		<description>贪心算法通过一系列的选择来得到一个问题的解。它所作的每一个选择都是当前状态下某种意义的最好选择，即贪心选择。希望通过每次所作的贪心选择导致最终结果是问题的一个最优解。这种启发式的策略并不总能奏效，然而在许多情况下确能达到预期的目的。解活动安排问题的贪心算法就是一个例子。下面我们着重讨论可以用贪心算法求解的问题的一般特征。

 对于一个具体的问题，我们怎么知道是否可用贪心算法来解此问题，以及能否得到问题的一个最优解呢?这个问题很难给予肯定的回答。但是，从许多可以用贪心算法求解的问题中

我们看到它们一般具有两个重要的性质：贪心选择性质和最优子结构性质。

1．贪心选择性质

 所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择，即贪心选择来达到。这是贪心算法可行的第一个基本要素，也是贪心算法与动态规划算法的主要区别。在动态规划算法中，每步所作的选择往往依赖于相关子问题的解。因而只有在解出相关子问题后，才能作出选择。而在贪心算法中，仅在当前状态下作出最好选择，即局部最优选择。然后再去解作出这个选择后产生的相应的子问题。贪心算法所作的贪心选择可以依赖于以往所作过的选择，但决不依赖于将来所作的选择，也不依赖于子问题的解。正是由于这种差别，动态规划算法通常以自底向上的方式解各子问题，而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择，每作一次贪心选择就将所求问题简化为一个规模更小的子问题。

对于一个具体问题，要确定它是否具有贪心选择性质，我们必须证明每一步所作的贪心选择最终导致问题的一个整体最优解。通常可以用我们在证明活动安排问题的贪心选择性质时所采用的方法来证明。首先考察问题的一个整体最优解，并证明可修改这个最优解，使其以贪心选择开始。而且作了贪心选择后，原问题简化为一个规模更小的类似子问题。然后，用数学归纳法证明，通过每一步作贪心选择，最终可得到问题的一个整体最优解。其中，证明贪心选择后的问题简化为规模更小的类似子问题的关键在于利用该问题的最优子结构性质。

2．最优子结构性质

 当一个问题的最优解包含着它的子问题的最优解时，称此问题具有最优子结构性质。问题所具有的这个性质是该问题可用动态规划算法或贪心算法求解的一个关键特征。在活动安排问题中，其最优子结构性质表现为：若a是对于正的活动安排问题包含活动1的一个最优解,则相容活动集合a’=a—{1}是对于e’={i∈e:si≥f1}的活动安排问题的一个最优解。

3．贪心算法与动态规划算法的差异

 贪心算法和动态规划算法都要求问题具有最优子结构性质，这是两类算法的一个共同点。但是，对于一个具有最优子结构的问题应该选用贪心算法还是动态规划算法来求解?是不是能用动态规划算法求解的问题也能用贪心算法来求解?下面我们来研究两个经典的组合优化问题，并以此来说明贪心算法与动态规划算法的主要差别。 </description>
		<link>http://amberlife.net/2011/11/%e8%b4%aa%e5%bf%83%e7%ae%97%e6%b3%95%e7%9a%84%e5%9f%ba%e6%9c%ac%e8%a6%81%e7%b4%a0/</link>
			</item>
	<item>
		<title>英语短语</title>
		<description>由于应对英语听力测试，这两天狂听了4units的英语听力，加上今天的英语课讲到的earth的话题，回答下同学的问题：
what warnings does the 2012 give to you?

I think we should keep a respective mind to our planet. we are a grain of sand in the whole universe.
we should refuse to the wars ,which I think the biggest evil in the world .
everyone of us should insist on a vegetarian. ...</description>
		<link>http://amberlife.net/2011/11/%e8%8b%b1%e8%af%ad%e7%9f%ad%e8%af%ad/</link>
			</item>
	<item>
		<title>中文分词技术（转载）</title>
		<description>最近和国华师兄一起做的项目提出一种设想。通过将中文姓名进行切分，来为每一个姓名增加一个权重，从而利于后期解决学者关系中的重名问题。中文姓名目前能够通过一定的规则加以区分，目前问题出现在对于一些复姓的处理上，中国有很多很怪的复姓，举个例子：“周阳”。这是一个复姓。但是我想几乎没人会认为这个一个复姓。这样就出现一个问题，如果一个人叫“周阳明”，那么是“周阳，明”还是“周，阳明”呢？基于习惯，我想更多的人会选择后者。那天的讨论，我还记忆犹新，发散到新疆，西藏，日本等地的人名。今天叶小平教授说，分词不可能达到100%准确。这话讲的有道理。下面附上一篇博文，这里面我用到了第一种基于规则和基于统计的分词方法，同时我加入了一个模糊集，以保证匹配的正确性。
一、什么是分词：
    分词就是将连续的字（词）序列按照一定的规范重新组合成词序列的过程。《信息处理用现代汉语分词规范》中对分词的定义是：从信息处理需要出发，按照特定的规范，对汉语按分词单位进行划分的过程。对于英文分词，只要简单地以空格为分界符就能很好地把句子分析出来。这是由于英文是以词为单位的。不同于英文，计算机对中文分词时，由于中文句子中词与词之间是没有空格的，而且，两个字组合起来看似是一个词在句子中未必是一个词，所以计算机想要识别出中文句子中的词，就必须采用不同于英文分词的新技术。
 
 
二、分词出现的必要性:
1)人与计算机的沟通的基础。
    由于中文文本的字与字之间的连续性，即汉语文本中词与词之间却没有明确的分隔标记，计算机无法识别出中文文本中哪些汉字串组合成词，导致处理中文信息无法直接理解中文的意义。所以，中文信息处理就必须比西文信息处理多了中文分词这一基本的步骤。汉语的中文信息处理就是要“用计算机对汉语的音、形、义进行处理”。而“词是最小的能够独立活动的有意义的语言成分”。
2）中文信息处理的基础性工作。
    互联网的出现，彻底改变了人们对世界的认识;获得信息的成本越来越低，时间越来越短，信息量也越来越大.在信息贫泛与信息爆炸同时存在的时候，伴着信息几何级增长，如何对海量数据的处理，快速的定位到资源，是信息化时代不可缺少的部分。由此发展而来的，信息检索技术，文本挖掘，都是依赖于分词技术，分词技术还广泛应用于，文本校对、机器翻译、语音识别等领域。
 
 
三、分词处理技术：
    目前对汉语分词方法的研究主要有三个方面：基于规则的分词方法、基于统计的分词方法和基于理解的分词方法。
 
1）基于规则的分词方法，这种方法又叫做机械分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行匹配,若在词典中找到某个字符串,则匹配成功(识别出一个词) 。常用的方法：最小匹配算法(Minimum Matching)，正向（逆向）最大匹配法(Maximum Matching)，逐字匹配算法,神经网络法、联想一回溯法，基于N-最短路径分词算法,以及可以相互组合，例如,可以将正向最大匹配方法和逆向最大匹配方法结合起来构成双向匹配法等。目前机械式分词占主流地位的是正向最大匹配法和逆向最大匹配法.
    在所有的分词算法中，最早研究的是最小匹配算法(Minimum Matching)，该算法从待比较字符串左边开始比较，先取前两个字符组成的字段与词典中的词进行比较，如果词典中有该词，则分出此词，继续从第三个字符开始取两个字符组成的字段进行比较，如果没有匹配到，则取前3个字符串组成的字段进行比较，依次类推，直到取的字符串的长度等于预先设定的阈值，如果还没有匹配成功，则从待处理字串的第二个字符开始比较，如此循环。例如，“如果还没有匹配成功”，取出左边两个字组成的字段与词典进行比较，分出“如果”；再从“还”开始，取“还没”，字典中没有此词，继续取“还没有”，依次取到字段“还没有匹配”(假设阈值为5)，然后从“没”开始，取“没有”，如此循环直到字符串末尾为止。这种方法的优点是速度快，但是准确率却不是很高，比如待处理字符串为“中华人民共和国”，此匹配算法分出的结果为：中华、人民、共和国，因此该方法基本上已经不被采用 。
    基于字符串的最大匹配，这种方法现在仍比较常用，最大匹配(Maximum Matching)分为正向和逆向两种最大匹配，正向匹配的基本思想是：假设词典中最大词条所含的汉字个数为n个，取待处理字符串的前n个字作为匹配字段，查找分词词典。若词典中含有该词，则匹配成功，分出该词，然后从被比较字符串的n+1处开始再取n个字组成的字段重新在词典中匹配；如果没有匹配成功，则将这n个字组成的字段的最后一位剔除，用剩下的n一1个字组成的字段在词典中进行匹配，如此进行下去，直到切分成功为止。例如，待处理字符串为“汉字多为表意文字”，取字符串“汉语多为表”(假设比较的步长为5，本文步长step都取5)与词典进行比较，没有与之对应的词，去除“表”字，用字段“汉语多为”进行匹配，直至匹配到“汉语”为至，再取字符串“多为表意”，循环到切分出“文字”一词。目前，正向最大匹配方法作为一种基本的方法已被肯定下来，但是由于错误比较大，一般不单独使用。如字符串“处理机器发生的故障”，在正向最大匹配方法中会出现歧义切分，该字符串被分为：处理机、发生、故障，但是使用逆向匹配就能得到有效的切分。
    逆向最大匹配RMM(Reverse Directional Maximum Matching Method)的分词原理和过程与正向最大匹配相似，区别在于前者从文章或者句子(字串)的末尾开始切分，若不成功则减去最前面的一个字。比如对于字符串“处理机器发生的故障”，第一步，从字串的右边取长度以步长为单位的字段“发生的故障”在词典中进行匹配，匹配不成功，再取字段“生的故障”进行匹配，依次匹配，直到分出“故障”一词，最终使用RMM方法切分的结果为：故障、发生、机器、处理。该方法要求配备逆序词典。
    一般来说根据汉语词汇构成的特点，从理论上说明了逆向匹配的精确度高于正向匹配，汉语语句的特点一般中心语偏后。有研究数据,单纯使用正向最大匹配的错误率为1/ 169 ,单纯使用逆向最大匹配的错误率为1/245。实际应用中可以从下面几方面改进，同时采取几种分词算法，来提高正确率;改进扫描方式，称为特征扫描或标志切分,优先在待分析字符串中识别和切分出一些带有明显特征的词,以这些词作为断点,可将原字符串分为较小的串再来进机械分词,
从而减少匹配的错误率等。
 ...</description>
		<link>http://amberlife.net/2011/11/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d%e6%8a%80%e6%9c%af%ef%bc%88%e8%bd%ac%e8%bd%bd%ef%bc%89/</link>
			</item>
	<item>
		<title>hadoop+hbase安装成功。</title>
		<description>hadoop+hbase ，因为后来hbase的单独飞跃：从2.0跨越至9.0 。导致很多版本不兼容问题。再者还有hbase同OS的关系问题。
昨天在用换用debian6+hadoop0.21+hbase0.90.4 之后，成功安装。hadoop0.21+hbase0.90.4+ubuntu10这个组合却总是失败，不知道原因，在ubuntu下总是无法在hbase shell中创建表。
这里，感谢国华师兄的指导，和一起奋斗的进嘉同学。
 </description>
		<link>http://amberlife.net/2011/09/hadoophbase%e5%ae%89%e8%a3%85%e6%88%90%e5%8a%9f%e3%80%82/</link>
			</item>
</channel>
</rss>

