﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-&amp;豪-文章分类-string match</title><link>http://www.cppblog.com/qywyh/category/7803.html</link><description>豪-&gt;blog</description><language>zh-cn</language><lastBuildDate>Sat, 09 Aug 2008 10:05:27 GMT</lastBuildDate><pubDate>Sat, 09 Aug 2008 10:05:27 GMT</pubDate><ttl>60</ttl><item><title>【转】数学之美 系列九 -- 如何确定网页和查询的相关性</title><link>http://www.cppblog.com/qywyh/articles/58388.html</link><dc:creator>豪</dc:creator><author>豪</author><pubDate>Sat, 09 Aug 2008 09:43:00 GMT</pubDate><guid>http://www.cppblog.com/qywyh/articles/58388.html</guid><wfw:comment>http://www.cppblog.com/qywyh/comments/58388.html</wfw:comment><comments>http://www.cppblog.com/qywyh/articles/58388.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qywyh/comments/commentRss/58388.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qywyh/services/trackbacks/58388.html</trackback:ping><description><![CDATA[<h3><a name=115137628966847870>数学之美 系列九 -- 如何确定网页和查询的相关性</a></h3>
<p class=byline-timestamp><span id=time115137628966847870 twffan="done">2006年6月27日 上午 09:53:00</span></p>
<script language=javascript>
uT("time115137628966847870");
</script>
<div style="CLEAR: both" twffan="done"></div>
<font color=#666666><span class=byline-author twffan="done">发表者：吴军，Google 研究员 </span><br><br></font>[我们已经谈过了<a href="http://googlechinablog.com/2006/05/web-crawlers.html" target=_blank><u><font color=#0000ff>如何自动下载网页</font></u></a>、<a href="http://googlechinablog.com/2006/05/blog-post_10.html" target=_blank><u><font color=#0000ff>如何建立索引</font></u></a>、<a href="http://googlechinablog.com/2006/02/page-rank-google.html" target=_blank><u><font color=#0000ff>如何衡量网页的质量</font></u></a>(Page Rank)。我们今天谈谈如何确定一个网页和某个查询的相关性。了解了这四个方面，一个有一定编程基础的读者应该可以写一个简单的搜索引擎了，比如为您所在的学校或院系建立一个小的搜索引擎。]<br><br>我们还是看上回的例子，查找关于&#8220;原子能的应用&#8221;的网页。我们第一步是在索引中找到包含这三个词的网页（详见关于<a href="http://googlechinablog.com/2006/05/blog-post_10.html" target=_blank><u><font color=#0000ff>布尔运算</font></u></a>的系列）。现在任何一个搜索引擎都包含几十万甚至是上百万个多少有点关系的网页。那么哪个应该排在前面呢？显然我们应该根据网页和查询&#8220;原子能的应用&#8221;的相关性对这些网页进行排序。因此，这里的关键问题是如何度量网页和查询的相关性。<br><br>我们知道，短语&#8220;原子能的应用&#8221;可以分成三个关键词：原子能、的、应用。根据我们的直觉，我们知道，包含这三个词多的网页应该比包含它们少的网页相关。当然，这个办法有一个明显的漏洞，就是长的网页比短的网页占便宜，因为长的网页总的来讲包含的关键词要多些。因此我们需要根据网页的长度，对关键词的次数进行归一化，也就是用关键词的次数除以网页的总字数。我们把这个商称为&#8220;关键词的频率&#8221;，或者&#8220;单文本词汇频率&#8221;（Term Frequency)，比如，在某个一共有一千词的网页中&#8220;原子能&#8221;、&#8220;的&#8221;和&#8220;应用&#8221;分别出现了 2 次、35 次 和 5 次，那么它们的词频就分别是 0.002、0.035 和 0.005。 我们将这三个数相加，其和 0.042 就是相应网页和查询&#8220;原子能的应用&#8221;<br>相关性的一个简单的度量。概括地讲，如果一个查询包含关键词 w1,w2,...,wN, 它们在一篇特定网页中的词频分别是: TF1, TF2, ..., TFN。 （TF: term frequency)。 那么，这个查询和该网页的相关性就是:<br>TF1 + TF2 + ... + TFN。<br><br>读者可能已经发现了又一个漏洞。在上面的例子中，词&#8220;的&#8221;站了总词频的 80% 以上，而它对确定网页的主题几乎没有用。我们称这种词叫&#8220;应删除词&#8221;（Stopwords)，也就是说在度量相关性是不应考虑它们的频率。在汉语中，应删除词还有&#8220;是&#8221;、&#8220;和&#8221;、&#8220;中&#8221;、&#8220;地&#8221;、&#8220;得&#8221;等等几十个。忽略这些应删除词后，上述网页的相似度就变成了0.007，其中&#8220;原子能&#8221;贡献了0.002，&#8220;应用&#8221;贡献了 0.005。<br><br>细心的读者可能还会发现另一个小的漏洞。在汉语中，&#8220;应用&#8221;是个很通用的词，而&#8220;原子能&#8221;是个很专业的词，后者在相关性排名中比前者重要。因此我们需要给汉语中的每一个词给一个权重，这个权重的设定必须满足下面两个条件：<br><br>1. 一个词预测主题能力越强，权重就越大，反之，权重就越小。我们在网页中看到&#8220;原子能&#8221;这个词，或多或少地能了解网页的主题。我们看到&#8220;应用&#8221;一次，对主题基本上还是一无所知。因此，&#8220;原子能&#8220;的权重就应该比应用大。<br><br>2. 应删除词的权重应该是零。<br><br>我们很容易发现，如果一个关键词只在很少的网页中出现，我们通过它就容易锁定搜索目标，它的权重也就应该大。反之如果一个词在大量网页中出现，我们看到它仍然不很清楚要找什么内容，因此它应该小。概括地讲，假定一个关键词 ｗ 在 Ｄｗ 个网页中出现过，那么 Ｄｗ 越大，ｗ 的权重越小，反之亦然。在信息检索中，使用最多的权重是&#8220;逆文本频率指数&#8221; （Inverse document frequency 缩写为ＩＤＦ），它的公式为ｌｏｇ（Ｄ／Ｄｗ）其中Ｄ是全部网页数。比如，我们假定中文网页数是Ｄ＝１０亿，应删除词&#8220;的&#8221;在所有的网页中都出现，即Ｄｗ＝１０亿，那么它的ＩＤＦ＝log(10亿/10亿）= log (1) = ０。假如专用词&#8220;原子能&#8221;在两百万个网页中出现，即Ｄｗ＝２００万，则它的权重ＩＤＦ＝log(500) =6.2。又假定通用词&#8220;应用&#8221;，出现在五亿个网页中，它的权重ＩＤＦ = log(2)<br>则只有 0.7。也就只说，在网页中找到一个&#8220;原子能&#8221;的比配相当于找到九个&#8220;应用&#8221;的匹配。利用 IDF，上述相关性计算个公式就由词频的简单求和变成了加权求和，即 TF1*IDF1 +　TF2*IDF2 ＋... + TFN*IDFN。在上面的例子中，该网页和&#8220;原子能的应用&#8221;的相关性为 0.0161，其中&#8220;原子能&#8221;贡献了 0.0126，而&#8220;应用&#8221;只贡献了0.0035。这个比例和我们的直觉比较一致了。<br><br>ＴＦ／ＩＤＦ（term frequency/inverse document frequency) 的概念被公认为信息检索中最重要的发明。在搜索、文献分类和其他相关领域有广泛的应用。讲起 TF/IDF 的历史蛮有意思。IDF 的概念最早是剑桥大学的斯巴克－琼斯[注：她有两个姓］ (Karen Sparck Jones)提出来的。斯巴克－琼斯 １９７２ 年在一篇题为关键词特殊性的统计解释和她在文献检索中的应用的论文中提出ＩＤＦ。遗憾的是，她既没有从理论上解释为什么权重ＩＤＦ 应该是对数函数 ｌｏｇ（Ｄ／Ｄｗ）（而不是其它的函数，比如平方根），也没有在这个题目上作进一步深入研究，以至于在以后的很多文献中人们提到 ＴＦ／ＩＤＦ 时没有引用她的论文，绝大多数人甚至不知道斯巴克－琼斯的贡献。同年罗宾逊写了个两页纸的解释，解释得很不好。倒是后来康乃尔大学的萨尔顿（Salton)多次写文章、写书讨论 TF/IDF 在信息检索中的用途，加上萨尔顿本人的大名（信息检索的世界大奖就是以萨尔顿的名字命名的）。很多人都引用萨尔顿的书，甚至以为这个信息检索中最重要的概念是他提出的。当然，世界并没有忘记斯巴克－琼斯的贡献，2004年，在纪念文献学学报创刊 60 周年之际，该学报重印了斯巴克-琼斯的大作。罗宾逊在同期期刊上写了篇文章，用香农的信息论解释 IDF，这回的解释是对的，但文章写的并不好、非常冗长（足足十八页），把一个简单问题搞复杂了。其实，信息论的学者们已经发现并指出，其实 IDF 的概念就是一个特定条件下、关键词的概率分布的交叉熵（Kullback-Leibler Divergence)（详见<a href="http://googlechinablog.com/2006/04/4.html" target=_blank><u><font color=#0000ff>上一系列</font></u></a>）。这样，信息检索相关性的度量，又回到了信息论。<br><br>现在的搜索引擎对 TF/IDF 进行了不少细微的优化，使得相关性的度量更加准确了。当然，对有兴趣写一个搜索引擎的爱好者来讲，使用 TF/IDF 就足够了。 如果我们结合上网页排名(Page Rank)，那么给定一个查询，有关网页综合排名大致由相关性和网页排名乘积决定。
<img src ="http://www.cppblog.com/qywyh/aggbug/58388.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qywyh/" target="_blank">豪</a> 2008-08-09 17:43 <a href="http://www.cppblog.com/qywyh/articles/58388.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】数学之美 系列 12 - 余弦定理和新闻的分类</title><link>http://www.cppblog.com/qywyh/articles/58387.html</link><dc:creator>豪</dc:creator><author>豪</author><pubDate>Sat, 09 Aug 2008 09:41:00 GMT</pubDate><guid>http://www.cppblog.com/qywyh/articles/58387.html</guid><wfw:comment>http://www.cppblog.com/qywyh/comments/58387.html</wfw:comment><comments>http://www.cppblog.com/qywyh/articles/58387.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qywyh/comments/commentRss/58387.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qywyh/services/trackbacks/58387.html</trackback:ping><description><![CDATA[<table class=mainbody cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td vAlign=top><a href="http://googlechinablog.com/"><a href="http://googlechinablog.com/"><img class=googlelogo height=75 alt="Google 黑板报 - Google （谷歌）中国的博客网志，走近我们的产品、技术和文化" src="http://googlechinablog.com/google_bb.gif" width=248 border=0 twffan="done"></a></a>
            <p><span class=title twffan="done"><strong><font color=#666666>Google （谷歌）中国的博客网志，走近我们的产品、技术和文化</font></strong></span></p>
            <div class=post twffan="done">
            <h3><a name=115337391327964752>数学之美 系列 12 - 余弦定理和新闻的分类</a></h3>
            <p class=byline-timestamp><span id=time115337391327964752 twffan="done">2006年7月20日 上午 10:12:00</span></p>
            <script language=javascript>
            uT("time115337391327964752");
            </script>
            <div style="CLEAR: both" twffan="done"></div>
            <font color=#666666><span class=byline-author twffan="done">发表者：吴军，Google 研究员 </span><br><br></font>余弦定理和新闻的分类似乎是两件八杆子打不着的事，但是它们确有紧密的联系。具体说，新闻的分类很大程度上依靠余弦定理。<br><br>Google 的新闻是自动分类和整理的。所谓新闻的分类无非是要把相似的新闻放到一类中。计算机其实读不懂新闻，它只能快速计算。这就要求我们设计一个算法来算出任意两篇新闻的相似性。为了做到这一点，我们需要想办法用一组数字来描述一篇新闻。<br><br>我们来看看怎样找一组数字，或者说一个向量来描述一篇新闻。回忆一下我们在&#8220;<a href="http://googlechinablog.com/2006/06/blog-post_27.html" target=_blank><u><font color=#800080>如何度量网页相关性</font></u></a>&#8221;一文中介绍的TF/IDF 的概念。对于一篇新闻中的所有实词，我们可以计算出它们的单文本词汇频率/逆文本频率值（TF/IDF)。不难想象，和新闻主题有关的那些实词频率高，TF/IDF 值很大。我们按照这些实词在词汇表的位置对它们的 TF/IDF 值排序。比如，词汇表有六万四千个词，分别为<br><br>单词编号 汉字词<br>------------------<br>1 阿<br>2 啊<br>3 阿斗<br>4 阿姨<br>...<br>789 服装<br>....<br>64000 做作<br><br>在一篇新闻中，这 64,000 个词的 TF/IDF 值分别为<br><br>单词编号 TF/IDF 值<br>==============<br>1 0<br>2 0.0034<br>3 0<br>4 0.00052<br>5 0<br>...<br>789 0.034<br>...<br>64000 0.075<br><br><br>如果单词表中的某个次在新闻中没有出现，对应的值为零，那么这 64,000 个数，组成一个64,000维的向量。我们就用这个向量来代表这篇新闻，并成为新闻的特征向量。如果两篇新闻的特征向量相近，则对应的新闻内容相似，它们应当归在一类，反之亦然。<br><br>学过向量代数的人都知道，向量实际上是多维空间中有方向的线段。如果两个向量的方向一致，即夹角接近零，那么这两个向量就相近。而要确定两个向量方向是否一致，这就要用到余弦定理计算向量的夹角了。<br><br>余弦定理对我们每个人都不陌生，它描述了三角形中任何一个夹角和三个边的关系，换句话说，给定三角形的三条边，我们可以用余弦定理求出三角形各个角的角度。假定三角形的三条边为 a, b 和 c，对应的三个角为 A, B 和 C，那么角 A 的余弦 --<br><br><img style="BORDER-RIGHT: 1px solid; BORDER-TOP: 1px solid; BORDER-LEFT: 1px solid; BORDER-BOTTOM: 1px solid" alt="" src="http://googlechinablog.com/uploaded_images/2c4eacd0e4ee4aeb29f0833be0a0442e-771570.png" border=0 twffan="done"><br><br>如果我们将三角形的两边 b 和 c 看成是两个向量，那么上述公式等价于<br><br><img style="BORDER-RIGHT: 1px solid; BORDER-TOP: 1px solid; BORDER-LEFT: 1px solid; BORDER-BOTTOM: 1px solid" alt="" src="http://googlechinablog.com/uploaded_images/cosine-a-744082.png" border=0 twffan="done"><br><br>其中分母表示两个向量 b 和 c 的长度，分子表示两个向量的内积。举一个具体的例子，假如新闻 X 和新闻 Y 对应向量分别是<br>x1,x2,...,x64000 和<br>y1,y2,...,y64000,<br>那么它们夹角的余弦等于，<br><br><img style="BORDER-RIGHT: 1px solid; BORDER-TOP: 1px solid; BORDER-LEFT: 1px solid; BORDER-BOTTOM: 1px solid" alt="" src="http://googlechinablog.com/uploaded_images/cos_theta-757119.JPG" border=0 twffan="done"><br><br>当两条新闻向量夹角的余弦等于一时，这两条新闻完全重复（用这个办法可以删除重复的网页）；当夹角的余弦接近于一时，两条新闻相似，从而可以归成一类；夹角的余弦越小，两条新闻越不相关。<br><br><img style="BORDER-RIGHT: 1px solid; BORDER-TOP: 1px solid; BORDER-LEFT: 1px solid; BORDER-BOTTOM: 1px solid" alt="" src="http://googlechinablog.com/uploaded_images/news-798354.jpg" border=0 twffan="done"><br><br>我们在中学学习余弦定理时，恐怕很难想象它可以用来对新闻进行分类。在这里，我们再一次看到数学工具的用途。</div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cppblog.com/qywyh/aggbug/58387.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qywyh/" target="_blank">豪</a> 2008-08-09 17:41 <a href="http://www.cppblog.com/qywyh/articles/58387.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】如何确定中文字符串的相似度</title><link>http://www.cppblog.com/qywyh/articles/58386.html</link><dc:creator>豪</dc:creator><author>豪</author><pubDate>Sat, 09 Aug 2008 09:40:00 GMT</pubDate><guid>http://www.cppblog.com/qywyh/articles/58386.html</guid><wfw:comment>http://www.cppblog.com/qywyh/comments/58386.html</wfw:comment><comments>http://www.cppblog.com/qywyh/articles/58386.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qywyh/comments/commentRss/58386.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qywyh/services/trackbacks/58386.html</trackback:ping><description><![CDATA[<p align=center><span twffan="done">如何确定中文字符串的相似度</span></p>
