<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7336697442040034648</id><updated>2011-11-27T15:18:36.603-08:00</updated><title type='text'>Do Best Developer</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dobestdeveloper.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7336697442040034648/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dobestdeveloper.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Solo L</name><uri>http://www.blogger.com/profile/08279326134525121712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>2</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7336697442040034648.post-8403000630796497705</id><published>2010-12-21T01:27:00.000-08:00</published><updated>2010-12-21T21:47:35.709-08:00</updated><title type='text'>设计绘图系统</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ll_kCneBVRo/TRGQwyC9kxI/AAAAAAAAAOY/Xpcn0KmwoOI/s1600/001.gif"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 86px; height: 400px;" src="http://4.bp.blogspot.com/_ll_kCneBVRo/TRGQwyC9kxI/AAAAAAAAAOY/Xpcn0KmwoOI/s400/001.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5553378983266849554" /&gt;&lt;/a&gt;&lt;br /&gt;2007年8月我第一次考虑设计并实现了一个绘图系统。该系统使用图中的一些符号来绘制某些电力行业中要求的图形。系统要求运行在浏览器中，因此我选择了Flash，使用ActionScript3.0来开发。时至今日该系统已经使用了3年多。&lt;br /&gt;&lt;br /&gt;在这三年中需求不断的增长，其中一些直接暴露了设计中的局限性。我准备通过第二个版本来解决设计中的那些问题，下面是我的一些思考：&lt;br /&gt;&lt;br /&gt;1.Shape结构，使用组合模式。&lt;br /&gt;2.Shape大小调整&lt;br /&gt;3.Shape的放大和缩小&lt;br /&gt;4.Shape的布局&lt;br /&gt;5.shape的绘制&lt;br /&gt;6.Focus管理&lt;br /&gt;7.Shape的拖拽&lt;br /&gt;8.ContextMenu管理&lt;br /&gt;9.Event分派&lt;br /&gt;10.快捷键&lt;br /&gt;11.光标管理&lt;br /&gt;12.ScrollView&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7336697442040034648-8403000630796497705?l=dobestdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dobestdeveloper.blogspot.com/feeds/8403000630796497705/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7336697442040034648&amp;postID=8403000630796497705' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7336697442040034648/posts/default/8403000630796497705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7336697442040034648/posts/default/8403000630796497705'/><link rel='alternate' type='text/html' href='http://dobestdeveloper.blogspot.com/2010/12/blog-post.html' title='设计绘图系统'/><author><name>Solo L</name><uri>http://www.blogger.com/profile/08279326134525121712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ll_kCneBVRo/TRGQwyC9kxI/AAAAAAAAAOY/Xpcn0KmwoOI/s72-c/001.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7336697442040034648.post-2564086514795688809</id><published>2008-11-20T05:02:00.000-08:00</published><updated>2008-11-20T05:05:26.147-08:00</updated><title type='text'>MMSeg分词算法简述</title><content type='html'>&lt;p&gt;MMSeg只是实现了&lt;a href="http://chtsai.org/" title="Chih-Hao Tsai" target="_blank" style="color: rgb(0, 0, 204); "&gt;Chih-Hao Tsai&lt;/a&gt;的MMSEG算法，这是一个来源于网络的分词算法。我照抄了算法开始的部分：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;MMSEG: A Word Identification System for Mandarin Chinese Text Based on Two Variants of the Maximum Matching Algorithm&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Published: 1996-04-29&lt;br /&gt;Updated: 1998-03-06&lt;br /&gt;Document updated: 2000-03-12&lt;br /&gt;License: Free for noncommercial use&lt;br /&gt;Copyright   1996-2006 &lt;a href="http://chtsai.org/" title="Chih-Hao Tsai" target="_blank" style="color: rgb(0, 0, 204); "&gt;Chih-Hao Tsai&lt;/a&gt; (Email: hao520 at yahoo.com )&lt;/p&gt;&lt;p&gt;您可以在&lt;a href="http://technology.chtsai.org/" title="Chih-Hao Tsai's Technology Page" target="_blank" style="color: rgb(0, 0, 204); "&gt;Chih-Hao Tsai's Technology Page&lt;/a&gt;找到算法的原文。&lt;/p&gt;&lt;p&gt;我将依据自己的理解来简述MMSeg分词算法的基本原理，如有错误请不吝赐教。&lt;/p&gt;&lt;p&gt;首先来理解一下chunk，它是MMSeg分词算法中一个关键的概念。Chunk中包含依据上下文分出的一组词和相关的属性，包括长度(Length)、平均长度(Average Length)、标准差的平方(Variance)和自由语素度(Degree Of Morphemic Freedom)。我在下面列出了这4个属性的计算方法：&lt;/p&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr align="center"&gt;&lt;td&gt;属性&lt;/td&gt;&lt;td&gt;含义&lt;/td&gt;&lt;td&gt;代码位置&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;长度(Length)&lt;/td&gt;&lt;td&gt;chuck中各个词的长度之和&lt;/td&gt;&lt;td&gt;org.solol.mmseg.internal.Chunk.getLength()&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;平均长度(Average Length)&lt;/td&gt;&lt;td&gt;长度(Length)/词数&lt;/td&gt;&lt;td&gt;org.solol.mmseg.internal.Chunk.getAverageLength()&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;标准差的平方(Variance)&lt;/td&gt;&lt;td&gt;同数学中的定义&lt;/td&gt;&lt;td&gt;org.solol.mmseg.internal.Chunk.getVariance()&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;自由语素度(Degree Of Morphemic Freedom)&lt;/td&gt;&lt;td&gt;各单字词词频的对数之和&lt;/td&gt;&lt;td&gt;org.solol.mmseg.internal.Chunk.getDegreeOfMorphemicFreedom()&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt;表中的含义列可能有些模糊，最好参照MMSeg的源代码进行理解，代码所在的函数已经给出了。&lt;/p&gt;&lt;p&gt;Chunk中的4个属性采用Lazy的方式来计算，即只有在需要该属性的值时才进行计算，而且只计算一次。&lt;/p&gt;&lt;p&gt;其次来理解一下规则(Rule)，它是MMSeg分词算法中的又一个关键的概念。实际上我们可以将规则理解为一个过滤器(Filter)，过滤掉不符合要求的chunk。MMSeg分词算法中涉及了4个规则：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;规则1：取最大匹配的chunk (Rule 1: Maximum matching)&lt;/li&gt;&lt;li&gt;规则2：取平均词长最大的chunk (Rule 2: Largest average word length)&lt;/li&gt;&lt;li&gt;规则3：取词长标准差最小的chunk (Rule 3: Smallest variance of word lengths)&lt;/li&gt;&lt;li&gt;规则4：取单字词自由语素度之和最大的chunk (Rule 4: Largest sum of degree of morphemic freedom of one-character words)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;这4个规则分别位于org.solol.mmseg.internal.MMRule.java、org.solol.mmseg.internal.LAWLRule.java、org.solol.mmseg.internal.SVWLRule.java和org.solol.mmseg.internal.LSDMFOCWRule.java4个源文件中。之所以这样来处理是因为我们可以方便的增加规则和修改应用规则的顺序。&lt;/p&gt;&lt;p&gt;这4个规则符合汉语成词的基本习惯。&lt;/p&gt;&lt;p&gt;再次来理解一下两种匹配方式，简单最大匹配(Simple maximum matching)和复杂最大匹配(Complex maximum matching)。&lt;/p&gt;&lt;p&gt;简单最大匹配仅仅使用了规则1。&lt;/p&gt;&lt;p&gt;复杂最大匹配先使用规则1来过滤chunks，如果过滤后的结果多于或等于2，则使用规则2继续过滤，否则终止过滤过程。如果使用规则2得到的过滤结果多于或等于2，则使用规则3继续过滤，否则终止过滤过程。如果使用规则3得到的过滤结果多于或等于2，则使用规则4继续过滤，否则终止过滤过程。如果使用规则4得到的过滤结果多于或等于2，则抛出一个表示歧义的异常，否则终止过滤过程。&lt;/p&gt;&lt;p&gt;最后通过一个例句--研究生命起源来简述一下复杂最大匹配的分词过程。MMSeg分词算法会得到7个chunk，分别为：&lt;/p&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;编号&lt;/td&gt;&lt;td&gt;chunk&lt;/td&gt;&lt;td&gt;长度&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;研_究_生&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;研_究_生命&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;研究_生_命&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;研究_生命_起&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;研究_生命_起源&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;研究生_命_起&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;研究生_命_起源&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;使用规则1过滤后得到2个chunk，如下：&lt;/p&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;编号&lt;/td&gt;&lt;td&gt;chunk&lt;/td&gt;&lt;td&gt;长度&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;研究_生命_起源&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;研究生_命_起源&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;计算平均长度后为：&lt;/p&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;编号&lt;/td&gt;&lt;td&gt;chunk&lt;/td&gt;&lt;td&gt;长度&lt;/td&gt;&lt;td&gt;平均长度&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;研究_生命_起源&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;研究生_命_起源&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;使用规则2过滤后得到2个chunk，如下：&lt;/p&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;编号&lt;/td&gt;&lt;td&gt;chunk&lt;/td&gt;&lt;td&gt;长度&lt;/td&gt;&lt;td&gt;平均长度&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;研究_生命_起源&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;研究生_命_起源&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;计算标准差的平方后为：&lt;/p&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;编号&lt;/td&gt;&lt;td&gt;chunk&lt;/td&gt;&lt;td&gt;长度&lt;/td&gt;&lt;td&gt;平均长度&lt;/td&gt;&lt;td&gt;标准差的平方&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;研究_生命_起源&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;研究生_命_起源&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;4/9&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;使用规则3过滤后得到1个chunk，如下：&lt;/p&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;编号&lt;/td&gt;&lt;td&gt;chunk&lt;/td&gt;&lt;td&gt;长度&lt;/td&gt;&lt;td&gt;平均长度&lt;/td&gt;&lt;td&gt;标准差的平方&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;研究_生命_起源&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;匹配过程终止。最终取“研究”成词，以相同的方法继续处理“生命起源”。&lt;/p&gt;&lt;p&gt;分词效果:&lt;/p&gt;&lt;p&gt;Simple -&gt;研究生_命_起源_&lt;br /&gt;Complex-&gt;研究_生命_起源_&lt;br /&gt;Simple -&gt;研究生_教育_&lt;br /&gt;Complex-&gt;研究生_教育_&lt;/p&gt;&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt;Simple表示简单最大匹配的分词效果，Complex表示复杂最大匹配的分词效果。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7336697442040034648-2564086514795688809?l=dobestdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dobestdeveloper.blogspot.com/feeds/2564086514795688809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7336697442040034648&amp;postID=2564086514795688809' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7336697442040034648/posts/default/2564086514795688809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7336697442040034648/posts/default/2564086514795688809'/><link rel='alternate' type='text/html' href='http://dobestdeveloper.blogspot.com/2008/11/mmseg.html' title='MMSeg分词算法简述'/><author><name>Solo L</name><uri>http://www.blogger.com/profile/08279326134525121712</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
