高分求教!请较在“文本检索”中效率较高的算法?

Hawk_lp 2002-12-15 12:48:57
加精
高分求教!请较在“文本检索”中效率较高的算法,最好能讲细一些?
...全文
156 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
xwolf2003 2003-03-27
  • 打赏
  • 举报
回复
看看.
alphax 2003-03-15
  • 打赏
  • 举报
回复
mark
Gencon 2003-02-10
  • 打赏
  • 举报
回复
用哈夫曼树不好么?
孩皮妞野 2003-02-09
  • 打赏
  • 举报
回复
标记
Cybergate 2003-02-09
  • 打赏
  • 举报
回复
全文检索和模式匹配一点关系都没有吗?
sclzmbie 2003-02-08
  • 打赏
  • 举报
回复
呵呵,同意 seeker2003(Seeker搜客) ,好像上面讨论的都离全文检索远了点。
seeker2003 2003-02-04
  • 打赏
  • 举报
回复
楼上的这帮人什么都不懂,别讨论了,丢人,什么KMP算法,那是字符串模式匹配,不是IR
aliceZOOZ 2003-01-31
  • 打赏
  • 举报
回复
kmp复杂度是O(n+m),
编辑距离复杂度可以降到O(nm/log(n))
nabie 2003-01-26
  • 打赏
  • 举报
回复
GOOGLE 是基于索引的检索,需要使用大量的时间来建立索引,并且要使用大量的空间来存储索引,而且 GOOGLE 是按词匹配而不是按字节匹配。要看你到底想解决什么问题再考虑选什么算法。
ninny 2003-01-25
  • 打赏
  • 举报
回复
up!
suxiao 2003-01-22
  • 打赏
  • 举报
回复
在那里可以看到GOOGLE的算法实现,谢谢了!请高手指点。。。
callwa 2003-01-16
  • 打赏
  • 举报
回复
去看看GOOGLE
的算法实现
是用PASCAL
写成的
lijn 2003-01-11
  • 打赏
  • 举报
回复
to: sameboat(sameboat)
KMP 算法的时间复杂度是 O(m+n)

nabie 2003-01-10
  • 打赏
  • 举报
回复
为什么不用 Boyer Moore 算法,那差不多是现在最快的字符串精确匹配算法。你用 GOOGLE 查一查,资料有 N 篇。
computersim 2003-01-05
  • 打赏
  • 举报
回复
gz
sameboat 2002-12-31
  • 打赏
  • 举报
回复
leslin(我是程序员我怕谁):
KMP 算法的时间复杂度不是 m+n (不好估计)
KMP的局限在于:
(1)适用于主串和模式串字符集较小时;若字符集较大,则next函数很难发挥它的作用,此时(指字符集较大时),它的时间复杂度约为 m*n+m (不要忘记while循环有两个变元)。
(2)KMP只能“精确”比较,K-近似匹配可近似比较
假设K=1,则
“happy”==“heppy”==“happj”== ...
个人观点,如有问题,还可继续讨论。
马老哈 2002-12-28
  • 打赏
  • 举报
回复
SameBoat 说的在一般文本处理中一般称作计算两个字符串的“编辑距离”。有一点需要更正:编辑距离的计算时间复杂度为 m*n,不谈其和 KMP 算法的用处不同(KMP是用来匹配子串的),说其比 KMP 算法效率高是不对的,KMP 算法的复杂度是 m + n。
Hawk_lp 2002-12-26
  • 打赏
  • 举报
回复
模糊的更好,关键是速度!
cxy007 2002-12-26
  • 打赏
  • 举报
回复
就用模式匹配不行吗?线性的复杂度。
你要的是找完全一样的还是模糊的比较?
sameboat 2002-12-22
  • 打赏
  • 举报
回复
我们的教材:
Computer Algorithms
Introduction to Design and Analysis
(Third Edition)
Sara Baase

k-近似匹配(有图的地方只能跳过)
-------------------------------------------------------
近似串匹配(Approximate String Matching)问题
用动态规划方法解近似串匹配问题是DP算法的另一个成功的应用范例。从这一实例,可以看到如何巧妙地把问题归结为代价函数的递推关系。近似串匹配不仅仅用于在一个文本中查找某单词的近似出现,或纠正文本中的编辑错误,也可以应用于另外一些领域。例如,语音识别、手写字符图像的匹配和氨基酸分子序列的鉴别等,都可以归结为近似串的匹配问题。
7.3.1 近似串匹配问题
在一个连续文本中查找某特定的单词,由于单词本身可能有文法上的变化,加上书写和印刷方面的错误,因此,实际问题中往往需要近似匹配,这种匹配与上一章介绍的串匹配问题不同。实际问题中需要确定两个字符串是否“近似”,这不是一个简单易解的问题。例如,我们可以说pattern与patern是近似的,而与patient不近似,这就存在一个差别的大小问题。设样本为P:p1p2...pm,文本为T:t1t2...tn。
K-近似匹配(K-approximate match):对于非负整数K,样本P在文本T中的K-近似匹配,是指P在T中的包含至多K个差别的匹配。
这里所指的差别(difference)是指下列三种情况之一:
修改(revise):P与T中的对应字符不同;
删去(delete):T中含有一个未出现在P中的字符;
插入(insert):T中不含有出现在P中的一个字符。
例如,下面是一个包含上述三种差别的3-近似匹配,一般的情形是样本P是正确的,文本T中包含上述三类错误,一般称之为编辑错误。