<p align=center><span twffan="done"><font face="Times New Roman">&nbsp;</font></span></p>
<p><span twffan="done"><font size=3>作者：肖波</font></span></p>
<p><font size=3><span twffan="done">个人博客：</span><span twffan="done"><a href="http://blog.csdn.net/eaglet"><font face="Times New Roman" color=#0000ff><u>http://blog.csdn.net/eaglet</u></font></a></span></font></p>
<p><font size=3><span twffan="done">Email：<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#98;&#108;&#111;&#103;&#46;&#101;&#97;&#103;&#108;&#101;&#116;&#64;&#103;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;"><u><font color=#0000ff>blog.eaglet@gmail.com</font></u></a></span></font></p>
<p><font size=3><span twffan="done"><font face="Times New Roman">2007/4 </font></span><span twffan="done">南京</span></font></p>
<p align=center><span twffan="done"><font face="Times New Roman">&nbsp;</font></span></p>
<h1><span twffan="done">摘要</span></h1>
<p><font size=3><span twffan="done">在数据挖掘的研究中，我们往往需要判断文章是否雷同</span><span twffan="done"><font face="Times New Roman">,</font></span><span twffan="done">对类似文章或短句进行归类处理等，这其中就会遇到这样的问题：如何确定两个字符串之间的相似程度。</span></font></p>
<p><font size=3><span twffan="done">本文综合作者的实际工作经验和数据挖掘理论，结合中文字符串特性介绍一套相对完整的方法，以解决上述问题</span><span twffan="done"><font face="Times New Roman">.</font></span><span twffan="done">。</span></font></p>
<p><span twffan="done"><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<h1><span twffan="done">分析</span></h1>
<h2><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span twffan="done">最简单的问题求解</span></h2>
<p><font size=3><span twffan="done"><span twffan="done"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span twffan="done">字符串由一组不同含义的单词组成，它不同于数值型变量，可以用一个特定的数值来确定它的大小或位置，所以用何种方式来描述两个字符串之间的距离，成为了一个值得探讨的问题。</span></font></p>
<p><font size=3><span twffan="done"><span twffan="done"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span twffan="done">通常情况下，用于分析的数据类型有如下几种：区间标度遍历、二元变量、标称型变量、序数型变量、比例标度型变量、混合类型变量等。</span></font></p>
<p><font size=3><span twffan="done"><span twffan="done"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span twffan="done">综合这些变量类型，本文认为字符串变量更适合于归类于二元变量，我们可以利用分词技术将字符串分成若干个单词，每个独立的单词作为二元变量的一个属性。我们把所有单词设定为一个二元变量属性集合</span><span twffan="done"><font face="Times New Roman">R</font></span><span twffan="done">，字符串</span><span twffan="done"><font face="Times New Roman">1</font></span><span twffan="done">和字符串</span><span twffan="done"><font face="Times New Roman">2</font></span><span twffan="done">的单词包含于这个集合</span><span twffan="done"><font face="Times New Roman">R</font></span><span twffan="done">。设</span><span twffan="done"><font face="Times New Roman">q</font></span><span twffan="done">是字符串</span><span twffan="done"><font face="Times New Roman">1</font></span><span twffan="done">和字符串</span><span twffan="done"><font face="Times New Roman">2</font></span><span twffan="done">中都存在的单词的总数，</span><span twffan="done"><font face="Times New Roman">s</font></span><span twffan="done">是字符串</span><span twffan="done"><font face="Times New Roman">1</font></span><span twffan="done">中存在，字符串</span><span twffan="done"><font face="Times New Roman">2</font></span><span twffan="done">中不存在的单词总数，</span><span twffan="done"><font face="Times New Roman">r</font></span><span twffan="done">是字符串</span><span twffan="done"><font face="Times New Roman">2</font></span><span twffan="done">中存在，字符串</span><span twffan="done"><font face="Times New Roman">1</font></span><span twffan="done">中不存在的单词总数，</span><span twffan="done"><font face="Times New Roman">t</font></span><span twffan="done">是字符串</span><span twffan="done"><font face="Times New Roman">1</font></span><span twffan="done">和字符串</span><span twffan="done"><font face="Times New Roman">2</font></span><span twffan="done">中都不存在的单词总数。我们称</span><span twffan="done"><font face="Times New Roman"> q,r,s,t</font></span><span twffan="done">为字符串比较中的</span><span twffan="done"><font face="Times New Roman">4</font></span><span twffan="done">个状态分量。</span><font face="Times New Roman"> </font><span twffan="done">如图</span><span twffan="done"><font face="Times New Roman">1</font></span><span twffan="done">所示：</span></font></p>
<p><font size=3><span twffan="done">由于两个字符串都不存在的单词对两个字符串的比较没有任何作用，所以忽略</span><span twffan="done"><font face="Times New Roman">t</font></span><span twffan="done">，于是我们采用非恒定的相似度评价系数</span><span twffan="done"><font face="Times New Roman">(Jaccard</font></span><span twffan="done">系数</span><span twffan="done"><font face="Times New Roman">)</font></span><span twffan="done">来描述两个字符串见的相异度表示公式为</span></font></p>
<p><font size=3><span twffan="done">相异度</span><span twffan="done"><font face="Times New Roman"> = r+s / (q+r+s)</font></span><span twffan="done">，不难推断，他们的形似度公式为</span><font face="Times New Roman"> </font></font></p>
<p><font size=3><strong><span twffan="done">相似度</span><span twffan="done"><font face="Times New Roman">=q/(q+r+s) </font></span></strong><strong><span twffan="done">公式</span><span twffan="done"><font face="Times New Roman">1<br></font></span></strong></font></p>
<p align=center><font size=3><strong><span twffan="done"><font face="Times New Roman"></font></span></strong></font></p>
<p><span twffan="done"><font face="Times New Roman" size=3>
<div align=center twffan="done" src_cetemp="/images/cnblogs_com/eaglet/StringSimilar.JPG"><img height=266 alt="" src="http://images.cnblogs.com/cnblogs_com/eaglet/StringSimilar.JPG" width=429 border=0 twffan="done"></div>
&nbsp;</font></span><font face="宋体, MS Song"> </font>
<p>&nbsp;</p>
<p align=center><span twffan="done"><font face="Times New Roman"><font size=3></font></font></span></p>
<p align=center><span twffan="done"><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p align=center><font size=3><span twffan="done">图</span><span twffan="done"><font face="Times New Roman">1 </font></span><span twffan="done">字符串关系描述</span></font></p>
<p><span twffan="done"><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><span twffan="done"><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><span twffan="done"><font size=3>例如如下两个字符串串：</font></span></p>
<p><font size=3><span twffan="done">字符串</span><span twffan="done"><font face="Times New Roman">1</font></span><span twffan="done">：非对称变量</span></font></p>
<p><font size=3><span twffan="done">字符串</span><span twffan="done"><font face="Times New Roman">2</font></span><span twffan="done">：非对称空间</span></font></p>
<p><span twffan="done"><font size=3>他们的二元属性关系表为：</font></span></p>
<p>
<table style="BORDER-RIGHT: thick; BORDER-TOP: thick; BORDER-LEFT: thick; BORDER-BOTTOM: thick" cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=114>
            <p><font size=3><span twffan="done">字符串</span><span twffan="done"><font face="Times New Roman">/</font></span><span twffan="done">属性</span></font></p>
            </td>
            <td vAlign=top width=114>
            <p><span twffan="done"><font size=3>非</font></span></p>
            </td>
            <td vAlign=top width=114>
            <p><span twffan="done"><font size=3>对称</font></span></p>
            </td>
            <td vAlign=top width=114>
            <p><span twffan="done"><font size=3>变量</font></span></p>
            </td>
            <td vAlign=top width=114>
            <p><span twffan="done"><font size=3>空间</font></span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=114>
            <p><span twffan="done"><font size=3>非对称变量</font></span></p>
            </td>
            <td vAlign=top width=114>
            <p><span twffan="done"><font face="Times New Roman" size=3>Y</font></span></p>
            </td>
            <td vAlign=top width=114>
            <p><span twffan="done"><font face="Times New Roman" size=3>Y</font></span></p>
            </td>
            <td vAlign=top width=114>
            <p><span twffan="done"><font face="Times New Roman" size=3>Y</font></span></p>
            </td>
            <td vAlign=top width=114>
            <p><span twffan="done"><font face="Times New Roman" size=3>N</font></span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=114>
            <p><span twffan="done"><font size=3>非对称空间</font></span></p>
            </td>
            <td vAlign=top width=114>
            <p><span twffan="done"><font face="Times New Roman" size=3>Y</font></span></p>
            </td>
            <td vAlign=top width=114>
            <p><span twffan="done"><font face="Times New Roman" size=3>Y</font></span></p>
            </td>
            <td vAlign=top width=114>
            <p><span twffan="done"><font face="Times New Roman" size=3>N</font></span></p>
            </td>
            <td vAlign=top width=114>
            <p><span twffan="done"><font face="Times New Roman" size=3>Y</font></span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><span twffan="done"><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span twffan="done"><font face="Times New Roman">Y </font></span><span twffan="done">表示存在该单词属性，</span><span twffan="done"><font face="Times New Roman">N</font></span><span twffan="done">表示不存在该单词属性</span></font></p>
