google要走了,转俩文章以作备份

 

我在大学学习线性代数时,实在想不出它除了告诉我们如何解线性方程外,还能有什么别的用途。关于矩阵的许多概念,比如特征值等等,更是脱离日常生活。后来在数值分析中又学了很多矩阵的近似算法,还是看不到可以应用的地方。当时选这些课,完全是为了混学分的学位。我想,很多同学都多多少少有过类似的经历。直到后来长期做自然语言处理的研究,我才发现数学家们提出那些矩阵的概念和算法,是有实际应用的意义的。

在自然语言处理中,最常见的两类的分类问题分别是,将文本按主题归类(比如将所有介绍亚运会的新闻归到体育类)和将词汇表中的字词按意思归类(比如将各种体育运动的名称个归成一类)。这两种分类问题都可用通过矩阵运算来圆满地、同时解决。为了说明如何用矩阵这个工具类解决这两个问题的,让我们先来来回顾一下我们在余弦定理和新闻分类中介绍的方法

分类的关键是计算相关性。我们首先对两个文本计算出它们的内容词,或者说实词的向量,然后求这两个向量的夹角。当这两个向量夹角为零时,新闻就相关;当它们垂直或者说正交时,新闻则无关。当然,夹角的余弦等同于向量的内积。从理论上讲,这种算法非常好。但是计算时间特别长。通常,我们要处理的文章的数量都很大,至少在百万篇以上,二次回标有非常长,比如说有五十万个词(包括人名地名产品名称等等)。如果想通过对一百万篇文章两篇两篇地成对比较,来找出所有共同主题的文章,就要比较五千亿对文章。现在的计算机一秒钟最多可以比较一千对文章,完成这一百万篇文章相关性比较就需要十五年时间。注意,要真正完成文章的分类还要反复重复上述计算。

在文本分类中,另一种办法是利用矩阵运算中的奇异值分解(Singular Value Decomposition,简称 SVD)。现在让我们来看看奇异值分解是怎么回事。首先,我们可以用一个大矩阵A来描述这一百万篇文章和五十万词的关联性。这个矩阵中,每一行对应一篇文章,每一列对应一个词。



在上面的图中,M=1,000,000,N=500,000。第 i 行,第 j 列的元素,是字典中第 j 个词在第 i 篇文章中出现的加权词频(比如,TF/IDF)。读者可能已经注意到了,这个矩阵非常大,有一百万乘以五十万,即五千亿个元素。

奇异值分解就是把上面这样一个大矩阵,分解成三个小矩阵相乘,如下图所示。比如把上面的例子中的矩阵分解成一个一百万乘以一百的矩阵X,一个一百乘以一百的矩阵B,和一个一百乘以五十万的矩阵Y。这三个矩阵的元素总数加起来也不过1.5亿,仅仅是原来的三千分之一。相应的存储量和计算量都会小三个数量级以上。



三个矩阵有非常清楚的物理含义。第一个矩阵X中的每一行表示意思相关的一类词,其中的每个非零元素表示这类词中每个词的重要性(或者说相关性),数值越大越相关。最后一个矩阵Y中的每一列表示同一主题一类文章,其中每个元素表示这类文章中每篇文章的相关性。中间的矩阵则表示类词和文章雷之间的相关性。因此,我们只要对关联矩阵A进行一次奇异值分解,w 我们就可以同时完成了近义词分类和文章的分类。(同时得到每类文章和每类词的相关性)。

现在剩下的唯一问题,就是如何用计算机进行奇异值分解。这时,线性代数中的许多概念,比如矩阵的特征值等等,以及数值分析的各种算法就统统用上了。在很长时间内,奇异值分解都无法并行处理。(虽然 Google 早就有了MapReduce 等并行计算的工具,但是由于奇异值分解很难拆成不相关子运算,即使在 Google 内部以前也无法利用并行计算的优势来分解矩阵。)最近,Google 中国的张智威博士和几个中国的工程师及实习生已经实现了奇异值分解的并行算法,我认为这是 Google 中国对世界的一个贡献。

