<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[X-Intend[超级打算]]]></title>
<link>http://www.xintend.com</link>
<description><![CDATA[每个人都有自己的想法,哪怕仅仅一瞬间~！]]></description>
<pubDate>2010-03-11 10:57:42Z</pubDate>
<item>
<title><![CDATA[HTML5处理音频说明]]></title>
<link>http://www.xintend.com/Article/hXjBVoUGxwKeRrnwKeoA.aspx</link>
<category><![CDATA[开发者]]></category>
<author>KingFo</author>
<pubDate>2010-03-10 14:04:29Z</pubDate>
<description><![CDATA[<p>&nbsp;</p>
<script type="text/javascript" src="http://assets.taobaocdn.com/app/tms/tms-edit-link.js"></script>
<script type="text/javascript" src="http://assets.taobaocdn.com/app/tms/tms-edit-link.js"></script>
<p>https://wiki.mozilla.org/Audio_Data_API</p>]]></description>
</item>
<item>
<title><![CDATA[[转]Custom events in JavaScript]]></title>
<link>http://www.xintend.com/Article/pwlKZqSiiiTtWtYsAHVV.aspx</link>
<category><![CDATA[开发者]]></category>
<author>KingFo</author>
<pubDate>2010-03-10 13:01:41Z</pubDate>
<description><![CDATA[<p>&nbsp;</p>
<!--{12681974632840}-->
<div class="post-head">
<h1>Custom events in JavaScript</h1>
<p class="byline">Posted at March 9, 2010 09:00 am by Nicholas C. Zakas</p>
<p class="tags">Tags: <a rel="tag" href="http://www.nczonline.net/blog/tag/bom/">BOM</a>, <a rel="tag" href="http://www.nczonline.net/blog/tag/dom/">DOM</a>, <a rel="tag" href="http://www.nczonline.net/blog/tag/events/">Events</a>, <a rel="tag" href="http://www.nczonline.net/blog/tag/javascript/">JavaScript</a></p>
<p class="tags">&nbsp;</p>
<p>Without a doubt, the most often-used paradigm in JavaScript is events. Events are a manifestation of the <a href="http://en.wikipedia.org/wiki/Observer_pattern">observer pattern</a>, a well-defined computer science design pattern for loose coupling. <a href="http://en.wikipedia.org/wiki/Loose_coupling">Loose coupling</a> is incredibly important for creating maintainable, stable codebases. I talk a lot about loose coupling and its importance in my talk, <a href="http://www.slideshare.net/nzakas/scalable-javascript-application-architecture">Scalable JavaScript Application Architecture</a> (<a href="http://developer.yahoo.com/yui/theater/video.php?v=zakas-architecture">video</a>), so I won&rsquo;t talk too much about it here. However, the concept is very important to grasp if you wish to progress as a software engineer.</p>
<h2>Events</h2>
<p>Unless you&rsquo;ve never written any JavaScript before, you&rsquo;ve used events at some point in time (admittedly, if you&rsquo;ve never written JavaScript before, the chances of your reading my blog are probably pretty slim). Put quite simply: the way that you tie behavior to web pages is through events. Events are a way of letting interested parties know that an important moment has occurred in the lifecycle of the application. For instance:</p>
<pre><ol class="dp-c"><li class="alt"><span><span>window.onload&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(){&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;Application.init();&nbsp;</span></li><li class="alt"><span>};&nbsp;</span></li></ol></pre>
<pre><code><br /></code></pre>
<p>In this example, the <code>load</code> event is the interesting moment. I want to know when the window is fully loaded so that I can initialized the JavaScript application. The <code>onload</code> event handler is the location to where an event handler is assigned. The brilliant part is that <code>window</code> doesn&rsquo;t care what web page is loaded or who is writing the code; it just knows that there&rsquo;s a function to call when <code>load</code> occurs. This is the essence of loose coupling: when parts of an application have very limited knowledge of one another.</p>
<p>The <a href="http://javascript.about.com/od/browserobjectmodel/a/bom01.htm">Browser Object Model</a> (BOM) and <a href="http://www.w3.org/DOM/">Document Object Model</a> (DOM) publish events to allow developers access to the interesting moments of the browser and web page, respectively.</p>
<h2>Custom events</h2>
<p>It&rsquo;s no surprise that most JavaScript libraries rely heavily on custom events since this is a pattern that web developers are familiar with. Every major JavaScript library provides its own events, components to enable easy custom event definition, or both. This makes sense, of course, since libraries want to be loosely-coupled to the execution environment, and therefore, to your code.</p>
<p>There&rsquo;s nothing magic about custom events, though, and there&rsquo;s no need to load an entire library if you&rsquo;d like to experiment with custom events. An object that supports custom events needs to be able to do a small set of things:</p>
<ol>
    <li>Assign an event handler for a particular event.</li>
    <li>Remove an event handler for a particular event.</li>
    <li>Fire an event and call all assigned event handlers.</li>
</ol>
<p>The following implements all of this basic functionality:</p>
<pre><ol class="dp-c"><li class="alt"><span><span class="comment">//Copyright&nbsp;(c)&nbsp;2010&nbsp;Nicholas&nbsp;C.&nbsp;Zakas.&nbsp;All&nbsp;rights&nbsp;reserved.</span><span>&nbsp;</span></span></li><li><span><span class="comment">//MIT&nbsp;License</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;</span></li><li><span><span class="keyword">function</span><span>&nbsp;EventTarget(){&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>._listeners&nbsp;=&nbsp;{};&nbsp;</span></span></li><li><span>}&nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span>EventTarget.prototype&nbsp;=&nbsp;{&nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;constructor:&nbsp;EventTarget,&nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;addListener:&nbsp;<span class="keyword">function</span><span>(type,&nbsp;listener){&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(</span><span class="keyword">typeof</span><span>&nbsp;</span><span class="keyword">this</span><span>._listeners[type]&nbsp;==&nbsp;</span><span class="string">&quot;undefined&quot;</span><span>){&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>._listeners[type]&nbsp;=&nbsp;[];&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>._listeners[type].push(listener);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;fire:&nbsp;<span class="keyword">function</span><span>(event){&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(</span><span class="keyword">typeof</span><span>&nbsp;event&nbsp;==&nbsp;</span><span class="string">&quot;string&quot;</span><span>){&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event&nbsp;=&nbsp;{&nbsp;type:&nbsp;event&nbsp;};&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(!event.target){&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event.target&nbsp;=&nbsp;<span class="keyword">this</span><span>;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(!event.type){&nbsp;&nbsp;</span><span class="comment">//falsy</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;Error(</span><span class="string">&quot;Event&nbsp;object&nbsp;missing&nbsp;&#39;type&#39;&nbsp;property.&quot;</span><span>);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(</span><span class="keyword">this</span><span>._listeners[event.type]&nbsp;</span><span class="keyword">instanceof</span><span>&nbsp;Array){&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;listeners&nbsp;=&nbsp;</span><span class="keyword">this</span><span>._listeners[event.type];&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">var</span><span>&nbsp;i=0,&nbsp;len=listeners.length;&nbsp;i&nbsp;&lt;&nbsp;len;&nbsp;i++){&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listeners[i].call(<span class="keyword">this</span><span>,&nbsp;event);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;removeListener:&nbsp;<span class="keyword">function</span><span>(type,&nbsp;listener){&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(</span><span class="keyword">this</span><span>._listeners[type]&nbsp;</span><span class="keyword">instanceof</span><span>&nbsp;Array){&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;listeners&nbsp;=&nbsp;</span><span class="keyword">this</span><span>._listeners[type];&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">var</span><span>&nbsp;i=0,&nbsp;len=listeners.length;&nbsp;i&nbsp;&lt;&nbsp;len;&nbsp;i++){&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(listeners[i]&nbsp;===&nbsp;listener){&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listeners.splice(i,&nbsp;1);&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">break</span><span>;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>};&nbsp;</span></li></ol></pre>
<pre><code><br /></code></pre>
<p>The <code>EventTarget</code> type has three methods: <code>addListener()</code>, <code>fire()</code>, and <code>removeListener</code>.</p>
<p>The <code>addListener()</code> uses the private <code>_listeners</code> object to store event handlers for various events. When an event handler is added, the method first checks to see if there&rsquo;s a named property for that event type on the <code>_listeners</code> object, and if not, creates one containing an array. The event handler function is then saved to the array for later.</p>
<p>The <code>fire()</code> method fires an event with a given name. In effect, this method&rsquo;s only job is to execute each event handler for the given event type. The method accepts either an object, in which case it&rsquo;s expected to have a <code>type</code> property, or a string, in which case a new object is created and the string is assigned as the value of <code>type</code>. Next, if the event object doesn&rsquo;t have a <code>target</code> property assigned, it is set to the current instance. This effectively creates an event object similar to the one most are familiar with via the BOM and DOM. Once the event object is created, the <code>_listeners</code> object is checked for event handlers, and if found, they are executed. Note that in order to mimic the BOM/DOM approach, event handlers are executed in the scope of <code>this</code> via the <code>call()</code> method.</p>
<p>The last method, <code>removeListener()</code>, simply reverses the process of <code>addListener()</code>. It searches through the <code>_listeners</code> property for the given event type to locate the specified event handler. If found, the event handler is removed by using the array&rsquo;s <code>splice()</code> method, and otherwise it exits without doing anything.</p>
<p>Basic usage:</p>
<pre><ol class="dp-c"><li class="alt"><span><span class="keyword">var</span><span>&nbsp;target&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;EventTarget();&nbsp;</span></span></li><li><span><span class="keyword">function</span><span>&nbsp;handleEvent(event){&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;alert(event.type);&nbsp;</span></li><li><span>};&nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span>target.addListener(<span class="string">&quot;foo&quot;</span><span>,&nbsp;handleEvent);&nbsp;</span></span></li><li class="alt"><span>target.fire({&nbsp;type:&nbsp;<span class="string">&quot;foo&quot;</span><span>&nbsp;});&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//can&nbsp;also&nbsp;do&nbsp;target.fire(&quot;foo&quot;)</span><span>&nbsp;</span></span></li><li><span>target.removeListener(<span class="string">&quot;foo&quot;</span><span>,&nbsp;handleEvent);&nbsp;</span></span></li></ol></pre>
<pre><code><br /></code></pre>
<p>Practically speaking, you&rsquo;ll likely not want to use an instance of <code>EventTarget</code> directly, but rather inherit from it:</p>
<pre><ol class="dp-c"><li class="alt"><span><span class="keyword">function</span><span>&nbsp;MyObject(){&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;EventTarget.call(<span class="keyword">this</span><span>);&nbsp;</span></span></li><li class="alt"><span>}&nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span>MyObject.prototype&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;EventTarget();&nbsp;</span></span></li><li><span>MyObject.prototype.constructor&nbsp;=&nbsp;MyObject;&nbsp;</span></li><li class="alt"><span>MyObject.prototype.foo&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.fire(</span><span class="string">&quot;foo&quot;</span><span>);&nbsp;</span></span></li><li class="alt"><span>};&nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span><span class="keyword">var</span><span>&nbsp;o&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;MyObject();&nbsp;</span></span></li><li><span>&nbsp;</span></li><li class="alt"><span>o.addListener(<span class="string">&quot;foo&quot;</span><span>,&nbsp;</span><span class="keyword">function</span><span>(){&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;Foo&nbsp;just&nbsp;happened.&quot;</span><span>);&nbsp;</span></span></li><li class="alt"><span>});&nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span>o.foo();&nbsp;</span></li></ol></pre>
<pre><code><br /></code></pre>
<p>Typically, events are fired in reaction to some other method call, as in this example (events are usually not fired external to the object that is publishing the events).</p>
<h2>What about&hellip;?</h2>
<p>This is a pretty barebones implementation of a custom event providing object, so inevitably someone will come along and ask why I didn&rsquo;t include one feature or another. There are, of course, a lot of enhancements you can make to custom events if you so desire. Some enhancements others have implemented:</p>
<ul>
    <li>Bubbling of events</li>
    <li>Continue to execute event handlers even if one throws an error</li>
    <li>Allow event handlers to cancel further processing or default actions</li>
</ul>
<p>Each of these can be built pretty easily on top of the base presented in this post.</p>
<h2>Conclusion</h2>
<p>Custom events are a very powerful and useful pattern in JavaScript programming, and your usage of them doesn&rsquo;t have to rely on a large JavaScript library. Implementing your own custom events is easy. The implementation presented in this post is a minimum feature set that typically fulfills most requirements, but you can consider it as a starting point for more advanced functionality if your requirements are more complex.</p>
</div>
<!--{12681974632841}-->
<script type="text/javascript" src="http://assets.taobaocdn.com/app/tms/tms-edit-link.js"></script>
<p>&nbsp;</p></p></p></p></p></p></p></p></p></h></h></h></h></h>]]></description>
</item>
<item>
<title><![CDATA[阅读摘要：推荐算法介绍(隐性打分)]]></title>
<link>http://www.xintend.com/Article/recommendation_algorithm.aspx</link>
<category><![CDATA[开发者]]></category>
<author>KingFo</author>
<pubDate>2010-03-01 19:40:59Z</pubDate>
<description><![CDATA[<p><span style="color: rgb(192, 192, 192); ">&nbsp;来源:</span><a href="http://blog.csdn.net/liuzhenwen/archive/2009/04/22/4101003.aspx"><span style="color: rgb(192, 192, 192); ">http://blog.csdn.net/liuzhenwen/archive/2009/04/22/4101003.aspx</span></a></p>
<p>推荐系统最早在<a target="_blank" style="text-decoration: none; color: rgb(51, 102, 153); " href="http://www.amazon.com/"><span style="line-height: 21px; text-decoration: underline; "><span style="line-height: 21px; color: rgb(0, 0, 255); ">亚马逊</span></span></a>的网站上应用，根据以往用户的购买行为，推荐出购买某种产品同时可能购买的其他产品。</p>
<blockquote>
<p><span style="background-color: rgb(255, 255, 153); ">直接打分需要用户的参与程度比较高，很多网站都在内容页中留一个打分的按钮，从1～5选一 个，我可能喜欢这篇文章，可我哪里知道我喜欢的程度是几分啊，还要我去思考，而网站设计中一条很重要的原则是:Do not let me think!，于是我就胡打一个分数或者不打，而隐性的打分则不同，只有你喜欢的图书你才会购买，只有你喜欢的歌曲才会听多次。</span></p>
</blockquote>
<p>最近邻搜索算法一般是皮尔森相关系数（<a target="_blank" style="text-decoration: none; color: rgb(51, 102, 153); " href="http://en.wikipedia.org/wiki/Correlation"><span style="line-height: 21px; text-decoration: underline; "><span style="line-height: 21px; color: rgb(129, 0, 129); ">Person Correlation Coefficient</span></span></a>）、余弦相似性（<a target="_blank" style="text-decoration: none; color: rgb(51, 102, 153); " href="http://www10.org/cdrom/papers/519/node12.html"><span style="line-height: 21px; text-decoration: underline; "><span style="line-height: 21px; color: rgb(0, 0, 255); ">Cosine-based Similarity</span></span></a>）以及调整余弦相似性（<a target="_blank" style="text-decoration: none; color: rgb(51, 102, 153); " href="http://www10.org/cdrom/papers/519/node14.html"><span style="line-height: 21px; text-decoration: underline; "><span style="line-height: 21px; color: rgb(0, 0, 255); ">Adjusted Cosine Similarity</span></span></a>）。关于余弦定理在数据挖掘中的应用，google黑白报有过介绍，可以参考<span style="line-height: 21px; text-decoration: underline; "><span style="line-height: 21px; color: rgb(129, 0, 129); "><a target="_blank" style="text-decoration: none; color: rgb(51, 102, 153); " href="http://www.googlechinablog.com/2006/07/12.html">数学之美 系列 12 - 余弦定理和新闻的分类</a>。</span></span></p>
<p>&nbsp;</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><strong>基本原理</strong></p>
<blockquote style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dotted; border-right-style: dotted; border-bottom-style: dotted; border-left-style: dotted; border-top-color: rgb(152, 164, 127); border-right-color: rgb(152, 164, 127); border-bottom-color: rgb(152, 164, 127); border-left-color: rgb(152, 164, 127); background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(245, 245, 245); font: normal normal normal 12px/normal simsun; padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; background-position: initial initial; background-repeat: initial initial; ">
<table border="0" style="width: 300px; height: 184px; ">
    <tbody>
        <tr>
            <td><strong>用户&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong></td>
            <td><strong>对事物A打分</strong></td>
            <td><strong>对事物B打分</strong></td>
        </tr>
        <tr>
            <td><strong>X</strong></td>
            <td><strong>3</strong></td>
            <td><strong>4</strong></td>
        </tr>
        <tr>
            <td><strong>Y</strong></td>
            <td><strong>2</strong></td>
            <td><strong>4</strong></td>
        </tr>
        <tr>
            <td><strong>Z</strong></td>
            <td><strong>4</strong></td>
            <td><strong>?</strong></td>
        </tr>
    </tbody>
</table>
</blockquote>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">用户Z对事物B的打分可能是多少呢？股票上有个说法是平均值可以掩盖一切异常波动，所以股票上的各个技术指标收拾不同时间段的平均值的曲线图或者柱 状图等。同样的，Slope one算法也认为：平均值也可以代替某两个未知个体之间的打分差异，事物A对事物B的平均很差是：((3 - 4) + (2 - 4)) / 2 = -1.5，也就是说人们对事物B的打分一般比事物A的打分要高1.5，于是Slope one算法就猜测Z对事物B的打分是4 + 1.5 = 5.5</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><strong>加权算法</strong></p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">有n个人对事物A和事物B打分了，R(A-&gt;B)表示这n个人对A和对B打分的平均差（A-B）,有m个人对事物B和事物C打分 了，R（C-&gt;B）表示这m个人对C和对B打分的平均差（C-B），注意都是平均差而不是平方差，现在某个用户对A的打分是ra，对C的打分是 rc，那么A对B的打分可能是：</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><strong>rb = (n * (ra - R(A-&gt;B)) + m * (rc&nbsp;- R(C-&gt;B)))/(m+n)</strong></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<pre><ol class="dp-c"><li class="alt">&nbsp;</li><li class="alt"><span><span>#&nbsp;This&nbsp;is&nbsp;the&nbsp;code&nbsp;in&nbsp;plain&nbsp;text&nbsp;out&nbsp;of&nbsp;the&nbsp;technical&nbsp;report.&nbsp;</span></span></li><li><span>#&nbsp;</span></li><li class="alt"><span>#&nbsp;Daniel&nbsp;Lemire,&nbsp;Sean&nbsp;McGrath,&nbsp;Implementing&nbsp;a&nbsp;Rating-Based&nbsp;Item-to-Item&nbsp;</span></li><li><span>#&nbsp;Recommender&nbsp;System&nbsp;in&nbsp;PHP/SQL,&nbsp;Technical&nbsp;Report&nbsp;D-01,&nbsp;January&nbsp;2005.&nbsp;</span></li><li class="alt"><span>#&nbsp;</span></li><li><span>#&nbsp;http:<span class="comment">//www.ondelette.com/lemire/abstracts/TRD01.html</span><span>&nbsp;</span></span></li><li class="alt"><span>#&nbsp;</span></li><li><span>#&nbsp;This&nbsp;code&nbsp;is&nbsp;in&nbsp;the&nbsp;<span class="keyword">public</span><span>&nbsp;domain,&nbsp;</span><span class="keyword">use</span><span>&nbsp;at&nbsp;your&nbsp;own&nbsp;risks.&nbsp;</span></span></li><li class="alt"><span>#&nbsp;It&nbsp;is&nbsp;assumed&nbsp;that&nbsp;you&nbsp;looked&nbsp;at&nbsp;the&nbsp;report&nbsp;<span class="keyword">and</span><span>&nbsp;know&nbsp;some&nbsp;SQL&nbsp;</span><span class="keyword">and</span><span>&nbsp;PHP.&nbsp;</span></span></li><li><span>#&nbsp;</span></li><li class="alt"><span>#&nbsp;Daniel&nbsp;Lemire,&nbsp;February&nbsp;3rd&nbsp;2005&nbsp;</span></li><li><span>#&nbsp;</span></li><li class="alt"><span>#&nbsp;First&nbsp;part&nbsp;is&nbsp;sample&nbsp;SQL&nbsp;code.&nbsp;</span></li><li><span>#########CUT&nbsp;HERE####################&nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span>CREATE&nbsp;TABLE&nbsp;rating&nbsp;(&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;userID&nbsp;INT&nbsp;PRIMARY&nbsp;KEY,&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;itemID&nbsp;INT&nbsp;NOT&nbsp;NULL,&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;ratingValue&nbsp;INT&nbsp;NOT&nbsp;NULL,&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;datetimestamp&nbsp;TIMESTAMP&nbsp;NOT&nbsp;NULL&nbsp;</span></li><li class="alt"><span>);&nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span>CREATE&nbsp;TABLE&nbsp;dev&nbsp;(&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;itemID1&nbsp;int(11)&nbsp;NOT&nbsp;NULL&nbsp;<span class="keyword">default</span><span>&nbsp;</span><span class="string">&#39;0&#39;</span><span>,&nbsp;</span></span></li><li><span>&nbsp;&nbsp;itemID2&nbsp;int(11)&nbsp;NOT&nbsp;NULL&nbsp;<span class="keyword">default</span><span>&nbsp;</span><span class="string">&#39;0&#39;</span><span>,&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="func">count</span><span>&nbsp;int(11)&nbsp;NOT&nbsp;NULL&nbsp;</span><span class="keyword">default</span><span>&nbsp;</span><span class="string">&#39;0&#39;</span><span>,&nbsp;</span></span></li><li><span>&nbsp;&nbsp;sum&nbsp;int(11)&nbsp;NOT&nbsp;NULL&nbsp;<span class="keyword">default</span><span>&nbsp;</span><span class="string">&#39;0&#39;</span><span>,&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;PRIMARY&nbsp;KEY&nbsp;&nbsp;(itemID1,itemID2)&nbsp;</span></li><li><span>);&nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span>#&nbsp;simple&nbsp;query&nbsp;to&nbsp;output&nbsp;10&nbsp;most&nbsp;liked&nbsp;items&nbsp;</span></li><li><span>#&nbsp;by&nbsp;people&nbsp;who&nbsp;rated&nbsp;item&nbsp;1&nbsp;</span></li><li class="alt"><span>SELECT&nbsp;itemID2,&nbsp;(&nbsp;sum&nbsp;/&nbsp;<span class="func">count</span><span>&nbsp;)&nbsp;AS&nbsp;average&nbsp;</span></span></li><li><span>FROM&nbsp;dev&nbsp;</span></li><li class="alt"><span>WHERE&nbsp;<span class="func">count</span><span>&nbsp;&gt;&nbsp;2&nbsp;AND&nbsp;itemID1&nbsp;=&nbsp;1&nbsp;</span></span></li><li><span>ORDER&nbsp;&nbsp;BY&nbsp;(&nbsp;sum&nbsp;/&nbsp;<span class="func">count</span><span>&nbsp;)&nbsp;DESC&nbsp;</span></span></li><li class="alt"><span>LIMIT&nbsp;10;&nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span>#&nbsp;Next&nbsp;part&nbsp;is&nbsp;sample&nbsp;PHP&nbsp;code.&nbsp;</span></li><li><span>#########CUT&nbsp;HERE####################&nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span><span class="comment">//&nbsp;This&nbsp;code&nbsp;assumes&nbsp;$itemID&nbsp;is&nbsp;set&nbsp;to&nbsp;that&nbsp;of&nbsp;</span><span>&nbsp;</span></span></li><li class="alt"><span><span class="comment">//&nbsp;the&nbsp;item&nbsp;that&nbsp;was&nbsp;just&nbsp;rated.&nbsp;</span><span>&nbsp;</span></span></li><li><span><span class="comment">//&nbsp;Get&nbsp;all&nbsp;of&nbsp;the&nbsp;user&#39;s&nbsp;rating&nbsp;pairs</span><span>&nbsp;</span></span></li><li class="alt"><span><span class="vars">$sql</span><span>&nbsp;=&nbsp;&quot;SELECT&nbsp;DISTINCT&nbsp;r.itemID,&nbsp;r2.ratingValue&nbsp;-&nbsp;r.ratingValue&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">as</span><span>&nbsp;rating_difference&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;rating&nbsp;r,&nbsp;rating&nbsp;r2&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE&nbsp;r.userID=<span class="vars">$userID</span><span>&nbsp;AND&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2.itemID=<span class="vars">$itemID</span><span>&nbsp;AND&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2.userID=<span class="vars">$userID</span><span>;&quot;;&nbsp;</span></span></li><li class="alt"><span><span class="vars">$db_result</span><span>&nbsp;=&nbsp;mysql_query(</span><span class="vars">$sql</span><span>,&nbsp;</span><span class="vars">$connection</span><span>);&nbsp;</span></span></li><li><span><span class="vars">$num_rows</span><span>&nbsp;=&nbsp;mysql_num_rows(</span><span class="vars">$db_result</span><span>);&nbsp;</span></span></li><li class="alt"><span><span class="comment">//For&nbsp;every&nbsp;one&nbsp;of&nbsp;the&nbsp;user&#39;s&nbsp;rating&nbsp;pairs,&nbsp;</span><span>&nbsp;</span></span></li><li><span><span class="comment">//update&nbsp;the&nbsp;dev&nbsp;table</span><span>&nbsp;</span></span></li><li class="alt"><span><span class="keyword">while</span><span>&nbsp;(</span><span class="vars">$row</span><span>&nbsp;=&nbsp;mysql_fetch_assoc(</span><span class="vars">$db_result</span><span>))&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$other_itemID</span><span>&nbsp;=&nbsp;</span><span class="vars">$row</span><span>[</span><span class="string">&quot;itemID&quot;</span><span>];&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$rating_difference</span><span>&nbsp;=&nbsp;</span><span class="vars">$row</span><span>[</span><span class="string">&quot;rating_difference&quot;</span><span>];&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//if&nbsp;the&nbsp;pair&nbsp;($itemID,&nbsp;$other_itemID)&nbsp;is&nbsp;already&nbsp;in&nbsp;the&nbsp;dev&nbsp;table</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//then&nbsp;we&nbsp;want&nbsp;to&nbsp;update&nbsp;2&nbsp;rows.</span><span>&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(mysql_num_rows(mysql_query(&quot;SELECT&nbsp;itemID1&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;dev&nbsp;WHERE&nbsp;itemID1=<span class="vars">$itemID</span><span>&nbsp;AND&nbsp;itemID2=</span><span class="vars">$other_itemID</span><span>&quot;,&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$connection</span><span>))&nbsp;&gt;&nbsp;0)&nbsp;&nbsp;{&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$sql</span><span>&nbsp;=&nbsp;&quot;UPDATE&nbsp;dev&nbsp;SET&nbsp;</span><span class="func">count</span><span>=</span><span class="func">count</span><span>+1,&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;sum=sum+<span class="vars">$rating_difference</span><span>&nbsp;WHERE&nbsp;itemID1=</span><span class="vars">$itemID</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;AND&nbsp;itemID2=<span class="vars">$other_itemID</span><span>&quot;;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql_query(<span class="vars">$sql</span><span>,&nbsp;</span><span class="vars">$connection</span><span>);&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//We&nbsp;only&nbsp;want&nbsp;to&nbsp;update&nbsp;if&nbsp;the&nbsp;items&nbsp;are&nbsp;different&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(</span><span class="vars">$itemID</span><span>&nbsp;!=&nbsp;</span><span class="vars">$other_itemID</span><span>)&nbsp;{&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$sql</span><span>&nbsp;=&nbsp;&quot;UPDATE&nbsp;dev&nbsp;SET&nbsp;</span><span class="func">count</span><span>=</span><span class="func">count</span><span>+1,&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum=sum-<span class="vars">$rating_difference</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE&nbsp;(itemID1=<span class="vars">$other_itemID</span><span>&nbsp;AND&nbsp;itemID2=</span><span class="vars">$itemID</span><span>)&quot;;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql_query(<span class="vars">$sql</span><span>,&nbsp;</span><span class="vars">$connection</span><span>);&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>&nbsp;{&nbsp;</span><span class="comment">//we&nbsp;want&nbsp;to&nbsp;insert&nbsp;2&nbsp;rows&nbsp;into&nbsp;the&nbsp;dev&nbsp;table</span><span>&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$sql</span><span>&nbsp;=&nbsp;&quot;INSERT&nbsp;INTO&nbsp;dev&nbsp;VALUES&nbsp;(</span><span class="vars">$itemID</span><span>,&nbsp;</span><span class="vars">$other_itemID</span><span>,&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;<span class="vars">$rating_difference</span><span>)&quot;;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql_query(<span class="vars">$sql</span><span>,&nbsp;</span><span class="vars">$connection</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//We&nbsp;only&nbsp;want&nbsp;to&nbsp;insert&nbsp;if&nbsp;the&nbsp;items&nbsp;are&nbsp;different&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(</span><span class="vars">$itemID</span><span>&nbsp;!=&nbsp;</span><span class="vars">$other_itemID</span><span>)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$sql</span><span>&nbsp;=&nbsp;&quot;INSERT&nbsp;INTO&nbsp;dev&nbsp;VALUES&nbsp;(</span><span class="vars">$other_itemID</span><span>,&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$itemID</span><span>,&nbsp;1,&nbsp;-</span><span class="vars">$rating_difference</span><span>)&quot;;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql_query(<span class="vars">$sql</span><span>,&nbsp;</span><span class="vars">$connection</span><span>);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li><span>}&nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span><span class="keyword">function</span><span>&nbsp;predict(</span><span class="vars">$userID</span><span>,&nbsp;</span><span class="vars">$itemID</span><span>)&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">global</span><span>&nbsp;</span><span class="vars">$connection</span><span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$denom</span><span>&nbsp;=&nbsp;0.0;&nbsp;</span><span class="comment">//denominator</span><span>&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$numer</span><span>&nbsp;=&nbsp;0.0;&nbsp;</span><span class="comment">//numerator&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$k</span><span>&nbsp;=&nbsp;</span><span class="vars">$itemID</span><span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$sql</span><span>&nbsp;=&nbsp;&quot;SELECT&nbsp;r.itemID,&nbsp;r.ratingValue&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;rating&nbsp;r&nbsp;WHERE&nbsp;r.userID=<span class="vars">$userID</span><span>&nbsp;AND&nbsp;r.itemID&nbsp;&lt;&gt;&nbsp;</span><span class="vars">$itemID</span><span>&quot;;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$db_result</span><span>&nbsp;=&nbsp;mysql_query(</span><span class="vars">$sql</span><span>,&nbsp;</span><span class="vars">$connection</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//for&nbsp;all&nbsp;items&nbsp;the&nbsp;user&nbsp;has&nbsp;rated</span><span>&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">while</span><span>&nbsp;(</span><span class="vars">$row</span><span>&nbsp;=&nbsp;mysql_fetch_assoc(</span><span class="vars">$db_result</span><span>))&nbsp;&nbsp;{&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$j</span><span>&nbsp;=&nbsp;</span><span class="vars">$row</span><span>[</span><span class="string">&quot;itemID&quot;</span><span>];&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$ratingValue</span><span>&nbsp;=&nbsp;</span><span class="vars">$row</span><span>[</span><span class="string">&quot;ratingValue&quot;</span><span>];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//get&nbsp;the&nbsp;number&nbsp;of&nbsp;times&nbsp;k&nbsp;and&nbsp;j&nbsp;have&nbsp;both&nbsp;been&nbsp;rated&nbsp;by&nbsp;the&nbsp;same&nbsp;user</span><span>&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$sql2</span><span>&nbsp;=&nbsp;</span><span class="string">&quot;SELECT&nbsp;d.count,&nbsp;d.sum&nbsp;FROM&nbsp;dev&nbsp;d&nbsp;WHERE&nbsp;itemID1=$k&nbsp;AND&nbsp;itemID2=$j&quot;</span><span>;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$count_result</span><span>&nbsp;=&nbsp;mysql_query(</span><span class="vars">$sql2</span><span>,&nbsp;</span><span class="vars">$connection</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//skip&nbsp;the&nbsp;calculation&nbsp;if&nbsp;it&nbsp;isn&#39;t&nbsp;found</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(mysql_num_rows(</span><span class="vars">$count_result</span><span>)&nbsp;&gt;&nbsp;0)&nbsp;&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$count</span><span>&nbsp;=&nbsp;mysql_result(</span><span class="vars">$count_result</span><span>,&nbsp;0,&nbsp;</span><span class="string">&quot;count&quot;</span><span>);&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$sum</span><span>&nbsp;=&nbsp;mysql_result(</span><span class="vars">$count_result</span><span>,&nbsp;0,&nbsp;</span><span class="string">&quot;sum&quot;</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//calculate&nbsp;the&nbsp;average</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$average</span><span>&nbsp;=&nbsp;</span><span class="vars">$sum</span><span>&nbsp;/&nbsp;</span><span class="vars">$count</span><span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//increment&nbsp;denominator&nbsp;by&nbsp;count</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$denom</span><span>&nbsp;+=&nbsp;</span><span class="vars">$count</span><span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//increment&nbsp;the&nbsp;numerator</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$numer</span><span>&nbsp;+=&nbsp;</span><span class="vars">$count</span><span>&nbsp;*&nbsp;(</span><span class="vars">$average</span><span>&nbsp;+&nbsp;</span><span class="vars">$ratingValue</span><span>);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(</span><span class="vars">$denom</span><span>&nbsp;==&nbsp;0)&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;0;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;(</span><span class="vars">$numer</span><span>&nbsp;/&nbsp;</span><span class="vars">$denom</span><span>);&nbsp;</span></span></li><li><span>}&nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span><span class="keyword">function</span><span>&nbsp;predict_all(</span><span class="vars">$userID</span><span>&nbsp;)&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$sql2</span><span>&nbsp;=&nbsp;&quot;SELECT&nbsp;d.itemID1&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="string">&#39;item&#39;</span><span>,&nbsp;sum(d.</span><span class="func">count</span><span>)&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="string">&#39;denom&#39;</span><span>,&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;sum(d.sum&nbsp;+&nbsp;d.<span class="func">count</span><span>*r.ratingValue)&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="string">&#39;numer&#39;</span><span>&nbsp;FROM&nbsp;item&nbsp;i,&nbsp;rating&nbsp;r,&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;dev&nbsp;d&nbsp;WHERE&nbsp;r.userID=<span class="vars">$userID</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;AND&nbsp;d.itemID1&lt;&gt;r.itemID&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;AND&nbsp;d.itemID2=r.itemID&nbsp;GROUP&nbsp;BY&nbsp;d.itemID1&quot;;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;mysql_query(</span><span class="vars">$sql2</span><span>,&nbsp;</span><span class="vars">$connection</span><span>);&nbsp;</span></span></li><li><span>}&nbsp;</span></li></ol></pre>
<p>&nbsp;</p>
<p>Java：</p>
<pre><ol class="dp-j"><li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.util.*;&nbsp;</span></span></li><li><span><span class="comment">/**</span>&nbsp;</span></li><li class="alt"><span><span class="comment">*&nbsp;Daniel&nbsp;Lemire</span>&nbsp;</span></li><li><span><span class="comment">*&nbsp;A&nbsp;simple&nbsp;implementation&nbsp;of&nbsp;the&nbsp;weighted&nbsp;slope&nbsp;one</span>&nbsp;</span></li><li class="alt"><span><span class="comment">*&nbsp;algorithm&nbsp;in&nbsp;Java&nbsp;for&nbsp;item-based&nbsp;collaborative&nbsp;</span>&nbsp;</span></li><li><span><span class="comment">*&nbsp;filtering.&nbsp;</span>&nbsp;</span></li><li class="alt"><span><span class="comment">*&nbsp;Assumes&nbsp;Java&nbsp;1.5.</span>&nbsp;</span></li><li><span><span class="comment">*</span>&nbsp;</span></li><li class="alt"><span><span class="comment">*&nbsp;See&nbsp;main&nbsp;function&nbsp;for&nbsp;example.</span>&nbsp;</span></li><li><span><span class="comment">*</span>&nbsp;</span></li><li class="alt"><span><span class="comment">*&nbsp;June&nbsp;1st&nbsp;2006.</span>&nbsp;</span></li><li><span><span class="comment">*&nbsp;Revised&nbsp;by&nbsp;Marco&nbsp;Ponzi&nbsp;on&nbsp;March&nbsp;29th&nbsp;2007</span>&nbsp;</span></li><li class="alt"><span><span class="comment">*/</span><span>&nbsp;</span></span></li><li><span>&nbsp;</span></li><li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;SlopeOne&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String&nbsp;args[]){&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;this&nbsp;is&nbsp;my&nbsp;data&nbsp;base</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Map&lt;UserId,Map&lt;ItemId,Float&gt;&gt;&nbsp;data&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;HashMap&lt;UserId,Map&lt;ItemId,Float&gt;&gt;();&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;items</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;ItemId&nbsp;item1&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;ItemId(</span><span class="string">&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;candy&quot;</span><span>);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;ItemId&nbsp;item2&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;ItemId(</span><span class="string">&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dog&quot;</span><span>);&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;ItemId&nbsp;item3&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;ItemId(</span><span class="string">&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cat&quot;</span><span>);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;ItemId&nbsp;item4&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;ItemId(</span><span class="string">&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;war&quot;</span><span>);&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;ItemId&nbsp;item5&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;ItemId(</span><span class="string">&quot;strange&nbsp;food&quot;</span><span>);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;mAllItems&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;ItemId[]{item1,&nbsp;item2,&nbsp;item3,&nbsp;item4,&nbsp;item5};&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//I&#39;m&nbsp;going&nbsp;to&nbsp;fill&nbsp;it&nbsp;in</span><span>&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;HashMap&lt;ItemId,Float&gt;&nbsp;user1&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;HashMap&lt;ItemId,Float&gt;();&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;HashMap&lt;ItemId,Float&gt;&nbsp;user2&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;HashMap&lt;ItemId,Float&gt;();&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;HashMap&lt;ItemId,Float&gt;&nbsp;user3&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;HashMap&lt;ItemId,Float&gt;();&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;HashMap&lt;ItemId,Float&gt;&nbsp;user4&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;HashMap&lt;ItemId,Float&gt;();&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;user1.put(item1,<span class="number">1</span><span>.0f);&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;user1.put(item2,<span class="number">0</span><span>.5f);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;user1.put(item4,<span class="number">0</span><span>.1f);&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;data.put(<span class="keyword">new</span><span>&nbsp;UserId(</span><span class="string">&quot;Bob&quot;</span><span>),user1);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;user2.put(item1,<span class="number">1</span><span>.0f);&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;user2.put(item3,<span class="number">0</span><span>.5f);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;user2.put(item4,<span class="number">0</span><span>.2f);&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;data.put(<span class="keyword">new</span><span>&nbsp;UserId(</span><span class="string">&quot;Jane&quot;</span><span>),user2);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;user3.put(item1,<span class="number">0</span><span>.9f);&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;user3.put(item2,<span class="number">0</span><span>.4f);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;user3.put(item3,<span class="number">0</span><span>.5f);&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;user3.put(item4,<span class="number">0</span><span>.1f);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;data.put(<span class="keyword">new</span><span>&nbsp;UserId(</span><span class="string">&quot;Jo&quot;</span><span>),user3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;user4.put(item1,<span class="number">0</span><span>.1f);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//user4.put(item2,0.4f);</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//user4.put(item3,0.5f);</span><span>&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;user4.put(item4,<span class="number">1</span><span>.0f);&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;user4.put(item5,<span class="number">0</span><span>.4f);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;data.put(<span class="keyword">new</span><span>&nbsp;UserId(</span><span class="string">&quot;StrangeJo&quot;</span><span>),user4);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;next,&nbsp;I&nbsp;create&nbsp;my&nbsp;predictor&nbsp;engine</span><span>&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;SlopeOne&nbsp;so&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;SlopeOne(data);&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">&quot;Here&#39;s&nbsp;the&nbsp;data&nbsp;I&nbsp;have&nbsp;accumulated...&quot;</span><span>);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;so.printData();&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;then,&nbsp;I&#39;m&nbsp;going&nbsp;to&nbsp;test&nbsp;it&nbsp;out...</span><span>&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;HashMap&lt;ItemId,Float&gt;&nbsp;user&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;HashMap&lt;ItemId,Float&gt;();&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">&quot;Ok,&nbsp;now&nbsp;we&nbsp;predict...&quot;</span><span>);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;user.put(item5,<span class="number">0</span><span>.4f);&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">&quot;Inputting...&quot;</span><span>);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;SlopeOne.print(user);&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">&quot;Getting...&quot;</span><span>);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;SlopeOne.print(so.predict(user));&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//</span><span>&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;user.put(item4,<span class="number">0</span><span>.2f);&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">&quot;Inputting...&quot;</span><span>);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;SlopeOne.print(user);&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">&quot;Getting...&quot;</span><span>);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;SlopeOne.print(so.predict(user));&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;}&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;Map&lt;UserId,Map&lt;ItemId,Float&gt;&gt;&nbsp;mData;&nbsp;</span></li><li><span>&nbsp;&nbsp;Map&lt;ItemId,Map&lt;ItemId,Float&gt;&gt;&nbsp;mDiffMatrix;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;Map&lt;ItemId,Map&lt;ItemId,Integer&gt;&gt;&nbsp;mFreqMatrix;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;<span class="keyword">static</span><span>&nbsp;ItemId[]&nbsp;mAllItems;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;SlopeOne(Map&lt;UserId,Map&lt;ItemId,Float&gt;&gt;&nbsp;data)&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;mData&nbsp;=&nbsp;data;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;buildDiffMatrix();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li><li class="alt"><span><span class="comment">&nbsp;&nbsp;*&nbsp;Based&nbsp;on&nbsp;existing&nbsp;data,&nbsp;and&nbsp;using&nbsp;weights,</span>&nbsp;</span></li><li><span><span class="comment">&nbsp;&nbsp;*&nbsp;try&nbsp;to&nbsp;predict&nbsp;all&nbsp;missing&nbsp;ratings.</span>&nbsp;</span></li><li class="alt"><span><span class="comment">&nbsp;&nbsp;*&nbsp;The&nbsp;trick&nbsp;to&nbsp;make&nbsp;this&nbsp;more&nbsp;scalable&nbsp;is&nbsp;to&nbsp;consider</span>&nbsp;</span></li><li><span><span class="comment">&nbsp;&nbsp;*&nbsp;only&nbsp;mDiffMatrix&nbsp;entries&nbsp;having&nbsp;a&nbsp;large&nbsp;&nbsp;(&gt;1)&nbsp;mFreqMatrix</span>&nbsp;</span></li><li class="alt"><span><span class="comment">&nbsp;&nbsp;*&nbsp;entry.</span>&nbsp;</span></li><li><span><span class="comment">&nbsp;&nbsp;*</span>&nbsp;</span></li><li class="alt"><span><span class="comment">&nbsp;&nbsp;*&nbsp;It&nbsp;will&nbsp;output&nbsp;the&nbsp;prediction&nbsp;0&nbsp;when&nbsp;no&nbsp;prediction&nbsp;is&nbsp;possible.</span>&nbsp;</span></li><li><span><span class="comment">&nbsp;&nbsp;*/</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;Map&lt;ItemId,Float&gt;&nbsp;predict(Map&lt;ItemId,Float&gt;&nbsp;user)&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;HashMap&lt;ItemId,Float&gt;&nbsp;predictions&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;HashMap&lt;ItemId,Float&gt;();&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;HashMap&lt;ItemId,Integer&gt;&nbsp;frequencies&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;HashMap&lt;ItemId,Integer&gt;();&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(ItemId&nbsp;j&nbsp;:&nbsp;mDiffMatrix.keySet())&nbsp;{&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frequencies.put(j,<span class="number">0</span><span>);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;predictions.put(j,<span class="number">0</span><span>.0f);&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(ItemId&nbsp;j&nbsp;:&nbsp;user.keySet())&nbsp;{&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(ItemId&nbsp;k&nbsp;:&nbsp;mDiffMatrix.keySet())&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span><span>&nbsp;{&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">float</span><span>&nbsp;newval&nbsp;=&nbsp;(&nbsp;mDiffMatrix.get(k).get(j).floatValue()&nbsp;+&nbsp;user.get(j).floatValue()&nbsp;)&nbsp;*&nbsp;mFreqMatrix.get(k).get(j).intValue();&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;predictions.put(k,&nbsp;predictions.get(k)+newval);&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frequencies.put(k,&nbsp;frequencies.get(k)+mFreqMatrix.get(k).get(j).intValue());&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch</span><span>(NullPointerException&nbsp;e)&nbsp;{}&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;HashMap&lt;ItemId,Float&gt;&nbsp;cleanpredictions&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;HashMap&lt;ItemId,Float&gt;();&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(ItemId&nbsp;j&nbsp;:&nbsp;predictions.keySet())&nbsp;{&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(frequencies.get(j)&gt;</span><span class="number">0</span><span>)&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cleanpredictions.put(j,&nbsp;predictions.get(j).floatValue()/frequencies.get(j).intValue());&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(ItemId&nbsp;j&nbsp;:&nbsp;user.keySet())&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cleanpredictions.put(j,user.get(j));&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;cleanpredictions;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;}&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li><li><span><span class="comment">&nbsp;&nbsp;*&nbsp;Based&nbsp;on&nbsp;existing&nbsp;data,&nbsp;and&nbsp;not&nbsp;using&nbsp;weights,</span>&nbsp;</span></li><li class="alt"><span><span class="comment">&nbsp;&nbsp;*&nbsp;try&nbsp;to&nbsp;predict&nbsp;all&nbsp;missing&nbsp;ratings.</span>&nbsp;</span></li><li><span><span class="comment">&nbsp;&nbsp;*&nbsp;The&nbsp;trick&nbsp;to&nbsp;make&nbsp;this&nbsp;more&nbsp;scalable&nbsp;is&nbsp;to&nbsp;consider</span>&nbsp;</span></li><li class="alt"><span><span class="comment">&nbsp;&nbsp;*&nbsp;only&nbsp;mDiffMatrix&nbsp;entries&nbsp;having&nbsp;a&nbsp;large&nbsp;&nbsp;(&gt;1)&nbsp;mFreqMatrix</span>&nbsp;</span></li><li><span><span class="comment">&nbsp;&nbsp;*&nbsp;entry.</span>&nbsp;</span></li><li class="alt"><span><span class="comment">&nbsp;&nbsp;*/</span><span>&nbsp;</span></span></li><li><span>&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;Map&lt;ItemId,Float&gt;&nbsp;weightlesspredict(Map&lt;ItemId,Float&gt;&nbsp;user)&nbsp;{&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;HashMap&lt;ItemId,Float&gt;&nbsp;predictions&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;HashMap&lt;ItemId,Float&gt;();&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;HashMap&lt;ItemId,Integer&gt;&nbsp;frequencies&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;HashMap&lt;ItemId,Integer&gt;();&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(ItemId&nbsp;j&nbsp;:&nbsp;mDiffMatrix.keySet())&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;predictions.put(j,<span class="number">0</span><span>.0f);&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frequencies.put(j,<span class="number">0</span><span>);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(ItemId&nbsp;j&nbsp;:&nbsp;user.keySet())&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(ItemId&nbsp;k&nbsp;:&nbsp;mDiffMatrix.keySet())&nbsp;{&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//System.out.println(&quot;Average&nbsp;diff&nbsp;between&nbsp;&quot;+j+&quot;&nbsp;and&nbsp;&quot;+&nbsp;k&nbsp;+&nbsp;&quot;&nbsp;is&nbsp;&quot;+mDiffMatrix.get(k).get(j).floatValue()+&quot;&nbsp;with&nbsp;n&nbsp;=&nbsp;&quot;+mFreqMatrix.get(k).get(j).floatValue());</span><span>&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">float</span><span>&nbsp;newval&nbsp;=&nbsp;(&nbsp;mDiffMatrix.get(k).get(j).floatValue()&nbsp;+&nbsp;user.get(j).floatValue()&nbsp;)&nbsp;;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;predictions.put(k,&nbsp;predictions.get(k)+newval);&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(ItemId&nbsp;j&nbsp;:&nbsp;predictions.keySet())&nbsp;{&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;predictions.put(j,&nbsp;predictions.get(j).floatValue()/user.size());&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(ItemId&nbsp;j&nbsp;:&nbsp;user.keySet())&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;predictions.put(j,user.get(j));&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;predictions;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;}&nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;printData()&nbsp;{&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(UserId&nbsp;user&nbsp;:&nbsp;mData.keySet())&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(user);&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(mData.get(user));&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i=</span><span class="number">0</span><span>;&nbsp;i&lt;mAllItems.length;&nbsp;i++)&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(<span class="string">&quot;\n&quot;</span><span>&nbsp;+&nbsp;mAllItems[i]&nbsp;+&nbsp;</span><span class="string">&quot;:&quot;</span><span>);&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printMatrixes(mDiffMatrix.get(mAllItems[i]),&nbsp;mFreqMatrix.get(mAllItems[i]));&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;printMatrixes(Map&lt;ItemId,Float&gt;&nbsp;ratings,&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&lt;ItemId,Integer&gt;&nbsp;frequencies)&nbsp;{&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;j=</span><span class="number">0</span><span>;&nbsp;j&lt;mAllItems.length;&nbsp;j++)&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.format(<span class="string">&quot;%10.3f&quot;</span><span>,&nbsp;ratings.get(mAllItems[j]));&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(<span class="string">&quot;&nbsp;&quot;</span><span>);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.format(<span class="string">&quot;%10d&quot;</span><span>,&nbsp;frequencies.get(mAllItems[j]));&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println();&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;print(Map&lt;ItemId,Float&gt;&nbsp;user)&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(ItemId&nbsp;j&nbsp;:&nbsp;user.keySet())&nbsp;{&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">&quot;&nbsp;&quot;</span><span>+&nbsp;j+&nbsp;</span><span class="string">&quot;&nbsp;--&gt;&nbsp;&quot;</span><span>+user.get(j).floatValue());&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;}&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;buildDiffMatrix()&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;mDiffMatrix&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;HashMap&lt;ItemId,Map&lt;ItemId,Float&gt;&gt;();&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;mFreqMatrix&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;HashMap&lt;ItemId,Map&lt;ItemId,Integer&gt;&gt;();&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;first&nbsp;iterate&nbsp;through&nbsp;users</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(Map&lt;ItemId,Float&gt;&nbsp;user&nbsp;:&nbsp;mData.values())&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;then&nbsp;iterate&nbsp;through&nbsp;user&nbsp;data</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(Map.Entry&lt;ItemId,Float&gt;&nbsp;entry:&nbsp;user.entrySet())&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(!mDiffMatrix.containsKey(entry.getKey()))&nbsp;{&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mDiffMatrix.put(entry.getKey(),&nbsp;<span class="keyword">new</span><span>&nbsp;HashMap&lt;ItemId,Float&gt;());&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mFreqMatrix.put(entry.getKey(),&nbsp;<span class="keyword">new</span><span>&nbsp;HashMap&lt;ItemId,Integer&gt;());&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(Map.Entry&lt;ItemId,Float&gt;&nbsp;entry2:&nbsp;user.entrySet())&nbsp;{&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;oldcount&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(mFreqMatrix.get(entry.getKey()).containsKey(entry2.getKey()))&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oldcount&nbsp;=&nbsp;mFreqMatrix.get(entry.getKey()).get(entry2.getKey()).intValue();&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">float</span><span>&nbsp;olddiff&nbsp;=&nbsp;</span><span class="number">0</span><span>.0f;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(mDiffMatrix.get(entry.getKey()).containsKey(entry2.getKey()))&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;olddiff&nbsp;=&nbsp;mDiffMatrix.get(entry.getKey()).get(entry2.getKey()).floatValue();&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">float</span><span>&nbsp;observeddiff&nbsp;=&nbsp;entry.getValue()&nbsp;-&nbsp;entry2.getValue();&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mFreqMatrix.get(entry.getKey()).put(entry2.getKey(),oldcount&nbsp;+&nbsp;<span class="number">1</span><span>);&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mDiffMatrix.get(entry.getKey()).put(entry2.getKey(),olddiff+observeddiff);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(ItemId&nbsp;j&nbsp;:&nbsp;mDiffMatrix.keySet())&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(ItemId&nbsp;i&nbsp;:&nbsp;mDiffMatrix.get(j).keySet())&nbsp;{&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">float</span><span>&nbsp;oldvalue&nbsp;=&nbsp;mDiffMatrix.get(j).get(i).floatValue();&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;count&nbsp;=&nbsp;mFreqMatrix.get(j).get(i).intValue();&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mDiffMatrix.get(j).put(i,oldvalue/count);&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li><span>&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>}&nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span><span class="keyword">class</span><span>&nbsp;UserId&nbsp;&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;String&nbsp;content;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;UserId(String&nbsp;s)&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;content&nbsp;=&nbsp;s;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;}&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;hashCode()&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;content.hashCode();}&nbsp;</span></span></li><li><span>&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;String&nbsp;toString()&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;content;&nbsp;}&nbsp;</span></span></li><li class="alt"><span>}&nbsp;</span></li><li><span><span class="keyword">class</span><span>&nbsp;ItemId&nbsp;&nbsp;{&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;String&nbsp;content;&nbsp;</span></li><li><span>&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;ItemId(String&nbsp;s)&nbsp;{&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;content&nbsp;=&nbsp;s;&nbsp;</span></li><li><span>&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;hashCode()&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;content.hashCode();}&nbsp;</span></span></li><li><span>&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;String&nbsp;toString()&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;content;&nbsp;}&nbsp;</span></span></li><li class="alt"><span>}&nbsp;</span></li></ol></pre>
<p>&nbsp;</p>
<p>Python：</p>
<pre><ol class="dp-py"><li class="alt"><span><span class="comment">#&nbsp;Copyright&nbsp;2006&nbsp;Bryan&nbsp;O&#39;Sullivan&nbsp;&lt;bos@serpentine.com&gt;.</span><span>&nbsp;</span></span></li><li><span><span class="comment">#</span><span>&nbsp;</span></span></li><li class="alt"><span><span class="comment">#&nbsp;This&nbsp;software&nbsp;may&nbsp;be&nbsp;used&nbsp;and&nbsp;distributed&nbsp;according&nbsp;to&nbsp;the&nbsp;terms</span><span>&nbsp;</span></span></li><li><span><span class="comment">#&nbsp;of&nbsp;the&nbsp;GNU&nbsp;General&nbsp;Public&nbsp;License,&nbsp;version&nbsp;2&nbsp;or&nbsp;later,&nbsp;which&nbsp;is</span><span>&nbsp;</span></span></li><li class="alt"><span><span class="comment">#&nbsp;incorporated&nbsp;herein&nbsp;by&nbsp;reference.</span><span>&nbsp;</span></span></li><li><span>&nbsp;</span></li><li class="alt"><span><span class="keyword">class</span><span>&nbsp;SlopeOne(object):&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;__init__(</span><span class="special">self</span><span>):&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="special">self</span><span>.diffs&nbsp;=&nbsp;{}&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="special">self</span><span>.freqs&nbsp;=&nbsp;{}&nbsp;</span></span></li><li class="alt"><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;predict(</span><span class="special">self</span><span>,&nbsp;userprefs):&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;preds,&nbsp;freqs&nbsp;=&nbsp;{},&nbsp;{}&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;item,&nbsp;rating&nbsp;</span><span class="keyword">in</span><span>&nbsp;userprefs.iteritems():&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;diffitem,&nbsp;diffratings&nbsp;</span><span class="keyword">in</span><span>&nbsp;</span><span class="special">self</span><span>.diffs.iteritems():&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span><span>:&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freq&nbsp;=&nbsp;<span class="special">self</span><span>.freqs[diffitem][item]&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">except</span><span>&nbsp;KeyError:&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">continue</span><span>&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;preds.setdefault(diffitem,&nbsp;<span class="number">0.0</span><span>)&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freqs.setdefault(diffitem,&nbsp;<span class="number">0</span><span>)&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;preds[diffitem]&nbsp;+=&nbsp;freq&nbsp;*&nbsp;(diffratings[item]&nbsp;+&nbsp;rating)&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freqs[diffitem]&nbsp;+=&nbsp;freq&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;dict([(item,&nbsp;value&nbsp;/&nbsp;freqs[item])&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;item,&nbsp;value&nbsp;</span><span class="keyword">in</span><span>&nbsp;preds.iteritems()&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;item&nbsp;</span><span class="keyword">not</span><span>&nbsp;</span><span class="keyword">in</span><span>&nbsp;userprefs&nbsp;</span><span class="keyword">and</span><span>&nbsp;freqs[item]&nbsp;&gt;&nbsp;</span><span class="number">0</span><span>])&nbsp;</span></span></li><li class="alt"><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;update(</span><span class="special">self</span><span>,&nbsp;userdata):&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;ratings&nbsp;</span><span class="keyword">in</span><span>&nbsp;userdata.itervalues():&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;item1,&nbsp;rating1&nbsp;</span><span class="keyword">in</span><span>&nbsp;ratings.iteritems():&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="special">self</span><span>.freqs.setdefault(item1,&nbsp;{})&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="special">self</span><span>.diffs.setdefault(item1,&nbsp;{})&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;item2,&nbsp;rating2&nbsp;</span><span class="keyword">in</span><span>&nbsp;ratings.iteritems():&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="special">self</span><span>.freqs[item1].setdefault(item2,&nbsp;</span><span class="number">0</span><span>)&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="special">self</span><span>.diffs[item1].setdefault(item2,&nbsp;</span><span class="number">0.0</span><span>)&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="special">self</span><span>.freqs[item1][item2]&nbsp;+=&nbsp;</span><span class="number">1</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="special">self</span><span>.diffs[item1][item2]&nbsp;+=&nbsp;rating1&nbsp;-&nbsp;rating2&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;item1,&nbsp;ratings&nbsp;</span><span class="keyword">in</span><span>&nbsp;</span><span class="special">self</span><span>.diffs.iteritems():&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;item2&nbsp;</span><span class="keyword">in</span><span>&nbsp;ratings:&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ratings[item2]&nbsp;/=&nbsp;<span class="special">self</span><span>.freqs[item1][item2]&nbsp;</span></span></li><li class="alt"><span>&nbsp;</span></li><li><span><span class="keyword">if</span><span>&nbsp;__name__&nbsp;==&nbsp;</span><span class="string">&#39;__main__&#39;</span><span>:&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;userdata&nbsp;=&nbsp;dict(&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alice=dict(squid=<span class="number">1.0</span><span>,&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cuttlefish=<span class="number">0.5</span><span>,&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;octopus=<span class="number">0.2</span><span>),&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bob=dict(squid=<span class="number">1.0</span><span>,&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;octopus=<span class="number">0.5</span><span>,&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nautilus=<span class="number">0.2</span><span>),&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;carole=dict(squid=<span class="number">0.2</span><span>,&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;octopus=<span class="number">1.0</span><span>,&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cuttlefish=<span class="number">0.4</span><span>,&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nautilus=<span class="number">0.4</span><span>),&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dave=dict(cuttlefish=<span class="number">0.9</span><span>,&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;octopus=<span class="number">0.4</span><span>,&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nautilus=<span class="number">0.5</span><span>),&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;=&nbsp;SlopeOne()&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;s.update(userdata)&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">print</span><span>&nbsp;s.predict(dict(squid=</span><span class="number">0.4</span><span>))&nbsp;</span></span></li></ol></pre>
<p>&nbsp;</p>
<p>&nbsp;=-========================== 延伸文章===========================</p>
<p><span style="color: rgb(192, 192, 192); ">来源 ：&nbsp;</span><a href="http://my.donews.com/clickstone/2006/10/16/fktEQWUckzvGDyfjugcqcJjkaDpdjemooGTf/"><span style="color: rgb(192, 192, 192); ">http://my.donews.com/clickstone/2006/10/16/fktEQWUckzvGDyfjugcqcJjkaDpdjemooGTf/</span></a></p>
<p>&nbsp;</p>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; "><em><font face="宋体" size="2">本文是关于推荐系统的系列研究文章之一，其他内容将陆续发布。这些内容，大多数来自我在2004年底完成的一篇项目方案建议书。放在这里，抛砖引玉，供大家讨论之用。<br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</font></em></p>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">在推荐系统简介中，我们给出了推荐系统的一般框架。很明显，推荐方法是整个推荐系统中最核心、最关键的部分，很大程度上决定了推荐系统性能的优劣。目前，主要的推荐方法包括：基于内容推荐、协同过滤推荐、基于关联规则推荐、基于效用推荐、基于知识推荐和组合推荐。</p>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; "><font face="黑体" size="3">一、基于内容推荐</font></p>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">基于内容的推荐（Content-based Recommendation）是信息过滤技术的延续与发展，它是建立在项目的内容信息上作出推荐的，而不需要依据用户对项目的评价意见，更多地需要用机 器学习的方法从关于内容的特征描述的事例中得到用户的兴趣资料。在基于内容的推荐系统中，项目或对象是通过相关的特征的属性来定义，系统基于用户评价对象 的特征，学习用户的兴趣，考察用户资料与待预测项目的相匹配程度。用户的资料模型取决于所用学习方法，常用的有决策树、神经网络和基于向量的表示方法等。 基于内容的用户资料是需要有用户的历史数据，用户资料模型可能随着用户的偏好改变而发生变化。</p>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">基于内容推荐方法的优点是：<br />
 1）不需要其它用户的数据，没有冷开始问题和稀疏问题。<br />
 2）能为具有特殊兴趣爱好的用户进行推荐。<br />
 3）能推荐新的或不是很流行的项目，没有新项目问题。<br />
 4）通过列出推荐项目的内容特征，可以解释为什么推荐那些项目。<br />
 5）已有比较好的技术，如关于分类学习方面的技术已相当成熟。</p>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">缺点是要求内容能容易抽取成有意义的特征，要求特征内容有良好的结构性，并且用户的口味必须能够用内容特征形式来表达，不能显式地得到其它用户的判断情况。</p>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; "><font face="黑体" size="3">二、协同过滤推荐</font></p>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">协同过滤推荐（Collaborative Filtering Recommendation）技术是推荐系统中应用最早和最为成功的技术之一。它一般采用最近邻技术，利用用户的历史喜好信息计算用户之间的距离，然后 利用目标用户的最近邻居用户对商品评价的加权评价值来预测目标用户对特定商品的喜好程度，系统从而根据这一喜好程度来对目标用户进行推荐。协同过滤最大优 点是对推荐对象没有特殊的要求，能处理非结构化的复杂对象，如音乐、电影。</p>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">协同过滤是基于这样的假设：为一用户找到他真正感兴趣的内容的好方法是首先找到与此用户有相似兴趣的其他用户，然后将他们感兴趣的内容推荐给此用 户。其基本思想非常易于理解，在日常生活中，我们往往会利用好朋友的推荐来进行一些选择。协同过滤正是把这一思想运用到电子商务推荐系统中来，基于其他用 户对某一内容的评价来向目标用户进行推荐。</p>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">基于协同过滤的推荐系统可以说是从用户的角度来进行相应推荐的，而且是自动的，即用户获得的推荐是系统从购买模式或浏览行为等隐式获得的，不需要用户努力地找到适合自己兴趣的推荐信息，如填写一些调查表格等。</p>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">和基于内容的过滤方法相比，协同过滤具有如下的优点：<br />
1） 能够过滤难以进行机器自动内容分析的信息，如艺术品，音乐等。<br />
2） 共享其他人的经验，避免了内容分析的不完全和不精确，并且能够基于一些复杂的，难以表述的概念（如信息质量、个人品味）进行过滤。<br />
3） 有推荐新信息的能力。可以发现内容上完全不相似的信息，用户对推荐信息的内容事先是预料不到的。这也是协同过滤和基于内容的过滤一个较大的差别，基于内容的过滤推荐很多都是用户本来就熟悉的内容，而协同过滤可以发现用户潜在的但自己尚未发现的兴趣偏好。<br />
4） 能够有效的使用其他相似用户的反馈信息，较少用户的反馈量，加快个性化学习的速度。</p>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">虽然协同过滤作为一种典型的推荐技术有其相当的应用，但协同过滤仍有许多的问题需要解决。最典型的问题有稀疏问题（Sparsity）和可扩展问题（Scalability）。</p>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; "><font face="黑体" size="3">三、基于关联规则推荐</font></p>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">基于关联规则的推荐（Association Rule-based Recommendation）是以关联规则为基础，把已购商品作为规则头，规则体为推荐对象。关联规则挖掘可以发现不同商品在销售过程中的相关性，在零 售业中已经得到了成功的应用。管理规则就是在一个交易数据库中统计购买了商品集X的交易中有多大比例的交易同时购买了商品集Y，其直观的意义就是用户在购 买某些商品的时候有多大倾向去购买另外一些商品。比如购买牛奶的同时很多人会同时购买面包。</p>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">算法的第一步关联规则的发现最为关键且最耗时，是算法的瓶颈，但可以离线进行。其次，商品名称的同义性问题也是关联规则的一个难点。</p>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; "><font face="黑体" size="3">四、基于效用推荐</font></p>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">基于效用的推荐（Utility-based Recommendation）是建立在对用户使用项目的效用情况上计算的，其核心问题是怎么样为每一个用户去创建一个效用函数，因此，用户资料模型很大 程度上是由系统所采用的效用函数决定的。基于效用推荐的好处是它能把非产品的属性，如提供商的可靠性（Vendor Reliability）和产品的可得性（Product Availability）等考虑到效用计算中。</p>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; "><font face="黑体" size="3">五、基于知识推荐</font></p>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">基于知识的推荐（Knowledge-based Recommendation）在某种程度是可以看成是一种推理（Inference）技术，它不是建立在用户需要和偏好基础上推荐的。基于知识的方法因 它们所用的功能知识不同而有明显区别。效用知识（Functional Knowledge）是一种关于一个项目如何满足某一特定用户的知识，因此能解释需要和推荐的关系，所以用户资料可以是任何能支持推理的知识结构，它可以 是用户已经规范化的查询，也可以是一个更详细的用户需要的表示。</p>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; "><font face="黑体" size="3">六、组合推荐</font></p>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">由于各种推荐方法都有优缺点，所以在实际中，组合推荐（Hybrid Recommendation）经常被采用。研究和应用最多的是内容推荐和协同过滤推荐的组合。最简单的做法就是分别用基于内容的方法和协同过滤推荐方法 去产生一个推荐预测结果，然后用某方法组合其结果。尽管从理论上有很多种推荐组合方法，但在某一具体问题中并不见得都有效，组合推荐一个最重要原则就是通 过组合后要能避免或弥补各自推荐技术的弱点。</p>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">在组合方式上，有研究人员提出了七种组合思路：<br />
1）加权（Weight）：加权多种推荐技术结果。<br />
2）变换（Switch）：根据问题背景和实际情况或要求决定变换采用不同的推荐技术。<br />
3）混合（Mixed）：同时采用多种推荐技术给出多种推荐结果为用户提供参考。<br />
4）特征组合（Feature combination）：组合来自不同推荐数据源的特征被另一种推荐算法所采用。<br />
5）层叠（Cascade）：先用一种推荐技术产生一种粗糙的推荐结果，第二种推荐技术在此推荐结果的基础上进一步作出更精确的推荐。<br />
6）特征扩充（Feature augmentation）：一种技术产生附加的特征信息嵌入到另一种推荐技术的特征输入中。<br />
7）元级别（Meta-level）：用一种推荐方法产生的模型作为另一种推荐方法的输入。<br />
<font face="黑体" size="3">七、主要推荐方法的对比</font></p>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">各种推荐方法都有其各自的优点和缺点，见表1。</p>
<table border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td colspan="3">
            <p align="center" style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">表1 主要推荐方法对比</p>
            </td>
        </tr>
        <tr>
            <td>推荐方法</td>
            <td>优点</td>
            <td>缺点</td>
        </tr>
        <tr>
            <td>基于内容推荐</td>
            <td>推荐结果直观，容易解释；
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">&nbsp;</p>
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">不需要领域知识</p>
            </td>
            <td>新用户问题；
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">&nbsp;</p>
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">复杂属性不好处理；</p>
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">要有足够数据构造分类器</p>
            </td>
        </tr>
        <tr>
            <td>协同过滤推荐</td>
            <td>新异兴趣发现、不需要领域知识；
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">&nbsp;</p>
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">随着时间推移性能提高；</p>
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">推荐个性化、自动化程度高；</p>
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">能处理复杂的非结构化对象</p>
            </td>
            <td>稀疏问题；
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">&nbsp;</p>
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">可扩展性问题；</p>
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">新用户问题；</p>
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">质量取决于历史数据集；</p>
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">系统开始时推荐质量差；</p>
            </td>
        </tr>
        <tr>
            <td>基于规则推荐</td>
            <td>能发现新兴趣点；
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">&nbsp;</p>
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">不要领域知识</p>
            </td>
            <td>规则抽取难、耗时；
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">&nbsp;</p>
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">产品名同义性问题；</p>
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">个性化程度低；</p>
            </td>
        </tr>
        <tr>
            <td>基于效用推荐</td>
            <td>无冷开始和稀疏问题；
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">&nbsp;</p>
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">对用户偏好变化敏感；</p>
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">能考虑非产品特性</p>
            </td>
            <td>用户必须输入效用函数；
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">&nbsp;</p>
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">推荐是静态的，灵活性差；</p>
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">属性重叠问题；</p>
            </td>
        </tr>
        <tr>
            <td>基于知识推荐</td>
            <td>能把用户需求映射到产品上；
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">&nbsp;</p>
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">能考虑非产品属性</p>
            </td>
            <td>知识难获得；
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">&nbsp;</p>
            <p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 0.8em; margin-left: 1em; line-height: 1.5em; ">推荐是静态的</p>
            <div>&nbsp;</div>
            </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p></p></p></p>]]></description>