<p><span twffan="done"><font size=3>那么对应的</font></span></p>
<p><span twffan="done"><font face="Times New Roman" size=3>s = 1; q = 2; r = 1</font></span></p>
<p><font size=3><span twffan="done">两个字符串的相似度为</span><span twffan="done"><font face="Times New Roman"> 2/(1+2+1) = 50%</font></span></font></p>
<p><span twffan="done"><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<h2><span twffan="done">单词重复问题求解</span></h2>
<p><span twffan="done"><font size=3>前面讨论的问题是最简单的字符串比较问题，这个问题中单个字符串不存在重复的单词，然而如果字符串中出现重复单词，采用上一节的公式套用后得到的结果往往不够理想，比如</font></span></p>
<p><font size=3><span twffan="done">字符串</span><span twffan="done"><font face="Times New Roman">1</font></span><span twffan="done">：前进前进</span></font></p>
<p><font size=3><span twffan="done">字符串</span><span twffan="done"><font face="Times New Roman">2</font></span><span twffan="done">：前进</span></font></p>
<p><font size=3><span twffan="done">公式</span><span twffan="done"><font face="Times New Roman">1</font></span><span twffan="done">相似度</span><span twffan="done"><font face="Times New Roman">=q/(q+r+s) </font></span><span twffan="done">来计算，</span></font></p>
<p><font size=3><span twffan="done"><font face="Times New Roman">q = 1 , r=s=0 </font></span><span twffan="done">，得到的相似度为</span><span twffan="done"><font face="Times New Roman">100%</font></span><span twffan="done">，而实际上这两个字符串并不完全相同。为解决这个问题，我们必须将在不同位置出现的相同单词假设为不同单词，以其在字符串中出现的次序作为区分，这样其二元属性关系表如下：</span></font></p>
<p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=114>
            <p><font size=3><span twffan="done">字符串</span><span twffan="done"><font face="Times New Roman">/</font></span><span twffan="done">属性</span></font></p>
            </td>
            <td vAlign=top width=114>
            <p><font size=3><span twffan="done">前进</span><span twffan="done"><font face="Times New Roman">1</font></span></font></p>
            </td>
            <td vAlign=top width=114>
            <p><font size=3><span twffan="done">前进</span><span twffan="done"><font face="Times New Roman">2</font></span></font></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=114>
            <p><span twffan="done"><font size=3>前进前进</font></span></p>
            </td>
            <td vAlign=top width=114>
            <p><span twffan="done"><font face="Times New Roman" size=3>Y</font></span></p>
            </td>
            <td vAlign=top width=114>
            <p><span twffan="done"><font face="Times New Roman" size=3>Y</font></span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=114>
            <p><span twffan="done"><font size=3>前进</font></span></p>
            </td>
            <td vAlign=top width=114>
            <p><span twffan="done"><font face="Times New Roman" size=3>Y</font></span></p>
            </td>
            <td vAlign=top width=114>
            <p><span twffan="done"><font face="Times New Roman" size=3>N</font></span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font size=3><span twffan="done">相应的</span><span twffan="done"><font face="Times New Roman"> q = 1, s=1, r= 0</font></span></font></p>