posted @ 2010-01-15 08:50 waemz 阅读(101) 评论(0) 编辑
摘要: 上一节做了分词器的实现,并实现了Simple、Standar、Cn、ICTCLAS几个分词算法。本节实现文档转向量表示,并命名为特征权重量化器,特征权重量化我只实现1个算法----TFIDF算法。阅读全文
posted @ 2009-05-29 21:45 waemz 阅读(319) 评论(0) 编辑
摘要: 我自己简易封装了一个分词器,使用Lucene.Net.类图如下阅读全文
posted @ 2009-05-29 18:14 waemz 阅读(258) 评论(1) 编辑
摘要: 接着上节的思路说,一个网页要想在浏览器中能够正确显示,需要在三个地方保持编码的一致:网页文件,网页编码声明和浏览器编码设置。阅读全文
posted @ 2009-05-28 23:30 waemz 阅读(127) 评论(0) 编辑
摘要: GB2312是对中国的开发人员来说很重要的一个词汇,它的来龙去脉并不需要我在这里赘述,随便Google之便明白无误。我只是想提一句,记得前一节说到编码字符集和字符集编码不是一回事,而有的字符集编码又实际上没有做任何事,GB2312正是这样一种东西!阅读全文
posted @ 2009-05-28 22:58 waemz 阅读(103) 评论(0) 编辑
摘要: 需要再一次强调的是,无论历史上的UCS还是现如今的Unicode,两者指的都是编码字符集,而不是字符集编码。花费一点时间来理解好这件事,然后你会发现对所有网页的,系统的,编码标准之间的来回转换等等繁杂事务都会思路清晰,手到擒来。 阅读全文
posted @ 2009-05-28 22:57 waemz 阅读(102) 评论(0) 编辑
摘要: 上回说到对于文本分类这样的不适定问题(有一个以上解的问题称为不适定问题),需要有一个指标来衡量解决方案(即我们通过训练建立的分类模型)的好坏,而分类间隔是一个比较好的指标。阅读全文
posted @ 2009-05-28 22:52 waemz 阅读(200) 评论(0) 编辑
摘要: 线性分类器(一定意义上,也可以叫做感知机) 是最简单也很有效的分类器形式.在一个线性分类器中,可以看到SVM形成的思路,并接触很多SVM的核心概念. 阅读全文
posted @ 2009-05-28 22:51 waemz 阅读(203) 评论(0) 编辑
摘要: 支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中[10]。 支持向量机方法是建立在统计学习理论的VC 维理论和结构风险最小原理基础上的,根据有限的样本信息在模型的复杂性(即对特定训练样本的学习精度,Accuracy)和学习能力(即无错误地识别任意样本的能力)之间寻求最佳折衷,以期获得最好的推广能力[14](或称泛化能力)。 以上是经常被有关SVM 的学术文献引用的介绍,有点八股,我来逐一分解并解释一下。 阅读全文
posted @ 2009-05-28 22:51 waemz 阅读(223) 评论(1) 编辑
posted @ 2009-03-06 17:30 waemz 阅读(513) 评论(0) 编辑
Code

 

posted @ 2009-03-06 17:09 waemz 阅读(427) 评论(0) 编辑
posted @ 2009-03-02 11:28 waemz 阅读(711) 评论(0) 编辑
摘要: 代码太多,编辑的时候卡的很,于是再整个(二) 前面贴完了分类器的代码,下面主程序如下阅读全文
posted @ 2009-02-25 09:21 waemz 阅读(1981) 评论(14) 编辑
摘要: 昨天有幸拜读了洞庭散人的<基于朴素贝叶斯分类器的文本分类算法>,我正在学习这个,我从内心感谢洞庭散人的分享!随即我把它移植到了c#平台上。 该程序用到了Lucene.Net,用到了基于词典的ICTCLAS中文分词1.0. 阅读全文
posted @ 2009-02-25 09:04 waemz 阅读(2483) 评论(10) 编辑
摘要: Ver2.1还添加了以下操作符: is - 和调用equal方法相同. Ex: #obj1 is obj2# 会返回if obj1 equal obj2 isnot - 和调用notequal方法相同. Ex: #obj1 isnot obj2# and - 相当于c#中的&&操作符 阅读全文
posted @ 2008-02-01 16:02 waemz 阅读(443) 评论(0) 编辑
摘要: AderTemplate只能运行于.NET2.0之上. 这里有一个简单例子:阅读全文
posted @ 2008-02-01 12:16 waemz 阅读(793) 评论(0) 编辑
摘要: 本人才疏学浅,具体实现原理不敢多说,仅仅写出使用方法,供大家参考.阅读全文
posted @ 2007-06-14 15:38 waemz 阅读(1116) 评论(0) 编辑
摘要: 话说十年前,有一个暴发户,他家有三辆汽车——Benz奔驰、Bmw宝马、Audi奥迪,还雇了司机为他开车。不过,暴发户坐车时总是怪怪的:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上Audi说“开奥迪车!”。你一定说:这人有病!直接说开车不就行了?!阅读全文
posted @ 2007-05-13 01:34 waemz 阅读(208) 评论(0) 编辑
摘要: 在业务复杂的应用程序中,有时候会要求一个或者多个任务在一定的时间或者一定的时间间隔内计划进行,比如定时备份或同步数据库,定时发送电子邮件等,我们称之为计划任务。实现计划任务的方法也有很多,可以采用SQLAgent执行存储过程来实现,也可以采用Windows任务调度程序来实现,也可以使用Windows服务来完成我们的计划任务,这些方法都是很好的解决方案。但是,对于Web应用程序来说,这些方法实现起来并不是很简单的,主机服务提供商或者不能直接提供这样的服务,或者需要你支付许多额外的费用。 本文就介绍一个直接在Web应用程序中使用的简单的方法,这个方法不需要任何额外的配置即可轻松实现。阅读全文
posted @ 2007-05-11 16:40 waemz 阅读(236) 评论(0) 编辑
摘要: 1. document.GetElementsByTagName可以获得某一个标签的所有元素,可以通过document.getElementsByTagName(‘*’)获得页面上的所有元素,这里星号代表任何标签,而注释标签的tagName是”!”阅读全文
posted @ 2007-04-24 01:11 waemz 阅读(127) 评论(0) 编辑