2013年3月31日星期日

阮一峰的网络日志

阮一峰的网络日志


相似图片搜索的原理(二)

Posted: 31 Mar 2013 04:29 AM PDT

二年前,我写了《相似图片搜索的原理》,介绍了一种最简单的实现方法。

昨天,我在isnowfy的网站看到,还有其他两种方法也很简单,这里做一些笔记。

一、颜色分布法

每张图片都可以生成颜色分布的直方图(color histogram)。如果两张图片的直方图很接近,就可以认为它们很相似。

任何一种颜色都是由红绿蓝三原色(RGB)构成的,所以上图共有4张直方图(三原色直方图 + 最后合成的直方图)。

如果每种原色都可以取256个值,那么整个颜色空间共有1600万种颜色(256的三次方)。针对这1600万种颜色比较直方图,计算量实在太大了,因此需要采用简化方法。可以将0~255分成四个区:0~63为第0区,64~127为第1区,128~191为第2区,192~255为第3区。这意味着红绿蓝分别有4个区,总共可以构成64种组合(4的3次方)。

任何一种颜色必然属于这64种组合中的一种,这样就可以统计每一种组合包含的像素数量。

上图是某张图片的颜色分布表,将表中最后一栏提取出来,组成一个64维向量(7414, 230, 0, 0, 8, ..., 109, 0, 0, 3415, 53929)。这个向量就是这张图片的特征值或者叫"指纹"。

于是,寻找相似图片就变成了找出与其最相似的向量。这可以用皮尔逊相关系数或者余弦相似度算出。

二、内容特征法

除了颜色构成,还可以从比较图片内容的相似性入手。

首先,将原图转成一张较小的灰度图片,假定为50x50像素。然后,确定一个阙值,将灰度图片转成黑白图片。

如果两张图片很相似,它们的黑白轮廓应该是相近的。于是,问题就变成了,第一步如何确定一个合理的阙值,正确呈现照片中的轮廓?

显然,前景色与背景色反差越大,轮廓就越明显。这意味着,如果我们找到一个值,可以使得前景色和背景色各自的"类内差异最小"(minimizing the intra-class variance),或者"类间差异最大"(maximizing the inter-class variance),那么这个值就是理想的阙值。