<p><font size=3><span twffan="done">其相似度为</span><span twffan="done"><font face="Times New Roman"> 1/(1+1+0) = 50%</font></span></font></p>
<p><span twffan="done"><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<h2><span twffan="done">状态分量权重</span>&nbsp;</h2>
<p><font size=3><span twffan="done">在实际应用中，</span><span twffan="done"><font face="Times New Roman">q,r,s</font></span><span twffan="done">三种状态分量并不一定是同等价值的，它们往往根据实际应用的需要存在不同的权重，比如对于某些应用来说，两个字符串中相同单词数量比不同单词数量更能说明字符串的相似程度，那么我们必须将</span><span twffan="done"><font face="Times New Roman">q</font></span><span twffan="done">的权重提高，重新计算相似程度。</span></font></p>
<p><font size=3><span twffan="done">我们设对应</span><span twffan="done"><font face="Times New Roman">q,r,s</font></span><span twffan="done">三个变量的权重分别是</span><span twffan="done"><font face="Times New Roman">Kq, Kr, Ks </font></span><span twffan="done">，则公式</span><span twffan="done"><font face="Times New Roman">1 </font></span><span twffan="done">演进为</span></font></p>
<p><font size=3><strong><span twffan="done">相似度</span><span twffan="done"><font face="Times New Roman">=Kq*q/(Kq*q+Kr*r+Ks*s) (Kq &gt; 0 , Kr&gt;=0,Ka&gt;=0) </font></span></strong><strong><span twffan="done">公式</span><span twffan="done"><font face="Times New Roman">2</font></span></strong></font></p>
<p><font size=3><span twffan="done">回到上面问题，对于上一节的两个字符串，如果我们设置</span><span twffan="done"><font face="Times New Roman">Kq = 2 ,Kr=Ks=1</font></span><span twffan="done">，则更加公式</span><span twffan="done"><font face="Times New Roman">2</font></span></font></p>
<p><font size=3><span twffan="done">它们的相似度为</span><span twffan="done"><font face="Times New Roman"> 2*1/ (2*1+1*1+1*0) = 66.7%</font></span></font></p>
<p><span twffan="done"><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<h2><span twffan="done">同义词问题</span></h2>
<p><span twffan="done"><font size=3>在语言中，同义词是经常遇到的问题，如果两个字符串中存在同义词，其相似度又如何计算呢。</font></span></p>
<p><span twffan="done"><font size=3>对于同义词问题，我们要从分词过程中来解决。首先我们需要构建一个同义词对照表，将同义词对应到一个等价单词，在对字符串分词后对字符串中的所有单词到同义词表中查找，如果存在，则替换为对应的等价单词，这样分词后，两个字符串中的同义词就指向了相同的单词。</font></span></p>
<p><span twffan="done"><font size=3>比如存在同义词表如下：</font></span></p>
<p><span twffan="done"><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=284>
            <p><span twffan="done"><font size=3>单词</font></span></p>
            </td>
            <td vAlign=top width=284>
            <p><span twffan="done"><font size=3>等价词</font></span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=284>
            <p><span twffan="done"><font size=3>也许</font></span></p>
            </td>
            <td vAlign=top width=284>
            <p><span twffan="done"><font size=3>也许</font></span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=284>
            <p><span twffan="done"><font size=3>或许</font></span></p>
            </td>
            <td vAlign=top width=284>
            <p><span twffan="done"><font size=3>也许</font></span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=284>
            <p><span twffan="done"><font size=3>可能</font></span></p>
            </td>
            <td vAlign=top width=284>
            <p><span twffan="done"><font size=3>也许</font></span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><span twffan="done"><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><span twffan="done"><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span twffan="done">字符串</span><span twffan="done"><font face="Times New Roman">1</font></span><span twffan="done">：他也许不来了</span></font></p>