事实上,能够指出上例中的两个字符串有三个差别,并不是一件容易的事,因为不同的对应方法可以得到不同的K值。例如,把两者从字符a开始,顺序一一对应,可以计算出有6个修改(revise)错误。改变对应方法,就会产生不同的结论。因此应该指出,P与T为K-近似匹配,包含下面两层含义:
1° 二者的差别数至多为K;
2° 差别数是指二者在所有不同匹配对应方式下的最小编辑错误总数。
因此,一般的K-近似匹配问题可以描述为:
已知:字符串P: p1p2...pm(称为Pattern),字符串T:t1t2...tn(称为Text),和一个正整数K。
求:样式P在文本T上的K-近似匹配的第一次出现或所有出现。
与前一章的字符串匹配问题相比,近似串匹配问题以K-近似匹配代替了完全匹配,这一差别使得问题的解决发生了本质的变化。在完全串匹配中,P在T上的一次匹配检查十分简单,用至多m次字符比较即可完成,问题的关键是确定一次匹配检查之后样本P的移动方法。最简单的方法是移动一位,更巧妙的方法则可以在不丢解的条件下移动较大的距离。K-近似匹配的关键是P在T上的K-近似匹配检查,即计算样本P与当前对应的文本T之子串的最小差别数。如果该值小于等于K,则找到结果,否则样本P右移。过程中的计算集中在计算最小差别数上,这实际上是一个优化问题,比完全匹配问题复杂得多。
近似串匹配的一个简化问题是比较两个字符串的差别。例如,OCR(光学字符识别)系统是通过在计算机上运行识别算法,将扫描仪扫描得到的字符文本的图像信息转化为作为识别结果的字符串。为了确定OCR系统的识别率,需要对原始字符串和识别结果字符串进行比较。这种比较,实际上就是简化的近似串匹配问题,它应计算出结果字符串与原始字符串间的最小编辑错误数。
7.3.2 DP算法的思路
直观上看,近似串匹配问题与上文中讲到的矩阵乘积和最优二分搜索树问题有较大的差别。然而通过进一步的分析可以发现,近似串匹配问题同样具有最优子结构性质和子结构重迭性质。
· 如果样本p1p2...pm在文本T的某一位置上有一最优(差别数最小)的对应关系,那么样本P的任意一个子串pi...pj(1≤i<j≤m)与T的对应关系也必然是最优(差别数最小)的。
· 计算样本P对应文本T某一位置的最小差别数时,对P的任一子串pi...pj与T相应位置上的最小差别数的计算,必然包含计算任何包含pi...pj的P及其子串的最小差别数的过程中。
因此,可以考虑用动态规划方法设计出快速的近似串匹配算法,问题的关键是如何找出代价函数的自底向上的递推关系。为此我们定义一个代价函数D[i][j],0≤i≤m,0≤j≤n。D[i][j]表示样本子串p1...pi与文本子串t1...tj之间的最小差别数。由此可知:
D[m][j]表示样本P在文本T的位置j处的最小差别数,如果D[m][j]≤K,说明P在tj处找到了K-近似匹配。
代价函数的初始值很容易确定:
D[0][j]=0,这是因为样本P为空串,与文本t1...tj有0个字符不同;
D[i][0]=i,这是因为样本串p1...pi与空文本串相比,有i个字符不同。
可以通过下面的简单分析得出代价函数的递推关系。当样本子串p1...pi与文本子串t1...tj对应时,有四种可能的情况:
(1) 字符pi与tj相对应且pi=tj,总差别数为D[i-1][j-1];
(2) 字符pi与tj相对应且pi≠tj,总差别数为D[i-1][j-1]+1;
(3) 字符tj为多余,即tj对应于空格,总差别数为D[i][j-1]+1;
(4) 字符pi对应于tj后的空格,总差别数为D[i-1][j]+1。
根据代价函数D[i][j]的定义,它应该取所有可能值之中的最小者,即

代价函数D[i][j]实际上是一个二维数组,其初始值和D[i][j]的计算方法由Fig7.7表示,每个D[i][j]的值总是由其左上方的三个已知值来确定。

7.3.3 DP算法
近似串匹配的DP算法十分简单,假定只要求出样本P在文本T中的K-近似匹配的第一次出现,即给出第一次K-近似匹配时,字符pm在文本Text中所处位置的下标。算法可以表示为:
算法7.4 近似串匹配算法ASM
int ASM(char[] P, char[] T, int m, int n, int K){
int i,j,k,D[m][n];
for(j=1;j<=n;j++) D[0][j]=0;
for(i=0;i<=m;i++) D[i][0]=i;
for(j=1;j<=n;j++){
for(i=1;i<=m;i++){
if(P[i]==T[j])
D[i][j]=min{D[i-1][j-1],D[i-1][j]+1,D[i][j-1]+1};
else
D[i][j]=min{D[i-1][j-1]+1,D[i-1][j]+1,D[i][j-1]+1};
if(D[m][j]<=K) return j;
}
}
}

加载更多回复(18)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