web挖掘.docx
《web挖掘.docx》由会员分享,可在线阅读,更多相关《web挖掘.docx(29页珍藏版)》请在冰豆网上搜索。
web挖掘
在“文本比较算法Ⅰ——LD算法”中,介绍了编辑距离的计算。
在“文本比较算法Ⅱ——Needleman/Wunsch算法”中,介绍了最长公共子串的计算。
在给定的字符串A和字符串B,LD(A,B)表示编辑距离,LCS(A,B)表示最长公共子串的长度。
如何来度量它们之间的相似度呢?
不妨设S(A,B)来表示字符串A和字符串B的相似度。
那么,比较合理的相似度应该满足下列性质。
性质一:
0≤S(A,B)≤100%,0表示完全不相似,100%表示完全相等
性质二:
S(A,B)=S(B,A)
目前,网上介绍的各种相似度的计算,都有各自的不尽合理的地方。
计算公式一:
S(A,B)=1/(LD(A,B)+1)
能完美的满足性质二。
当LD(A,B)=0时,S(A,B)=100%,不过无论LD(A,B)取任何值,S(A,B)>0,不能满足性质一。
计算公式二:
S(A,B)=1-LD(A,B)/Len(A)
当Len(B)>Len(A)时,S(A,B)<0。
不满足性质一。
有人会说,当S(A,B)<0时,强制指定S(A,B)=0就解决问题了。
问题是,S(A,B)=1-LD(A,B)/Len(A),而S(B,A)=1-LD(B,A)/Len(B)。
当Len(A)≠Len(B)时,S(A,B)≠S(B,A)。
不满足性质二
还有一个例子可以说明问题
A="BC",B="CD",C="EF"
S(A,B)=1-LD(A,B)/Len(A)=1-2/2=0
S(A,C)=1-LD(A,C)/Len(A)=1-2/2=0
A和B的相似度与A和C的相似度是一样的。
不过很明显的是B比C更接近A
计算公式三:
S(A,B)=LCS(A,B)/Len(A)
这个公式能完美的满足的性质一
不过当Len(A)≠Len(B)时,S(A,B)≠S(B,A)。
不满足性质二
用一个例子说明问题
A="BC",B="BCD",C="BCEF"
S(A,B)=LCS(A,B)/Len(A)=2/2=100%
S(A,C)=LCS(A,C)/Len(A)=2/2=100%
A和B的相似度与A和C的相似度是一样的。
不过很明显的是B比C更接近A
上面是网上能找到的三个计算公式,从上面的分析来看都有各自的局限性。
我们看一个例子:
A=GGATCGA,B=GAATTCAGTTA,LD(A,B)=5,LCS(A,B)=6
他们的匹配为:
A:
GGA_TC_G__A
B:
GAATTCAGTTA
可以看出上面蓝色的部分表示的是LCS部分,黑色表示的是LD部分。
因此,给出一个新的公式
S(A,B)=LCS(A,B)/(LD(A,B)+LCS(A,B))
这个公式能解决上述三个公式的种种不足。
而LD(A,B)+LCS(A,B)表示两个字符串A、B的最佳匹配字串的长度。
这个是唯一的。
还有注意的是LD(A,B)+LCS(A,B)和Max(Len(A),Len(B))这两个并不完全相等。
中文搜索引擎之文本分类 2007/06/04
作者:
KelvinfromHour41( )
文本分类就是根据预先定义的主题类别,按照一定的规则将文档集合中未知类别的文本自动确定一个类别,涉及数据挖掘、计算语义学、信息学、人工智能等个学科,是自然语言处理的一个重要应用领域。
目前,越来越多的统计分类方法、机器学习方法、数据挖掘技术和其它的新技术被应用到文本自动分类领域中,如:
回归模型、最近邻分类器、规则学习算法、相关反馈技术、专家投票分类法、人工神经网络等。
这些方法都能对一个预先分好类的文本集进行学习,获取每个类别的特征,自动生成分类规则,建立一个文本分类器。
1.文本分类的一般过程
一个完整的文本分类过程主要包括以下几部分:
首先是预处理,根据采用的分类模型将文档集表示成易于计算机处理的形式;其次是项权重的计算,根据适宜的权重计算方法表示文档中各项的重要性;再次是根据预处理的训练集(已预知类别的文档)学习建模,构建出分类器;最后利用测试集文档按一定的测试方法测试建立好的分类器的性能,并不断反馈、学习提高该分类器性能,直至达到预定的目标。
2.文本的预处理
由于通常文本都是非结构化的,计算机很难直接对其进行处理,因而在分类之前要对文本做一定的预处理,将非结构化的文档转换为适合于学习算法以及分类任务的表示形式。
一般采用的方法是词袋表示法,该方法把文本看成是若干个词构成的集合,其中每个词称为一项特征,根据文本的长度、其出现的频率不同,词的重要性也有所不同,在向量空间模型中这种重要性被称为权重;权重的计算主要依据下面两个方面:
1)一个项在某文档中出现的次数越多,它和该文档的主题就越相关。
2)一个项在选取的文档集中出现的次数越多,它刻画某个特定文档特征的能力就越弱。
常用的权重计算方法有:
布尔加权法、词频加权法、tf×idf和熵加权法。
3.降维技术
文本分类的一个核心难题就是特征空间的高维性,一个文档集中的特征项动辄就是上万维,这么高的维数特征不仅带来极高的计算复杂度,产生维度灾难,也给分类过程带来了大量的噪音,且容易产生过度拟合的问题,因而有必要简化原始的特征集,这种简化技术就是降维技术。
降维技术主要分成两大类:
特征选择和特征提取。
特征选择又称独立评估法,其目的是滤除携带信息量较少的词,只保留对分类贡献较大的词。
在特征选择时一般都是利用某种评价函数,独立地对每个原始特征项进行评分,然后按分值的高低将它们排序,从中选取若干个分值最高的特征项,以达到减少总特征数的目的。
因此,评价函数的好坏是影响特征选择的关键问题。
特征选择一般有:
文档频率、信息增益、期望交叉熵、互信息、文本证据权、奇率、x2统计量等。
特征提取又称综合评估法,它是将原有的特征集T加以联系和转化以构建新特征集T'的过程,一般|T'|《|T|,因而可达到降维的效果;特征提取的思想是:
由于一词多义、多词一义的现象大量存在于文本信息中,导致文本的原始项可能不是文档内容表示的最佳维度。
特征提取就是试图通过重构新项来避免上述问题。
一般有项聚类、潜在语义索引(LSI)、多维尺度变换、自组织特征映射等。
4.传统文本分类模型
A、k近邻分类模型
k近邻分类模型,是最著名的模式识别统计学方法之一,它在很早就被用于文本分类研究,而且是取得最好结果的文本分类算法之一。
kNN分类模型的原理如下:
给定一个待分类的测试文档,考察和待分类文本最相似的k篇文本,根据这k篇文本的类别来判断待分类文本的类别值。
k近邻法没有离线训练阶段,所有的计算都是在线进行的。
因此这种方法的实时性不好,计算的时间复杂性是O(L*N),其中L是待分类文本向量中非0的分量个数,而N是训练集的文本数量。
B、朴素贝叶斯模型
朴素贝叶斯分类算法是一种最常用的有指导意义的方法,它以贝叶斯理论为基础,是一种在已知先验概率与条件概率的情况下的模式识别方法。
朴素贝叶斯分类算法基于独立性假设,即一个属性对给定类的影响独立于其它属性。
C、支持向量机
支持向量机(SupportVectorMachines:
SVM)理论,用于解决二分类模式识别问题。
它基于结构风险最小化原则,在向量空间中找到一个决策面(decisionsurface),这个面能“最好”地分割两个分类中的数据点。
目前,比较有效的SVM实现方法包括Joachims的SVMlight系统和Platt的序列最小优化算法。
5.文本分类的一些新模型
A、 基于RBF网络的文本分类模型
基于RBF网络的文本分类模型把监督方法和非监督方法相结合,通过两层映射关系对文本进行分类,首先利用非监督聚类方法根据文本本身的相似性聚出若干个簇,使得每个簇内部的相似性尽可能高而簇之间的相似性尽可能低,并由此产生第一层映射关系,即文本到簇的映射,然后通过监督学习方法构造出第二层映射关系,即簇集到目标类集合的映射。
然后为每一个簇定义一个相应的径向基函数(RadialBa-sisFunction,RBF),并确定这些基函数的中心和宽度,利用这些径向基函数的线形组合来拟合训练文本,利用矩阵运算得到线性组合中的权值,在计算权值时,为了避免产生过度拟合的现象,采用了岭回归技术,即在代价函数中加入包含适当正规化参数的权值惩罚项,从而保证网络输出函数具有一定的平滑度。
B、基于模糊-粗糙集的文本分类模型
文本分类过程中由于同义词、多义词、近义词的存在导致许多类并不能完全划分开来,造成类之间的边界模糊。
此外交叉学科的发展,使得类之间出现重叠,于是造成许多文本信息并非绝对属于某个类。
这两种情况均会导致分类有偏差。
利用粗糙-模糊集理论结合kNN方法来处理在文本分类问题中出现的这些偏差。
模糊-粗糙集理论有机的结合了模糊集理论与粗糙集理论在处理不确定信息方面的能力。
粗糙集理论体现了由于属性不足引起集合中对象间的不可区分性,即由于知识的粒度而导致的粗糙性;而模糊集理论则对集合中子类边界的不清晰定义进行了模型化,反映了由于类别之间的重叠体现出的隶属边界的模糊性。
它们处理的是两种不同类别的模糊和不确定性。
将两者结合起来的模糊-粗糙集理论能更好地处理不完全知识。
C、潜在语义分类模型
在语义分类模型(LatentSemanticClassification:
LSC),与LSI模型类似,从原始文档空间中得到一个语义空间;然而不同的是,通过第二类潜在变量的加入,把训练集文档的类别信息引入到了语义空间中。
也就是在尽量保留训练集文档的词信息的同时,通过对词信息和类别信息联合建模,把词和类别之间的关联考虑进来。
这样,就可以得到比LSI模型的语义空间更适合文本分类的语义空间。
D、基于核方法的潜在语义文本分类模型
基于核方法学习最初以SVM的形式出现,用于解决分类中遇到的一些问题。
后来,JoachimsT。
把SVM运用到文本分类中取得了非常好的性能。
在信息检索领域,文本的向量空间等表示形式为构造Mercer核提供了一个理想的特征映射。
受核方法的启示,为了提高分类性能,通过引入核函数给出了一种非线性的潜在语义文本分类模型,即基于核方法的潜在语义文本分类模型。
E、基于潜在语义的多类文本分类
基于扩展的潜在语义多类分类算法,在考虑文档特征信息的同时,又考虑文档的多类别信息,这实际上是过滤掉对分类贡献不大的词,而只保留那些对于分类贡献大的词。
这些词虽然在整个文档集中不是重要的词,但是对于分类却是重要的。
这样,既能较好的解决文档中同义词和多义词的问题,又能解决多类属分类问题。
F、基于投影寻踪回归的文本模型
基于投影寻踪回归的文本分类模型的思想是:
将文本表示为向量形式,然后将此高维数据投影到低维子空间上,并寻找出最能反映原高维数据的结构和特征的投影方向,然后将文本投影到这些方向,并用岭函数进行拟合,通过反复选取最优投影方向,增加岭函数有限项个数的方法使高维数据降低维数,最后采用普通的文本分类算法进行分类。
6.概述
目前文本分类在许多场合中都扮演着非常重要的角色,如文本索引、文本过滤、自动产生文档元数据、单词语义消歧、web资源的按层次分类组织,此外,所有需要进行文档自动整理、自动选择和发送文档的应用系统也都需要文本分类技术。
相似性算法特征选取(自阅)
本文介绍基于最长公共子串的文本比较算法——Needleman/Wunsch算法。
还是以实例说明:
字符串A=kitten,字符串B=sitting
那他们的最长公共子串为ittn(注:
最长公共子串不需要连续出现,但一定是出现的顺序一致),最长公共子串长度为4。
定义:
LCS(A,B)表示字符串A和字符串B的最长公共子串的长度。
很显然,LSC(A,B)=0表示两个字符串没有公共部分。
Rev(A)表示反转字符串A
Len(A)表示字符串A的长度
A+B表示连接字符串A和字符串B
性质:
LCS(A,A)=Len(A)
LCS(A,"")=0
LCS(A,B)=LCS(B,A)
0≤LCS(A,B)≤Min(Len(A),Len(B))
LCS(A,B)=LCS(Rev(A),Rev(B))
LCS(A+C,B+C)=LCS(A,B)+Len(C)
LCS(A+B,A+C)=Len(A)+LCS(B,C)
LCS(A,B)≥LCS(A,C)+LCS(B,C)
LCS(A+C,B)≥LCS(A,B)+LCS(B,C)
为了讲解计算LCS(A,B),特给予以下几个定义
A=a1a2……aN,表示A是由a1a2……aN这N个字符组成,Len(A)=N
B=b1b2……bM,表示B是由b1b2……bM这M个字符组成,Len(B)=M
定义LCS(i,j)=LCS(a1a2……ai,b1b2……bj),其中0≤i≤N,0≤j≤M
故:
LCS(N,M)=LCS(A,B)
LCS(0,0)=0
LCS(0,j)=0
LCS(i,0)=0
对于1≤i≤N,1≤j≤M,有公式一
若ai=bj,则LCS(i,j)=LCS(i-1,j-1)+1
若ai≠bj,则LCS(i,j)=Max(LCS(i-1,j-1),LCS(i-1,j),LCS(i,j-1))
计算LCS(A,B)的算法有很多,下面介绍的Needleman/Wunsch算法是其中的一种。
和LD算法类似,Needleman/Wunsch算法用的都是动态规划的思想。
在Needleman/Wunsch算法中还设定了一个权值,用以区分三种操作(插入、删除、更改)的优先级。
在下面的算法中,认为三种操作的优先级都一样。
故权值默认为1。
举例说明:
A=GGATCGA,B=GAATTCAGTTA,计算LCS(A,B)
第一步:
初始化LCS矩阵
Needleman/Wunsch算法矩阵
G
A
A
T
T
C
A
G
T
T
A
0
0
0
0
0
0
0
0
0
0
0
0
G
0
G
0
A
0
T
0
C
0
G
0
A
0
第二步:
利用公式一,计算矩阵的第一行
Needleman/Wunsch算法矩阵
G
A
A
T
T
C
A
G
T
T
A
0
0
0
0
0
0
0
0
0
0
0
0
G
0
1
1
1
1
1
1
1
1
1
1
1
G
0
A
0
T
0
C
0
G
0
A
0
第三步:
利用公式一,计算矩阵的其余各行
Needleman/Wunsch算法矩阵
G
A
A
T
T
C
A
G
T
T
A
0
0
0
0
0
0
0
0
0
0
0
0
G
0
1
1
1
1
1
1
1
1
1
1
1
G
0
1
1
1
1
1
1
1
2
2
2
2
A
0
1
2
2
2
2
2
2
2
2
2
2
T
0
1
2
2
3
3
3
3
3
3
3
3
C
0
1
2
2
3
3
4
4
4
4
4
4
G
0
1
2
2
3
3
3
4
5
5
5
5
A
0
1
2
3
3
3
3
4
5
5
5
6
则,LCS(A,B)=LCS(7,11)=6
可以看出,Needleman/Wunsch算法实际上和LD算法是非常接近的。
故他们的时间复杂度和空间复杂度也一样。
时间复杂度为O(MN),空间复杂度为O(MN)。
空间复杂度经过优化,可以优化到O(M),但是一旦优化就丧失了计算匹配字串的机会了。
由于代码和LD算法几乎一样。
这里就不再贴代码了。
还是以上面为例A=GGATCGA,B=GAATTCAGTTA,LCS(A,B)=6
他们的匹配为:
A:
GGA_TC_G__A
B:
GAATTCAGTTA
如上面所示,蓝色表示完全匹配,黑色表示编辑操作,_表示插入字符或者是删除字符操作。
如上面所示,蓝色字符有6个,表示最长公共子串长度为6。
利用上面的Needleman/Wunsch算法矩阵,通过回溯,能找到匹配字串
第一步:
定位在矩阵的右下角
Needleman/Wunsch算法矩阵
G
A
A
T
T
C
A
G
T
T
A
0
0
0
0
0
0
0
0
0
0
0
0
G
0
1
1
1
1
1
1
1
1
1
1
1
G
0
1
1
1
1
1
1
1
2
2
2
2
A
0
1
2
2
2
2
2
2
2
2
2
2
T
0
1
2
2
3
3
3
3
3
3
3
3
C
0
1
2
2
3
3
4
4
4
4
4
4
G
0
1
2
2
3
3
3
4
5
5
5
5
A
0
1
2
3
3
3
3
4
5
5
5
6
第二步:
回溯单元格,至矩阵的左上角
若ai=bj,则回溯到左上角单元格
Needleman/Wunsch算法矩阵
G
A
A
T
T
C
A
G
T
T
A
0
0
0
0
0
0
0
0
0
0
0
0
G
0
1
1
1
1
1
1
1
1
1
1
1
G
0
1
1
1
1
1
1
1
2
2
2
2
A
0
1
2
2
2
2
2
2
2
2
2
2
T
0
1
2
2
3
3
3
3
3
3
3
3
C
0
1
2
2
3
3
4
4
4
4
4
4
G
0
1
2
2
3
3
3
4
5
5
5
5
A
0
1
2
3
3
3
3
4
5
5
5
6
若ai≠bj,回溯到左上角、上边、左边中值最大的单元格,若有相同最大值的单元格,优先级按照左上角、上边、左边的顺序
Needleman/Wunsch算法矩阵
G
A
A
T
T
C
A
G
T
T
A
0
0
0
0
0
0
0
0
0
0
0
0
G
0
1
1
1
1
1
1
1
1
1
1
1
G
0
1
1
1
1
1
1
1
2
2
2
2
A
0
1
2
2
2
2
2
2
2
2
2
2
T
0
1
2
2
3
3
3
3
3
3
3
3
C
0
1
2
2
3
3
4
4
4
4
4
4
G
0
1
2
2
3
3
3
4
5
5
5
5
A
0
1
2
3
3
3
3
4
5
5
5
6
若当前单元格是在矩阵的第一行,则回溯至左边的单元格
若当前单元格是在矩阵的第一列,则回溯至上边的单元格
Needleman/Wunsch算法矩阵
G
A
A
T
T
C
A
G
T
T
A
0
0
0
0
0
0
0
0
0
0
0
0
G
0
1
1
1
1
1
1
1
1
1
1
1
G
0
1
1
1
1
1
1
1
2
2
2
2
A
0
1
2
2
2
2
2
2
2
2
2
2
T
0
1
2
2
3
3
3
3
3
3
3
3
C
0
1
2
2
3
3
4
4
4
4
4
4
G
0
1
2
2
3
3
3
4
5
5
5
5
A
0
1
2
3
3
3
3
4
5
5
5
6
依照上面的回溯法则,回溯到矩阵的左上角
第三步:
根据回溯路径,写出匹配字串
若回溯到左上角单元格,将ai添加到匹配字串A,将bj添加到匹配字串B
若回溯到上边单元格,将ai添加到匹配字串A,将_添加到匹配字串B
若回溯到左边单元格,将_添加到匹配字串A,将bj添加到匹配字串B
搜索晚整个匹配路径,匹配字串也就完成了
可以看出,LD算法和Needleman/Wunsch算法的回溯路径是一样的。
这样找到的匹配字串也是一样的。
不过,Needleman/Wunsch算法和LD算法一样,若要找出匹配字串,空间的复杂度就一定是O(MN),在文本比较长的时候,是极为耗用存储空间的。
故若要计算出匹配字串,还得用其他的算法,留待后文介绍。
在日常应用中,文本比较是一个比较常见的问题。
文本比较算法也是一个老生常谈的话题。
文本比较的核心就是比较两个给定的文本(可以是字节流等)之间的差异。
目前,主流的比较文本之间的差异主要有两大类。
一类是基于编辑距离(EditDistance)的,例如LD算法。
一类是基于最长公共子串的(LongestCommonSubsequence),例如