<p><font size=3><span twffan="done">字符串</span><span twffan="done"><font face="Times New Roman">2</font></span><span twffan="done">：他可能不来了</span></font></p>
<p><span twffan="done"><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><span twffan="done"><font size=3>分词后二元属性关系表如下：</font></span></p>
<p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=114>
            <p><font size=3><span twffan="done">字符串</span><span twffan="done"><font face="Times New Roman">/</font></span><span twffan="done">属性</span></font></p>
            </td>
            <td vAlign=top width=114>
            <p><span twffan="done"><font size=3>他</font></span></p>
            </td>
            <td vAlign=top width=114>
            <p><span twffan="done"><font size=3>也许</font></span></p>
            </td>
            <td vAlign=top width=114>
            <p><span twffan="done"><font size=3>不来</font></span></p>
            </td>
            <td vAlign=top width=114>
            <p><span twffan="done"><font size=3>了</font></span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=114>
            <p><span twffan="done"><font size=3>他也许不来了</font></span></p>
            </td>
            <td vAlign=top width=114>
            <p><span twffan="done"><font face="Times New Roman" size=3>Y</font></span></p>
            </td>
            <td vAlign=top width=114>
            <p><span twffan="done"><font face="Times New Roman" size=3>Y</font></span></p>
            </td>
            <td vAlign=top width=114>
            <p><span twffan="done"><font face="Times New Roman" size=3>Y</font></span></p>
            </td>
            <td vAlign=top width=114>
            <p><span twffan="done"><font face="Times New Roman" size=3>Y</font></span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=114>
            <p><span twffan="done"><font size=3>他可能不来了</font></span></p>
            </td>
            <td vAlign=top width=114>
            <p><span twffan="done"><font face="Times New Roman" size=3>Y</font></span></p>
            </td>
            <td vAlign=top width=114>
            <p><span twffan="done"><font face="Times New Roman" size=3>Y</font></span></p>
            </td>
            <td vAlign=top width=114>
            <p><span twffan="done"><font face="Times New Roman" size=3>Y</font></span></p>
            </td>
            <td vAlign=top width=114>
            <p><span twffan="done"><font face="Times New Roman" size=3>Y</font></span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><span twffan="done"><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span twffan="done">不难看出，两个字符串的相似度为</span><span twffan="done"><font face="Times New Roman"> 100%</font></span></font></p>