1979年,日本学者大津展之证明了,"类内差异最小"与"类间差异最大"是同一件事,即对应同一个阙值。他提出一种简单的算法,可以求出这个阙值,这被称为"大津法"(Otsu's method)。下面就是他的计算方法。

假定一张图片共有n个像素,其中灰度值小于阙值的像素为 n1 个,大于等于阙值的像素为 n2 个( n1 + n2 = n )。w1 和 w2 表示这两种像素各自的比重。

  w1 = n1 / n

  w2 = n2 / n

再假定,所有灰度值小于阙值的像素的平均值和方差分别为 μ1 和 σ1,所有灰度值大于等于阙值的像素的平均值和方差分别为 μ2 和 σ2。于是,可以得到

  类内差异 = w1(σ1的平方) + w2(σ2的平方)

  类间差异 = w1w2(μ1-μ2)^2

可以证明,这两个式子是等价的:得到"类内差异"的最小值,等同于得到"类间差异"的最大值。不过,从计算难度看,后者的计算要容易一些。

下一步用"穷举法",将阙值从灰度的最低值到最高值,依次取一遍,分别代入上面的算式。使得"类内差异最小"或"类间差异最大"的那个值,就是最终的阙值。具体的实例和Java算法,请看这里

有了50x50像素的黑白缩略图,就等于有了一个50x50的0-1矩阵。矩阵的每个值对应原图的一个像素,0表示黑色,1表示白色。这个矩阵就是一张图片的特征矩阵。

两个特征矩阵的不同之处越少,就代表两张图片越相似。这可以用"异或运算"实现(即两个值之中只有一个为1,则运算结果为1,否则运算结果为0)。对不同图片的特征矩阵进行"异或运算",结果中的1越少,就是越相似的图片。

(完)

文档信息

2013年3月27日星期三

阮一峰的网络日志

阮一峰的网络日志


TF-IDF与余弦相似性的应用(三):自动摘要

Posted: 26 Mar 2013 06:23 AM PDT

有时候,很简单的数学方法,就可以完成很复杂的任务。

这个系列的前两部分就是很好的例子。仅仅依靠统计词频,就能找出关键词相似文章。虽然它们算不上效果最好的方法,但肯定是最简便易行的方法。

今天,依然继续这个主题。讨论如何通过词频,对文章进行自动摘要(Automatic summarization)。

如果能从3000字的文章,提炼出150字的摘要,就可以为读者节省大量阅读时间。由人完成的摘要叫"人工摘要",由机器完成的就叫"自动摘要"。许多网站都需要它,比如论文网站、新闻网站、搜索引擎等等。2007年,美国学者的论文《A Survey on Automatic Text Summarization》(Dipanjan Das, Andre F.T. Martins, 2007)总结了目前的自动摘要算法。其中,很重要的一种就是词频统计。

这种方法最早出自1958年的IBM公司科学家H.P. Luhn的论文《The Automatic Creation of Literature Abstracts》

Luhn博士认为,文章的信息都包含在句子中,有些句子包含的信息多,有些句子包含的信息少。"自动摘要"就是要找出那些包含信息最多的句子。

句子的信息量用"关键词"来衡量。如果包含的关键词越多,就说明这个句子越重要。Luhn提出用"簇"(cluster)表示关键词的聚集。所谓"簇"就是包含多个关键词的句子片段。

上图就是Luhn原始论文的插图,被框起来的部分就是一个"簇"。只要关键词之间的距离小于"门槛值",它们就被认为处于同一个簇之中。Luhn建议的门槛值是4或5。也就是说,如果两个关键词之间有5个以上的其他词,就可以把这两个关键词分在两个簇。

下一步,对于每个簇,都计算它的重要性分值。

以前图为例,其中的簇一共有7个词,其中4个是关键词。因此,它的重要性分值等于 ( 4 x 4 ) / 7 = 2.3。

然后,找出包含分值最高的簇的句子(比如5句),把它们合在一起,就构成了这篇文章的自动摘要。具体实现可以参见《Mining the Social Web: Analyzing Data from Facebook, Twitter, LinkedIn, and Other Social Media Sites》(O'Reilly, 2011)一书的第8章,python代码见github

Luhn的这种算法后来被简化,不再区分"簇",只考虑句子包含的关键词。下面就是一个例子(采用伪码表示),只考虑关键词首先出现的句子。

  Summarizer(originalText, maxSummarySize):

    // 计算原始文本的词频,生成一个数组,比如[(10,'the'), (3,'language'), (8,'code')...]
    wordFrequences = getWordCounts(originalText)

    // 过滤掉停用词,数组变成[(3, 'language'), (8, 'code')...]
    contentWordFrequences = filtStopWords(wordFrequences)

    // 按照词频进行排序,数组变成['code', 'language'...]
    contentWordsSortbyFreq = sortByFreqThenDropFreq(contentWordFrequences)

    // 将文章分成句子
    sentences = getSentences(originalText)

    // 选择关键词首先出现的句子
    setSummarySentences = {}
    foreach word in contentWordsSortbyFreq:
      firstMatchingSentence = search(sentences, word)
      setSummarySentences.add(firstMatchingSentence)
      if setSummarySentences.size() = maxSummarySize:
        break

    // 将选中的句子按照出现顺序,组成摘要
    summary = ""
    foreach sentence in sentences:
      if sentence in setSummarySentences:
        summary = summary + " " + sentence

    return summary

类似的算法已经被写成了工具,比如基于Java的Classifier4J库的SimpleSummariser模块、基于C语言的OTS库、以及基于classifier4J的C#实现python实现

(完)

文档信息

2013年3月21日星期四

阮一峰的网络日志

阮一峰的网络日志


TF-IDF与余弦相似性的应用(二):找出相似文章

Posted: 20 Mar 2013 08:55 PM PDT

上一次,我用TF-IDF算法自动提取关键词。

今天,我们再来研究另一个相关的问题。有些时候,除了找到关键词,我们还希望找到与原文章相似的其他文章。比如,"Google新闻"在主新闻下方,还提供多条相似的新闻。

为了找出相似的文章,需要用到"余弦相似性"(cosine similiarity)。下面,我举一个例子来说明,什么是"余弦相似性"。

为了简单起见,我们先从句子着手。

  句子A:我喜欢看电视,不喜欢看电影。

  句子B:我不喜欢看电视,也不喜欢看电影。

请问怎样才能计算上面两句话的相似程度?

基本思路是:如果这两句话的用词越相似,它们的内容就应该越相似。因此,可以从词频入手,计算它们的相似程度。

第一步,分词。

  句子A:我/喜欢/看/电视,不/喜欢/看/电影。

  句子B:我/不/喜欢/看/电视,也/不/喜欢/看/电影。

第二步,列出所有的词。

  我,喜欢,看,电视,电影,不,也。

第三步,计算词频。

  句子A:我 1,喜欢 2,看 2,电视 1,电影 1,不 1,也 0。

  句子B:我 1,喜欢 2,看 2,电视 1,电影 1,不 2,也 1。

第四步,写出词频向量。

  句子A:[1, 2, 2, 1, 1, 1, 0]

  句子B:[1, 2, 2, 1, 1, 2, 1]

到这里,问题就变成了如何计算这两个向量的相似程度。

我们可以把它们想象成空间中的两条线段,都是从原点([0, 0, ...])出发,指向不同的方向。两条线段之间形成一个夹角,如果夹角为0度,意味着方向相同、线段重合;如果夹角为90度,意味着形成直角,方向完全不相似;如果夹角为180度,意味着方向正好相反。因此,我们可以通过夹角的大小,来判断向量的相似程度。夹角越小,就代表越相似。

以二维空间为例,上图的a和b是两个向量,我们要计算它们的夹角θ。余弦定理告诉我们,可以用下面的公式求得:

假定a向量是[x1, y1],b向量是[x2, y2],那么可以将余弦定理改写成下面的形式:

数学家已经证明,余弦的这种计算方法对n维向量也成立。假定A和B是两个n维向量,A是 [A1, A2, ..., An] ,B是 [B1, B2, ..., Bn] ,则A与B的夹角θ的余弦等于:

使用这个公式,我们就可以得到,句子A与句子B的夹角的余弦。

余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫"余弦相似性"。所以,上面的句子A和句子B是很相似的,事实上它们的夹角大约为20.3度。

由此,我们就得到了"找出相似文章"的一种算法:

  (1)使用TF-IDF算法,找出两篇文章的关键词;

  (2)每篇文章各取出若干个关键词(比如20个),合并成一个集合,计算每篇文章对于这个集合中的词的词频(为了避免文章长度的差异,可以使用相对词频);

  (3)生成两篇文章各自的词频向量;

  (4)计算两个向量的余弦相似度,值越大就表示越相似。

"余弦相似度"是一种非常有用的算法,只要是计算两个向量的相似程度,都可以采用它。

下一次,我想谈谈如何在词频统计的基础上,自动生成一篇文章的摘要。

(完)

文档信息

2013年3月16日星期六

阮一峰的网络日志

阮一峰的网络日志


TF-IDF与余弦相似性的应用(一):自动提取关键词

Posted: 15 Mar 2013 08:19 AM PDT

这个标题看上去好像很复杂,其实我要谈的是一个很简单的问题。

有一篇很长的文章,我要用计算机提取它的关键词(Automatic Keyphrase extraction),完全不加以人工干预,请问怎样才能正确做到?

这个问题涉及到数据挖掘、文本处理、信息检索等很多计算机前沿领域,但是出乎意料的是,有一个非常简单的经典算法,可以给出令人相当满意的结果。它简单到都不需要高等数学,普通人只用10分钟就可以理解,这就是我今天想要介绍的TF-IDF算法。

让我们从一个实例开始讲起。假定现在有一篇长文《中国的蜜蜂养殖》,我们准备用计算机提取它的关键词。

一个容易想到的思路,就是找到出现次数最多的词。如果某个词很重要,它应该在这篇文章中多次出现。于是,我们进行"词频"(Term Frequency,缩写为TF)统计。

结果你肯定猜到了,出现次数最多的词是----"的"、"是"、"在"----这一类最常用的词。它们叫做"停用词"(stop words),表示对找到结果毫无帮助、必须过滤掉的词。

假设我们把它们都过滤掉了,只考虑剩下的有实际意义的词。这样又会遇到了另一个问题,我们可能发现"中国"、"蜜蜂"、"养殖"这三个词的出现次数一样多。这是不是意味着,作为关键词,它们的重要性是一样的?

显然不是这样。因为"中国"是很常见的词,相对而言,"蜜蜂"和"养殖"不那么常见。如果这三个词在一篇文章的出现次数一样多,有理由认为,"蜜蜂"和"养殖"的重要程度要大于"中国",也就是说,在关键词排序上面,"蜜蜂"和"养殖"应该排在"中国"的前面。

所以,我们需要一个重要性调整系数,衡量一个词是不是常见词。如果某个词比较少见,但是它在这篇文章中多次出现,那么它很可能就反映了这篇文章的特性,正是我们所需要的关键词。

用统计学语言表达,就是在词频的基础上,要对每个词分配一个"重要性"权重。最常见的词("的"、"是"、"在")给予最小的权重,较常见的词("中国")给予较小的权重,较少见的词("蜜蜂"、"养殖")给予较大的权重。这个权重叫做"逆文档频率"(Inverse Document Frequency,缩写为IDF),它的大小与一个词的常见程度成反比。

知道了"词频"(TF)和"逆文档频率"(IDF)以后,将这两个值相乘,就得到了一个词的TF-IDF值。某个词对文章的重要性越高,它的TF-IDF值就越大。所以,排在最前面的几个词,就是这篇文章的关键词

下面就是这个算法的细节。

第一步,计算词频。

考虑到文章有长短之分,为了便于不同文章的比较,进行"词频"标准化。

或者

第二步,计算逆文档频率。

这时,需要一个语料库(corpus),用来模拟语言的使用环境。

如果一个词越常见,那么分母就越大,逆文档频率就越小越接近0。分母之所以要加1,是为了避免分母为0(即所有文档都不包含该词)。log表示对得到的值取对数。

第三步,计算TF-IDF。

可以看到,TF-IDF与一个词在文档中的出现次数成正比,与该词在整个语言中的出现次数成反比。所以,自动提取关键词的算法就很清楚了,就是计算出文档的每个词的TF-IDF值,然后按降序排列,取排在最前面的几个词。

还是以《中国的蜜蜂养殖》为例,假定该文长度为1000个词,"中国"、"蜜蜂"、"养殖"各出现20次,则这三个词的"词频"(TF)都为0.02。然后,搜索Google发现,包含"的"字的网页共有250亿张,假定这就是中文网页总数。包含"中国"的网页共有62.3亿张,包含"蜜蜂"的网页为0.484亿张,包含"养殖"的网页为0.973亿张。则它们的逆文档频率(IDF)和TF-IDF如下:

从上表可见,"蜜蜂"的TF-IDF值最高,"养殖"其次,"中国"最低。(如果还计算"的"字的TF-IDF,那将是一个极其接近0的值。)所以,如果只选择一个词,"蜜蜂"就是这篇文章的关键词。

除了自动提取关键词,TF-IDF算法还可以用于许多别的地方。比如,信息检索时,对于每个文档,都可以分别计算一组搜索词("中国"、"蜜蜂"、"养殖")的TF-IDF,将它们相加,就可以得到整个文档的TF-IDF。这个值最高的文档就是与搜索词最相关的文档。

TF-IDF算法的优点是简单快速,结果比较符合实际情况。缺点是,单纯以"词频"衡量一个词的重要性,不够全面,有时重要的词可能出现次数并不多。而且,这种算法无法体现词的位置信息,出现位置靠前的词与出现位置靠后的词,都被视为重要性相同,这是不正确的。

下一次,我将用TF-IDF结合余弦相似性,衡量文档之间的相似程度。

(完)

文档信息

2013年3月8日星期五

阮一峰的网络日志

阮一峰的网络日志


苹果公司与分工原理

Posted: 07 Mar 2013 10:32 PM PST

我终于读完了《乔布斯传》。这是一本好书,我应该早点读的。

最大的收获,就是理解了苹果公司为什么是现在的样子。

苹果公司与其他计算机公司截然不同,有着鲜明的风格。以前,我只是简单地认为,它就是这种特色,或者说它的产品策略和销售方法就是这样。读了《乔布斯传》才明白,这完全是由乔布斯的个性决定的。

一、乔布斯

1979年,苹果公司成立不久,乔布斯拍了一张著名的照片。

他一个人坐在新家的地板上,盘腿沉思。屋里几乎空无一物,人们都以为,这是为了制造照片效果。但是,《乔布斯传》披露,他的家真的就是这样。没有家俱,是因为乔布斯的要求太高,始终买不到合适的家俱。

"乔布斯买了一间不错的房子,但家里只有一幅帕黎思(Maxfield Parrish)的画作、一部百灵牌咖啡机和几把双人牌的刀子。他对家俱挑剔到了极点,一直找不到合意的,屋子也就空空如也,没有床、椅子,也沒有沙发。他的卧室简单至极:中央有一张床垫,墙上挂了爱因斯坦和印度圣师玛哈拉的裱框相片,一部苹果II号计算机就摆在地上。"

乔布斯的个性特点就是追求完美,而且极其坚持。

二、追求完美

这种个性完全体现在苹果公司的产品之中。苹果的产品在各方面都追求完美。 下面就是一些例子。

(1)最早的时候,苹果公司只出售硬件(苹果I号和苹果II号)。为了不让其他公司的软件糟蹋自家的硬件,苹果很快就开发出了自家的操作系统。

(2)乔布斯"一想到完美的苹果软件在另一家公司出品的破烂电脑上面运行,就浑身不舒服。"所以,苹果的软件不授权给其他厂商,甚至也很少推出其他平台的版本。同样地,未经许可的软件,也不得在苹果的平台上运行。

(3)苹果鼠标只有一个键, iPod只有一个滚轮,iPhone和iPad只有一个Home键,因为这样的设计最完美,如果有两个键就不完美了。

(4)为了防止用户破坏苹果产品的完美,它们都是不能擅自拆开的,Macintosh电脑不能插入扩展卡,iPhone和iPod不能换电池,还使用了特制的螺丝。

(5)你不可能让所有部分都完美,最好的办法就是去除那些不完美的部分,所以苹果的产品总是很简洁。

(6)由于Flash格式可能会出现各种问题,不利于完美的用户体验,苹果宣布不支持Flash格式。

(7)苹果的产品非常注重细节,因为只要有一个细节出错,就称不上完美了。苹果的设计师曾经抱怨说,乔布斯让他们花太多时间在标题栏的设计上,害他们无法做更重要的事。乔布斯发火了,叫道:"你们可以想像每天都得盯着这种标题栏的感觉吗?这不是芝麻蒜皮的事,是应该做好的事。"

(8)乔布斯甚至要求,电脑内部的电路板也要完美。

他这样说:

"即使电路板藏在电脑里面,看不到,我还是要电路板尽可能漂亮。一个好木工在钉橱子的时候,会用一块烂木头来做背板吗?尽管背板总是贴着墙壁,没人看得到,但你还是知道那块板子就在那里,最后你还是决定用一块好木板来钉。这样你才能高枕无忧,因为你已顾及美观和品质,做到尽善尽美了。"

三、控制一切

乔布斯如此追求完美,所以就希望掌握一切。

只要有一个部分不是他说了算,他就难以忍受,感到无法保证这件产品能达到他心目中的完美标准。这就决定了苹果在业界绝无仅有的经营模式,它几乎是全世界对产品控制最强悍的公司。

(1)苹果只出售硬件和软件整合为一体的产品,且从不把操作系统授权给其他厂商,以保证一切都在它的完全控制之中。

(2)为了保证用户在iPod中听到的是完美的音乐,苹果搭建了itunes音乐商店;为了保证用户在iPhone上用的是合格的软件,苹果搭建了App商店;为了保证用户在iPad上读到排版优美的好书,苹果搭建了iBooks书店。一句话,苹果还要控制内容,只有它审核过的东西,才能进入它的产品。

(3)由于Intel公司的处理器达不到乔布斯的要求,苹果开始自己生产A4处理器,将上游的电子原件都纳入自己的控制之中。

(4)为了保证消费者的购物体验,苹果开设了自家的专卖店,以便准确传达苹果产品的特质。乔布斯亲自参与设计了楼梯、桌子、布局、装潢等各个方面。苹果就这样控制了下游的零售部门。

乔布斯认为,最好的产品就是"软件与硬件一体成型的产品",每个细节都是根据"从头到尾"(end- to-end)的原则,从制造端(头)到使用者(尾)全程掌控,去设计打造出來的。他无法想象,把他一手创造出来的东西交给别人,自己无法控制。

所以,苹果一家公司包办了整条产业链,从最上游的电子零件到最下游的零售网点,都是它的业务范围。无论硬件、软件、还是内容,都在它的控制之中。

四、分工原理

但是,这样做违反了经济学的基本原理----分工。

1776年,"经济学之父"英国经济学家之父亚当·斯密,在《国富论》中举过一个经典的例子,证明分工能带来巨大的经济利益。

"一根针的制造,涉及18种工序:一个人抽铁线,一个人拉直,一个人切截,一个人削尖线的一端,一个人磨另一端,以便装上圆头......我见过一个小工厂,只雇用10个工人,因此在这个工厂中,有几个工人同时担任二三种工序。如果他们勤勉工作,一日能制造12磅的针,以每磅4000枚针计,这10个工人每日就可成针48000枚,即一人一日可成针4800枚。如果他们各自独立工作,不专门从事一种工序,那么,他们不论是谁,绝对不能一日制造20枚针,说不定一天连一枚针也制造不出来。他们不但不能制出今日由适当分工合作而制成的数量的240分之一,就连这数量的4800分之一,恐怕也制造不出来。"

历史已经证明了,分工是提高生产力的基本方法,可以大大提高效率、降低成本。

苹果公司控制一切的做法,明显违反分工原理。这注定了它的成本不会低,因此苹果产品总是比同类产品贵很多。

五、苹果的成败

既然苹果公司违反了分工原理,为什么它还能获得成功呢?

原因就是它的产品比对手的产品领先一大截,往往属于革命性的产品,引领了潮流。所以,即使价格非常贵,消费者还是愿意购买。从iPod到iBook,再到iPhone和iPad,都是如此。

这就是苹果的口号"think different"的背后真正含义:只有生产差异化产品,才能弥补高成本。

但是,苹果这种违反分工原理的做法,有其内在弱点。一旦苹果产品无法大幅度领先对手,不能引领潮流,消费者就不会愿意支付高价。那样的话,苹果公司就会有麻烦,控制整条产业链的巨额成本将无法得到补偿。

这就是目前正在发生的事。自从乔布斯去世后,苹果公司的新产品(包括iPad 3和4、iPhone 5、iPad mini)都是很优秀的产品,但不是革命性产品,与其他公司的产品的差距没有变大,反而正在变小。所以,股价出现了一路狂泻,华尔街担心消费者越来越不愿意为苹果产品支付额外的高价。

苹果真正需要推出的,不是iPhone和iPad的改进版,而是像Google GlassChromebook Pixel这样的完全意义上的新产品。

如果做不到,苹果就会遭到违反经济规律的报应,将不得不放弃对上下游的控制,以降低成本,并通过价格战,保住市场份额。

(完)

文档信息