</item>
<item>
<title><![CDATA[利用 StarUML 创建 AS3 代码]]></title>
<link>http://www.xintend.com/Article/staruml_to_as3.aspx</link>
<category><![CDATA[开发者]]></category>
<author>KingFo</author>
<pubDate>2010-02-27 15:43:33Z</pubDate>
<description><![CDATA[<p>最近在搜寻轻量好用且免费的UML工具，且最好能产生AS3代码的。&nbsp; 于是 StrarUML 进入我的视野。</p>
<p>在此处可以找到原文阐述如何使用此款软件: <a href="http://www.senocular.com/flash/tutorials/starumltoas3/">http://www.senocular.com/flash/tutorials/starumltoas3/</a></p>
<p>关键安装方式是：</p>
<ol>
    <li>下载 StrarUML <a href="http://www.staruml.com/">http://www.staruml.com/</a>&nbsp;。</li>
    <li>下载 AS3 代码生成模板&nbsp; <a href="http://www.senocular.com/flash/tutorials/starumltoas3/downloads/StarUML_ActionScript3_Export.zip">http://www.senocular.com/flash/tutorials/starumltoas3/downloads/StarUML_ActionScript3_Export.zip</a></li>
    <li>进入 StrarUML&nbsp;&nbsp; 所在的安装目录下 \modules\staruml-generator\templates 处将 模板中 ActionScript 3.0 整个文件夹放入到这里。<br />
    最后可以得到如下2个路径：&nbsp; <br />
    &lt;StarUML 安装目录&gt;\modules\staruml-generator\templates<font face="Courier New">\ActionScript 3.0\template description.tdf<br />
    <font face="Arial">&lt;StarUML 安装目录&gt;\modules\staruml-generator\templates</font><font face="Courier New">\ActionScript 3.0\template.cot</font></font></li>
</ol>
<p><font face="Courier New"><font face="Courier New"><font face="Arial">关键</font>使用方式：</font></font></p>
<ol>
    <li><font face="Courier New"><font face="Courier New">启动StarUML 并打开你要导出代码的 UML 视图。</font></font></li>
    <li><font face="Courier New"><font face="Courier New">选择&nbsp; Tools &gt; StarUML Generator</font></font></li>
    <li><font face="Courier New"><font face="Courier New">勾上 模板列表（list of template）中文档名(Document Name)为 ActionScript 3.0 选项。</font></font></li>
    <li><font face="Courier New"><font face="Courier New">点下 next</font></font></li>
    <li><font face="Courier New"><font face="Courier New">此时面板会让你选择导出路径。自己选择吧，比如直接可以倒入到 Src中。</font></font></li>
    <li><font face="Courier New"><font face="Courier New">选择完毕后点下 next</font></font></li>
    <li><font face="Courier New"><font face="Courier New">此时，会等待你决定是否立即产出代码</font></font></li>
    <li><font face="Courier New"><font face="Courier New">点Generate 即可。</font></font></li>
</ol>
<p>StarUML AS3例子：<br />
<a href="http://www.senocular.com/flash/tutorials/starumltoas3/downloads/Gallery.uml">http://www.senocular.com/flash/tutorials/starumltoas3/downloads/Gallery.uml</a></p>
<p>&nbsp;</p>
<p>另外再提供UML学习指南：<a href="http://www.uml.org.cn/oobject/OObject.asp">http://www.uml.org.cn/oobject/OObject.asp</a></p>
<p>&nbsp;</p>]]></description>
</item>
<item>
<title><![CDATA[JavaScript Core namespace]]></title>
<link>http://www.xintend.com/Article/javascript_core_namespace.aspx</link>
<category><![CDATA[开发者]]></category>
<author>KingFo</author>
<pubDate>2010-01-20 10:28:28Z</pubDate>
<description><![CDATA[<p>&nbsp;</p>
<script type="text/javascript" src="http://assets.taobaocdn.com/app/tms/tms-edit-link.js"></script>
<table width="90%" cellspacing="2">
    <tbody>
        <tr class="compheader">
            <th style="text-align: left;">Class</th>
            <th class="browser">IE<br />
            <img browser="IE" src="http://127.0.0.1:51045/help/nftopic/com.aptana.ide.documentation/content/button_off.gif" onclick="toggleRows(&quot;IE&quot;, this)" style="padding-top: 5px;" title="Hide items not available on this platform" alt="" /></th>
            <th class="browser">Mozilla<br />
            <img browser="Mozilla" src="http://127.0.0.1:51045/help/nftopic/com.aptana.ide.documentation/content/button_off.gif" onclick="toggleRows(&quot;Mozilla&quot;, this)" style="padding-top: 5px;" title="Hide items not available on this platform" alt="" /></th>
            <th class="browser">Netscape<br />
            <img browser="Netscape" src="http://127.0.0.1:51045/help/nftopic/com.aptana.ide.documentation/content/button_off.gif" onclick="toggleRows(&quot;Netscape&quot;, this)" style="padding-top: 5px;" title="Hide items not available on this platform" alt="" /></th>
            <th class="browser">Opera<br />
            <img browser="Opera" src="http://127.0.0.1:51045/help/nftopic/com.aptana.ide.documentation/content/button_off.gif" onclick="toggleRows(&quot;Opera&quot;, this)" style="padding-top: 5px;" title="Hide items not available on this platform" alt="" /></th>
            <th class="browser">Safari<br />
            <img browser="Safari" src="http://127.0.0.1:51045/help/nftopic/com.aptana.ide.documentation/content/button_off.gif" onclick="toggleRows(&quot;Safari&quot;, this)" style="padding-top: 5px;" title="Hide items not available on this platform" alt="" /></th>
        </tr>
        <tr>
            <td class="declaration">
            <div class="name"><a href="Arguments.html">Arguments</a></div>
            <div class="description">An array of parameters passed to a function.</div>
            </td>
            <td align="middle" title="IE" class="comparison yes">4.0+</td>
            <td align="middle" title="Mozilla" class="comparison yes">1.0+</td>
            <td align="middle" title="Netscape" class="comparison yes">3.0+</td>
            <td align="middle" title="Opera" class="comparison yes">7.0+</td>
            <td align="middle" title="Safari" class="comparison yes">1.0+</td>
        </tr>
        <tr>
            <td class="declaration">
            <div class="name"><a href="Array.html">Array</a></div>
            <div class="description">An array is an ordered list of elements.</div>
            </td>
            <td align="middle" title="IE" class="comparison yes">4.0+</td>
            <td align="middle" title="Mozilla" class="comparison yes">1.0+</td>
            <td align="middle" title="Netscape" class="comparison yes">3.0+</td>
            <td align="middle" title="Opera" class="comparison yes">7.0+</td>
            <td align="middle" title="Safari" class="comparison yes">1.0+</td>
        </tr>
        <tr>
            <td class="declaration">
            <div class="name"><a href="Boolean.html">Boolean</a></div>
            <div class="description">The Boolean object is an object wrapper for a boolean  value.</div>
            </td>
            <td align="middle" title="IE" class="comparison yes">3.0+</td>
            <td align="middle" title="Mozilla" class="comparison yes">1.0+</td>
            <td align="middle" title="Netscape" class="comparison yes">3.0+</td>
            <td align="middle" title="Opera" class="comparison yes">7.0+</td>
            <td align="middle" title="Safari" class="comparison yes">1.0+</td>
        </tr>
        <tr>
            <td class="declaration">
            <div class="name"><a href="Date.html">Date</a></div>
            <div class="description">Lets you work with dates and times.</div>
            </td>
            <td align="middle" title="IE" class="comparison yes">3.0+</td>
            <td align="middle" title="Mozilla" class="comparison yes">1.0+</td>
            <td align="middle" title="Netscape" class="comparison yes">2.0+</td>
            <td align="middle" title="Opera" class="comparison yes">7.0+</td>
            <td align="middle" title="Safari" class="comparison yes">1.0+</td>
        </tr>
        <tr>
            <td class="declaration">
            <div class="name"><a href="Enumerator.html">Enumerator</a></div>
            <div class="description">Enumerator is a proprietary Microsoft object that  iterates over items in a group.</div>
            </td>
            <td align="middle" title="IE" class="comparison yes">4.0+</td>
            <td align="middle" title="Mozilla" class="comparison no">no</td>
            <td align="middle" title="Netscape" class="comparison no">no</td>
            <td align="middle" title="Opera" class="comparison no">no</td>
            <td align="middle" title="Safari" class="comparison no">no</td>
        </tr>
        <tr>
            <td class="declaration">
            <div class="name"><a href="Error.html">Error</a></div>
            <div class="description">Represents a runtime error.</div>
            </td>
            <td align="middle" title="IE" class="comparison yes">5.0+</td>
            <td align="middle" title="Mozilla" class="comparison yes">1.0+</td>
            <td align="middle" title="Netscape" class="comparison yes">6.0+</td>
            <td align="middle" title="Opera" class="comparison yes">7.0+</td>
            <td align="middle" title="Safari" class="comparison yes">1.0+</td>
        </tr>
        <tr>
            <td class="declaration">
            <div class="name"><a href="EvalError.html">EvalError</a></div>
            <div class="description">The EvalError is thrown when the eval method is used  incorrectly.</div>
            </td>
            <td align="middle" title="IE" class="comparison yes">5.0+</td>
            <td align="middle" title="Mozilla" class="comparison yes">1.0+</td>
            <td align="middle" title="Netscape" class="comparison yes">6.0+</td>
            <td align="middle" title="Opera" class="comparison no">no</td>
            <td align="middle" title="Safari" class="comparison no">no</td>
        </tr>
        <tr>
            <td class="declaration">
            <div class="name"><a href="Function.html">Function</a></div>
            <div class="description">Every function in JavaScript is actually a Function  object.</div>
            </td>
            <td align="middle" title="IE" class="comparison yes">4.0+</td>
            <td align="middle" title="Mozilla" class="comparison yes">1.0+</td>
            <td align="middle" title="Netscape" class="comparison yes">3.0+</td>
            <td align="middle" title="Opera" class="comparison yes">7.0+</td>
            <td align="middle" title="Safari" class="comparison yes">1.0+</td>
        </tr>
        <tr>
            <td class="declaration">
            <div class="name"><a href="Global.html">Global</a></div>
            <div class="description">The Global object is the parent of all globally avaliable  properties and methods.</div>
            </td>
            <td align="middle" title="IE" class="comparison yes">3.0+</td>
            <td align="middle" title="Mozilla" class="comparison yes">1.0+</td>
            <td align="middle" title="Netscape" class="comparison yes">2.0+</td>
            <td align="middle" title="Opera" class="comparison yes">7.0+</td>
            <td align="middle" title="Safari" class="comparison no">no</td>
        </tr>
        <tr>
            <td class="declaration">
            <div class="name"><a href="Math.html">Math</a></div>
            <div class="description">A built-in object that has properties and methods for  mathematical constants and functions. For example, the Math object&#39;s PI property  has the value of pi.</div>
            </td>
            <td align="middle" title="IE" class="comparison yes">3.0+</td>
            <td align="middle" title="Mozilla" class="comparison yes">1.0+</td>
            <td align="middle" title="Netscape" class="comparison yes">2.0+</td>
            <td align="middle" title="Opera" class="comparison yes">7.0+</td>
            <td align="middle" title="Safari" class="comparison yes">1.0+</td>
        </tr>
        <tr>
            <td class="declaration">
            <div class="name"><a href="Number.html">Number</a></div>
            <div class="description">Lets you work with numeric values. The Number object is  an object wrapper for primitive numeric values.</div>
            </td>
            <td align="middle" title="IE" class="comparison yes">3.0+</td>
            <td align="middle" title="Mozilla" class="comparison yes">1.0+</td>
            <td align="middle" title="Netscape" class="comparison yes">3.0+</td>
            <td align="middle" title="Opera" class="comparison yes">7.0+</td>
            <td align="middle" title="Safari" class="comparison yes">1.0+</td>
        </tr>
        <tr>
            <td class="declaration">
            <div class="name"><a href="Object.html">Object</a></div>
            <div class="description">Object is the primitive JavaScript object type. All  JavaScript objects are descended from Object. That is, all JavaScript objects  have the methods defined for Object.</div>
            </td>
            <td align="middle" title="IE" class="comparison yes">4.0+</td>
            <td align="middle" title="Mozilla" class="comparison yes">1.0+</td>
            <td align="middle" title="Netscape" class="comparison yes">2.0+</td>
            <td align="middle" title="Opera" class="comparison yes">7.0+</td>
            <td align="middle" title="Safari" class="comparison yes">1.0+</td>
        </tr>
        <tr>
            <td class="declaration">
            <div class="name"><a href="RangeError.html">RangeError</a></div>
            <div class="description">Thrown when a number is out of its appropriate  range.</div>
            </td>
            <td align="middle" title="IE" class="comparison yes">5.0+</td>
            <td align="middle" title="Mozilla" class="comparison yes">1.0+</td>
            <td align="middle" title="Netscape" class="comparison yes">6.0+</td>
            <td align="middle" title="Opera" class="comparison no">no</td>
            <td align="middle" title="Safari" class="comparison no">no</td>
        </tr>
        <tr>
            <td class="declaration">
            <div class="name"><a href="ReferenceError.html">ReferenceError</a></div>
            <div class="description">Thrown if reading a variable that does not  exist.</div>
            </td>
            <td align="middle" title="IE" class="comparison yes">5.0+</td>
            <td align="middle" title="Mozilla" class="comparison yes">1.0+</td>
            <td align="middle" title="Netscape" class="comparison yes">6.0+</td>
            <td align="middle" title="Opera" class="comparison no">no</td>
            <td align="middle" title="Safari" class="comparison no">no</td>
        </tr>
        <tr>
            <td class="declaration">
            <div class="name"><a href="RegExp.html">RegExp</a></div>
            <div class="description">Pattern for a regular expression.</div>
            </td>
            <td align="middle" title="IE" class="comparison yes">4.0+</td>
            <td align="middle" title="Mozilla" class="comparison yes">1.0+</td>
            <td align="middle" title="Netscape" class="comparison yes">4.0+</td>
            <td align="middle" title="Opera" class="comparison yes">7.0+</td>
            <td align="middle" title="Safari" class="comparison yes">1.0+</td>
        </tr>
        <tr>
            <td class="declaration">
            <div class="name"><a href="String.html">String</a></div>
            <div class="description">Represents the characters of a string.</div>
            </td>
            <td align="middle" title="IE" class="comparison yes">3.0+</td>
            <td align="middle" title="Mozilla" class="comparison yes">1.0+</td>
            <td align="middle" title="Netscape" class="comparison yes">2.0+</td>
            <td align="middle" title="Opera" class="comparison yes">7.0+</td>
            <td align="middle" title="Safari" class="comparison yes">1.0+</td>
        </tr>
        <tr>
            <td class="declaration">
            <div class="name"><a href="SyntaxError.html">SyntaxError</a></div>
            <div class="description">A SyntaxError is thrown if there is a syntax error in the  JavaScript code.</div>
            </td>
            <td align="middle" title="IE" class="comparison yes">5.0+</td>
            <td align="middle" title="Mozilla" class="comparison yes">1.0+</td>
            <td align="middle" title="Netscape" class="comparison yes">6.0+</td>
            <td align="middle" title="Opera" class="comparison no">no</td>
            <td align="middle" title="Safari" class="comparison no">no</td>
        </tr>
        <tr>
            <td class="declaration">
            <div class="name"><a href="TypeError.html">TypeError</a></div>
            <div class="description">A TypeError is thrown when a value is a different type  than what was expected.</div>
            </td>
            <td align="middle" title="IE" class="comparison yes">5.0+</td>
            <td align="middle" title="Mozilla" class="comparison yes">1.0+</td>
            <td align="middle" title="Netscape" class="comparison yes">6.0+</td>
            <td align="middle" title="Opera" class="comparison no">no</td>
            <td align="middle" title="Safari" class="comparison no">no</td>
        </tr>
        <tr>
            <td class="declaration">
            <div class="name"><a href="URIError.html">URIError</a></div>
            <div class="description">A URIError is thrown when there is an exception with URI  encoding or decoding.</div>
            </td>
            <td align="middle" title="IE" class="comparison yes">5.0+</td>
            <td align="middle" title="Mozilla" class="comparison yes">1.0+</td>
            <td align="middle" title="Netscape" class="comparison yes">6.0+</td>
            <td align="middle" title="Opera" class="comparison no">no</td>
            <td align="middle" title="Safari" class="comparison no">no</td>
        </tr>
    </tbody>
</table>]]></description>
</item>
<item>
<title><![CDATA[元素透明_IE_FF_Sar_Op_Cho]]></title>
<link>http://www.xintend.com/Article/Cross_Browser_opacity.aspx</link>
<category><![CDATA[开发者]]></category>
<author>KingFo</author>
<pubDate>2009-12-10 13:28:02Z</pubDate>
<description><![CDATA[<p>&nbsp;</p>
<script type="text/javascript" src="http://assets.taobaocdn.com/app/tms/tms-edit-link.js"></script>
<pre><ol class="dp-xml"><li class="alt"><span><span>pre&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;make&nbsp;the&nbsp;box&nbsp;translucent&nbsp;(80%&nbsp;opaque)&nbsp;*/&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;border:&nbsp;solid&nbsp;red;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;opacity:&nbsp;0.8;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Firefox,&nbsp;Safari(WebKit),&nbsp;Opera&nbsp;*/&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;-ms-filter:&nbsp;&quot;alpha(<span class="attribute">opacity</span><span>=</span><span class="attribute-value">80</span><span>)&quot;;&nbsp;/*&nbsp;IE&nbsp;8&nbsp;*/&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;filter:&nbsp;alpha(<span class="attribute">opacity</span><span>=</span><span class="attribute-value">80</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;IE&nbsp;4-7&nbsp;*/&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;zoom:&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;set&nbsp;&quot;zoom&quot;,&nbsp;&quot;width&quot;&nbsp;or&nbsp;&quot;height&quot;&nbsp;to&nbsp;trigger&nbsp;&quot;hasLayout&quot;&nbsp;in&nbsp;IE&nbsp;7&nbsp;and&nbsp;lower&nbsp;*/&nbsp;&nbsp;</span></li><li class="alt"><span>}&nbsp;</span></li></ol></pre>
<p>&nbsp;</p>
<p>ref:https://developer.mozilla.org/En/CSS:-moz-opacity</p>
<p>&nbsp;</p></p>]]></description>
</item>
<item>
<title><![CDATA[[转]yui3-classes]]></title>
<link>http://www.xintend.com/Article/yui3_classes.aspx</link>
<category><![CDATA[开发者]]></category>
<author>KingFo</author>
<pubDate>2009-11-19 17:50:05Z</pubDate>
<description><![CDATA[<p>&nbsp;<img alt="" src="/Attach/200911/633942501191029999_yui3-classes.jpg" /></p>]]></description>
</item>
<item>
<title><![CDATA[[转]那些 CSS Hack]]></title>
<link>http://www.xintend.com/Article/Css_hack_ie8_ie7_ie6_ff_chrome_safari_opera.aspx</link>
<category><![CDATA[开发者]]></category>
<author>KingFo</author>
<pubDate>2009-11-19 10:10:35Z</pubDate>
<description><![CDATA[<p>&nbsp;</p>
<script type="text/javascript" src="http://assets.taobaocdn.com/app/tms/tms-edit-link.js"></script>
<p><img alt="" src="/Attach/200911/633942223788686249_4a3cb03dcf44771c67c11833f8d964ac.jpg" /><img alt="" src="/Attach/200911/633942223926029999_df81f13afb612829211c9698856adb76.png" /></p>]]></description>
</item>
<item>
<title><![CDATA[[转]小字体小行高兼容性分析及差异解决办法]]></title>
<link>http://www.xintend.com/Article/line-height_font-size.aspx</link>
<category><![CDATA[开发者]]></category>
<author>KingFo</author>
<pubDate>2009-11-12 13:08:56Z</pubDate>
<description><![CDATA[<p>本文为转贴，因为本人也深刻体会。</p>
<p>原文地址：<a href="http://www.14px.com/?tag=line-height">http://www.14px.com/?tag=line-height</a><br />
作者：十四象素</p>
<p>[参与测试的浏览器：IE6 / IE7 / IE8 / FF3 / OP9.6 / SF3 / Chrome2 ]<br />
[操作系统：Windows]</p>
<p>浏览器们缺乏党的教育，对行高没有统一的认识，于是在小字体小行高的情况下，总出现肉眼可见差异，对美观产生了举足轻重的影响。</p>
<p>要解决这一细节性的问题，我们首先得进行一番测试来了解各浏览器对于行高的认识，由于仅小行高和小字体影响比较大，我们就不探究其细节规律（比如字体大小对变化速度的影响规律）了，能在一定程度上解决问题便达到了我们想要的效果。</p>
<p>以下是经过一番头晕眼花的测试后得出的实验数据：</p>
<p>
<table>
    <thead>
        <tr>
            <th rowspan="2">大小</th>
            <th rowspan="2">行高</th>
            <th rowspan="2">浏览器</th>
            <th colspan="2">宋体</th>
            <th colspan="2">Arial纯中文</th>
            <th colspan="2">Arial带英文字符</th>
        </tr>
        <tr>
            <th>上边距</th>
            <th>下边距</th>
            <th>上边距</th>
            <th>下边距</th>
            <th>上边距</th>
            <th>下边距</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>12px</td>
            <td>14px</td>
            <td>ie6</td>
            <td class="sp"><span style="background-color: #ffff99">0px</span></td>
            <td class="sp"><span style="background-color: #ffff99">3px</span></td>
            <td class="sp"><span style="background-color: #ffff99">0px</span></td>
            <td class="sp"><span style="background-color: #ffff99">3px</span></td>
            <td>1px</td>
            <td>2px</td>
        </tr>
        <tr>
            <td>12px</td>
            <td>14px</td>
            <td>ie7</td>
            <td>1px</td>
            <td>2px</td>
            <td class="sp"><span style="background-color: #ffff99">0px</span></td>
            <td class="sp"><span style="background-color: #ffff99">3px</span></td>
            <td>1px</td>
            <td>2px</td>
        </tr>
        <tr>
            <td>12px</td>
            <td>14px</td>
            <td>ie8</td>
            <td>1px</td>
            <td>2px</td>
            <td class="sp"><span style="background-color: #ffff99">0px</span></td>
            <td class="sp"><span style="background-color: #ffff99">3px</span></td>
            <td>1px</td>
            <td>2px</td>
        </tr>
        <tr>
            <td>12px</td>
            <td>14px</td>
            <td>ff3</td>
            <td>1px</td>
            <td>2px</td>
            <td class="sp"><span style="background-color: #ffff00">2px</span></td>
            <td class="sp"><span style="background-color: #ffff00">1px</span></td>
            <td class="sp"><span style="background-color: #ffff99">2px</span></td>
            <td class="sp"><span style="background-color: #ffff99">1px</span></td>
        </tr>
        <tr>
            <td>12px</td>
            <td>14px</td>
            <td>chrome2</td>
            <td>1px</td>
            <td>2px</td>
            <td class="sp"><span style="background-color: #ffff99">2px</span></td>
            <td class="sp"><span style="background-color: #ffff99">1px</span></td>
            <td class="sp"><span style="background-color: #ffff99">2px</span></td>
            <td class="sp"><span style="background-color: #ffff99">1px</span></td>
        </tr>
        <tr>
            <td>12px</td>
            <td>14px</td>
            <td>op9.6</td>
            <td>1px</td>
            <td>2px</td>
            <td>1px</td>
            <td>2px</td>
            <td>1px</td>
            <td>2px</td>
        </tr>
        <tr>
            <td>12px</td>
            <td>14px</td>
            <td>sf3</td>
            <td>1px</td>
            <td>2px</td>
            <td>1px</td>
            <td>2px</td>
            <td>1px</td>
            <td>2px</td>
        </tr>
        <tr>
            <td class="part" colspan="9">&nbsp;</td>
        </tr>
        <tr>
            <td>12px</td>
            <td>15px</td>
            <td>ie6</td>
            <td>1px</td>
            <td>3px</td>
            <td>1px</td>
            <td>3px</td>
            <td>1px</td>
            <td>3px</td>
        </tr>
        <tr>
            <td>12px</td>
            <td>15px</td>
            <td>ie7</td>
            <td class="sp"><span style="background-color: #ffff99">2px</span></td>
            <td class="sp"><span style="background-color: #ffff99">2px</span></td>
            <td>1px</td>
            <td>3px</td>
            <td>1px</td>
            <td>3px</td>
        </tr>
        <tr>
            <td>12px</td>
            <td>15px</td>
            <td>ie8</td>
            <td>1px</td>
            <td>3px</td>
            <td class="sp"><span style="background-color: #ffff99">0px</span></td>
            <td class="sp"><span style="background-color: #ffff99">4px</span></td>
            <td>1px</td>
            <td>3px</td>
        </tr>
        <tr>
            <td>12px</td>
            <td>15px</td>
            <td>ff3</td>
            <td>1px</td>
            <td>3px</td>
            <td class="sp"><span style="background-color: #ffff99">2px</span></td>
            <td class="sp"><span style="background-color: #ffff99">2px</span></td>
            <td class="sp"><span style="background-color: #ffff99">2px</span></td>
            <td class="sp"><span style="background-color: #ffff99">2px</span></td>
        </tr>
        <tr>
            <td>12px</td>
            <td>15px</td>
            <td>chrome2</td>
            <td>1px</td>
            <td>3px</td>
            <td class="sp"><span style="background-color: #ffff99">2px</span></td>
            <td class="sp"><span style="background-color: #ffff99">2px</span></td>
            <td class="sp"><span style="background-color: #ffff99">2px</span></td>
            <td class="sp"><span style="background-color: #ffff99">2px</span></td>
        </tr>
        <tr>
            <td>12px</td>
            <td>15px</td>
            <td>op9.6</td>
            <td>1px</td>
            <td>3px</td>
            <td>1px</td>
            <td>3px</td>
            <td>1px</td>
            <td>3px</td>
        </tr>
        <tr>
            <td>12px</td>
            <td>15px</td>
            <td>sf3</td>
            <td>1px</td>
            <td>3px</td>
            <td>1px</td>
            <td>3px</td>
            <td>1px</td>
            <td>3px</td>
        </tr>
        <tr>
            <td class="part" colspan="9">&nbsp;</td>
        </tr>
        <tr>
            <td>12px</td>
            <td>16px</td>
            <td>ie6</td>
            <td class="sp">1px</td>
            <td class="sp">4px</td>
            <td class="sp">1px</td>
            <td class="sp">4px</td>
            <td><span style="background-color: #ffff99">2px</span></td>
            <td><span style="background-color: #ffff99">3px</span></td>
        </tr>
        <tr>
            <td>12px</td>
            <td>16px</td>
            <td>ie7</td>
            <td>2px</td>
            <td>3px</td>
            <td class="sp"><span style="background-color: #ffff99">1px</span></td>
            <td class="sp"><span style="background-color: #ffff99">4px</span></td>
            <td>2px</td>
            <td>3px</td>
        </tr>
        <tr>
            <td>12px</td>
            <td>16px</td>
            <td>ie8</td>
            <td>2px</td>
            <td>3px</td>
            <td class="sp"><span style="background-color: #ffff99">1px</span></td>
            <td class="sp"><span style="background-color: #ffff99">4px</span></td>
            <td>2px</td>
            <td>3px</td>
        </tr>
        <tr>
            <td>12px</td>
            <td>16px</td>
            <td>ff3</td>
            <td>2px</td>
            <td>3px</td>
            <td class="sp"><span style="background-color: #ffff99">3px</span></td>
            <td class="sp"><span style="background-color: #ffff99">2px</span></td>
            <td class="sp"><span style="background-color: #ffff99">3px</span></td>
            <td class="sp"><span style="background-color: #ffff99">2px</span></td>
        </tr>
        <tr>
            <td>12px</td>
            <td>16px</td>
            <td>chrome2</td>
            <td>2px</td>
            <td>3px</td>
            <td>2px</td>
            <td>3px</td>
            <td>2px</td>
            <td>3px</td>
        </tr>
        <tr>
            <td>12px</td>
            <td>16px</td>
            <td>op9.6</td>
            <td>2px</td>
            <td>3px</td>
            <td>2px</td>
            <td>3px</td>
            <td>2px</td>
            <td>3px</td>
        </tr>
        <tr>
            <td>12px</td>
            <td>16px</td>
            <td>sf3</td>
            <td>2px</td>
            <td>3px</td>
            <td>2px</td>
            <td>3px</td>
            <td>2px</td>
            <td>3px</td>
        </tr>
        <tr>
            <td class="part" colspan="9">&nbsp;</td>
        </tr>
        <tr>
            <td>12px</td>
            <td>17px</td>
            <td>ie6</td>
            <td>2px</td>
            <td>4px</td>
            <td>2px</td>
            <td>4px</td>
            <td class="sp"><span style="background-color: #ffff99">3px</span></td>
            <td class="sp"><span style="background-color: #ffff99">3px</span></td>
        </tr>
        <tr>
            <td>12px</td>
            <td>17px</td>
            <td>ie7</td>
            <td class="sp">3px</td>
            <td class="sp">3px</td>
            <td><span style="background-color: #ffff99">2px</span></td>
            <td><span style="background-color: #ffff99">4px</span></td>
            <td class="sp">3px</td>
            <td class="sp">3px</td>
        </tr>
        <tr>
            <td>12px</td>
            <td>17px</td>
            <td>ie8</td>
            <td>2px</td>
            <td>4px</td>
            <td class="sp"><span style="background-color: #ffff99">1px</span></td>
            <td class="sp"><span style="background-color: #ffff99">5px</span></td>
            <td>2px</td>
            <td>4px</td>
        </tr>
        <tr>
            <td>12px</td>
            <td>17px</td>
            <td>ff3</td>
            <td>2px</td>
            <td>4px</td>
            <td class="sp"><span style="background-color: #ffff99">3px</span></td>
            <td class="sp"><span style="background-color: #ffff99">3px</span></td>
            <td class="sp"><span style="background-color: #ffff99">3px</span></td>
            <td class="sp"><span style="background-color: #ffff99">3px</span></td>
        </tr>
        <tr>
            <td>12px</td>
            <td>17px</td>
            <td>chrome2</td>
            <td>2px</td>
            <td>4px</td>
            <td class="sp"><span style="background-color: #ffff99">3px</span></td>
            <td class="sp"><span style="background-color: #ffff99">3px</span></td>
            <td class="sp"><span style="background-color: #ffff99">3px</span></td>
            <td class="sp"><span style="background-color: #ffff99">3px</span></td>
        </tr>
        <tr>
            <td>12px</td>
            <td>17px</td>
            <td>op9.6</td>
            <td>2px</td>
            <td>4px</td>
            <td>2px</td>
            <td>4px</td>
            <td>2px</td>
            <td>4px</td>
        </tr>
        <tr>
            <td>12px</td>
            <td>17px</td>
            <td>sf3</td>
            <td>2px</td>
            <td>4px</td>
            <td>2px</td>
            <td>4px</td>
            <td>2px</td>
            <td>4px</td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;</p>
<p>由表可见</p>
<p>1. 需要外观上非常完美的呈现单行文本垂直居中（没有1px的差异），需要设置字体为宋体。</p>
<p>解释：当字体为宋体的时候，各浏览器中上边距和下边距的差异都是较小的，出现问题的仅仅是IE6（行高为偶数时）与IE7（行高为奇数时），而IE6和IE7是可以很容易使用hack来通过padding的多少来精确控制其位置。</p>
<p>示例：</p>
<pre><ol class="dp-xml"><li class="alt"><span><span>&lt;!DOCTYPE&nbsp;html&nbsp;PUBLIC&nbsp;&quot;-//W3C//DTD&nbsp;XHTML&nbsp;1.0&nbsp;Transitional//EN&quot;&nbsp;&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li><li><span class="tag">&lt;</span><span class="tag-name">html</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;http://www.w3.org/1999/xhtml&quot;</span><span class="tag">&gt;</span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">meta</span><span>&nbsp;</span><span class="attribute">http-equiv</span><span>=</span><span class="attribute-value">&quot;Content-Type&quot;</span><span>&nbsp;</span><span class="attribute">content</span><span>=</span><span class="attribute-value">&quot;text/html;&nbsp;charset=utf-8&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">meta</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;author&quot;</span><span>&nbsp;</span><span class="attribute">content</span><span>=</span><span class="attribute-value">&quot;Chomo&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">link</span><span>&nbsp;</span><span class="attribute">rel</span><span>=</span><span class="attribute-value">&quot;start&quot;</span><span>&nbsp;</span><span class="attribute">href</span><span>=</span><span class="attribute-value">&quot;http://www.14px.com&quot;</span><span>&nbsp;</span><span class="attribute">title</span><span>=</span><span class="attribute-value">&quot;Home&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>line-height非常完美的兼容</span><span class="tag">&lt;/</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">style</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text/css&quot;</span><span class="tag">&gt;</span><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;{margin:0;&nbsp;padding:0;&nbsp;list-style:none;&nbsp;} &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;div&nbsp;{&nbsp;font-size:12px;&nbsp;font-family:simsun;&nbsp;line-height:15px;&nbsp;float:left;&nbsp;padding:1px&nbsp;3px;&nbsp;*padding:0&nbsp;3px&nbsp;2px&nbsp;3px;&nbsp;_padding:1px&nbsp;3px;&nbsp;border:1px&nbsp;solid&nbsp;#000;} &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">style</span><span class="tag">&gt;</span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">div</span><span class="tag">&gt;</span><span>十四像素&nbsp;-&nbsp;14px</span><span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;</span></li><li><span class="tag">&lt;/</span><span class="tag-name">html</span><span class="tag">&gt;</span><span>&nbsp;</span></li></ol></pre>
<p>提示：你可以先修改部分代码再运行。</p>
<p>2. 如果确定标签内存在英文字符、数字、符号，可以设置英文字体，利用行高在15px下呈现的状态。</p>
<p>解释：此时仅ff3和chrome2浏览器存在些许差异，并且外观上不存在上多下少的边距。</p>
<p>示例：</p>
<pre><ol class="dp-xml"><li class="alt"><span><span>&lt;!DOCTYPE&nbsp;html&nbsp;PUBLIC&nbsp;&quot;-//W3C//DTD&nbsp;XHTML&nbsp;1.0&nbsp;Transitional//EN&quot;&nbsp;&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li><li><span class="tag">&lt;</span><span class="tag-name">html</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;http://www.w3.org/1999/xhtml&quot;</span><span class="tag">&gt;</span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">meta</span><span>&nbsp;</span><span class="attribute">http-equiv</span><span>=</span><span class="attribute-value">&quot;Content-Type&quot;</span><span>&nbsp;</span><span class="attribute">content</span><span>=</span><span class="attribute-value">&quot;text/html;&nbsp;charset=utf-8&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">meta</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;author&quot;</span><span>&nbsp;</span><span class="attribute">content</span><span>=</span><span class="attribute-value">&quot;Chomo&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">link</span><span>&nbsp;</span><span class="attribute">rel</span><span>=</span><span class="attribute-value">&quot;start&quot;</span><span>&nbsp;</span><span class="attribute">href</span><span>=</span><span class="attribute-value">&quot;http://www.14px.com&quot;</span><span>&nbsp;</span><span class="attribute">title</span><span>=</span><span class="attribute-value">&quot;Home&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>line-height:15px;font-family:arial时呈现比较理想的状态</span><span class="tag">&lt;/</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">style</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text/css&quot;</span><span class="tag">&gt;</span><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;{margin:0;&nbsp;padding:0;&nbsp;list-style:none;&nbsp;} &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;div&nbsp;{&nbsp;font-size:12px;&nbsp;font-family:arial;&nbsp;line-height:15px;&nbsp;float:left;&nbsp;padding:1px&nbsp;3px;&nbsp;border:1px&nbsp;solid&nbsp;#000;} &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">style</span><span class="tag">&gt;</span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">div</span><span class="tag">&gt;</span><span>十四像素&nbsp;-&nbsp;14px</span><span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;</span></li><li><span class="tag">&lt;/</span><span class="tag-name">html</span><span class="tag">&gt;</span><span>&nbsp;</span></li></ol></pre>
<p>提示：你可以先修改部分代码再运行。</p>
<p>3. 如果不能保证是否存在英文字符、数字、符号，又需要设置英文字体保证美观，也可利用行高在15px下呈现的状态。（推荐）</p>
<p>解释：此时ie8浏览器下的状态不容乐观，上下差异太大：上0px，下4px，但可以利用:before伪类，赐它一个符号。</p>
<p>示例：</p>
<pre><ol class="dp-xml"><li class="alt"><span><span>&lt;!DOCTYPE&nbsp;html&nbsp;PUBLIC&nbsp;&quot;-//W3C//DTD&nbsp;XHTML&nbsp;1.0&nbsp;Transitional//EN&quot;&nbsp;&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li><li><span class="tag">&lt;</span><span class="tag-name">html</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;http://www.w3.org/1999/xhtml&quot;</span><span class="tag">&gt;</span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">meta</span><span>&nbsp;</span><span class="attribute">http-equiv</span><span>=</span><span class="attribute-value">&quot;Content-Type&quot;</span><span>&nbsp;</span><span class="attribute">content</span><span>=</span><span class="attribute-value">&quot;text/html;&nbsp;charset=utf-8&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">meta</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;author&quot;</span><span>&nbsp;</span><span class="attribute">content</span><span>=</span><span class="attribute-value">&quot;Chomo&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">link</span><span>&nbsp;</span><span class="attribute">rel</span><span>=</span><span class="attribute-value">&quot;start&quot;</span><span>&nbsp;</span><span class="attribute">href</span><span>=</span><span class="attribute-value">&quot;http://www.14px.com&quot;</span><span>&nbsp;</span><span class="attribute">title</span><span>=</span><span class="attribute-value">&quot;Home&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>line-height:15px;font-family:arial时呈现比较理想的状态（即使是纯中文）</span><span class="tag">&lt;/</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">style</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text/css&quot;</span><span class="tag">&gt;</span><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;{ &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;margin:0; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;padding:0; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list-style:none; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;div&nbsp;{ &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-size:12px; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-family:arial; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line-height:15px; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float:left; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;padding:1px&nbsp;3px; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border:1px&nbsp;solid&nbsp;#000; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;div:before&nbsp;{ &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content:&quot;1&quot;; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;margin-left:-2000px; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;margin-right:1993px; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">style</span><span class="tag">&gt;</span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">div</span><span class="tag">&gt;</span><span>十四像素</span><span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;</span></li><li><span class="tag">&lt;/</span><span class="tag-name">html</span><span class="tag">&gt;</span><span>&nbsp;</span></li></ol></pre>
<p>提示：你可以先修改部分代码再运行。</p></p></p></p></th>]]></description>
</item>
<item>
<title><![CDATA[AJBrige]]></title>
<link>http://www.xintend.com/Article/AJBrige_Project.aspx</link>
<category><![CDATA[开发者]]></category>
<author>KingFo</author>
<pubDate>2009-11-06 11:07:56Z</pubDate>
<description><![CDATA[<p>My &nbsp;Frist &nbsp;Open &nbsp;Source Project</p>
<p><img alt="" src="http://www.xintend.com/Attach/labs/ajbridge/logo_se.png" />&nbsp;</p>
<p>Global:</p>
<p>&nbsp;&quot;AS&nbsp;do&nbsp;AS&nbsp;things&nbsp;(code),&nbsp;JS&nbsp;do&nbsp;JS&nbsp;things&nbsp;(code),&nbsp;only&nbsp;communicate&nbsp;with&nbsp;me&nbsp;(bridge)&quot;</p>
<p>
<div class="MsgContent" id="Msg_{FAD292C0-6BE6-4F1B-BEE6-7A650AB12174}" msgid="{FAD292C0-6BE6-4F1B-BEE6-7A650AB12174}" sendid="cntaobao健刚"><font style="FONT-SIZE: 10pt" face="宋体" color="#000000">(AS&nbsp;and&nbsp;JS&nbsp;are&nbsp;doing&nbsp;their&nbsp;own&nbsp;things,&nbsp;only&nbsp;use&nbsp;bridge&nbsp;in&nbsp;communication.)</font></div>
</p>
<p>目标：<br />
&nbsp;&nbsp; &ldquo;AS做AS的事(code)，JS做JS的事(code)，仅在沟通时用我(bridge)！&quot;</p>
<p>project home : &nbsp;<a href="http://code.google.com/p/ajbridge/">http://code.google.com/p/ajbridge/</a></p>
<p>svn: &nbsp;<strong><em>http</em></strong>://ajbridge.googlecode.com/svn/trunk/</p>
<p>&nbsp;</p>]]></description>
</item>
</channel>
</rss>