<h2><span twffan="done">同音不同义</span></h2>
<p><span twffan="done"><font size=3>在中文网络环境中，由于大多数网络文章的作者都是采用拼音输入法输入汉字，经常会出现输入同音不同义的文字错误，为了纠正这种错误，我们可以考虑采用汉语拼音的方式进行分词，也可以综合分词，也就是先正常分词，在拼音分词，字符串的分词结果去两者的并集。</font></span></p>
<p><span twffan="done"><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<h1><span twffan="done">小节</span></h1>
<p><span twffan="done"><font size=3>确定字符串相似度的方法很多，本文根据作者多年从事数据挖掘工作的经验结合数据挖掘理论提出的相关解决方案，可以较好的解决中文字符串分析中的相似度比较问题。但技术的发展是不断前进的，相信未来还会有更好的方法来解决中文字符串相似度比较问题。读者如果有更好的想法或者发现本文算法中的不足，非常欢迎和本文作者联系。</font></span></p>
<p><span twffan="done"><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><span twffan="done"><font size=3>参考文献</font></span></p>
<p><font size=3><span twffan="done">《数据挖掘概念与技术》</span><font face="Times New Roman"> </font><span twffan="done">机械工业出版社</span><font face="Times New Roman"> <span twffan="done">Jiawei Han, Micheline Kamber</span></font></font></p>
<img src ="http://www.cppblog.com/qywyh/aggbug/58386.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qywyh/" target="_blank">豪</a> 2008-08-09 17:40 <a href="http://www.cppblog.com/qywyh/articles/58386.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>