如何对两段文字进行比较,得出相似程度
如何对两段文字进行比较,得出相似程度,用百分比表示?
如:
文字段1:
====================================
近日,我国两艘海洋调查船前往钓鱼岛附近(海域)活动,却被日本海上保安厅巡逻舰强行驱离。日本方面就此大做文章,(各大媒体)网站都在显著位置报道称“中国海洋调查船入侵日本领海”。(日本政府也放出厥词宣称“尖阁诸岛(钓鱼岛)是日本的固有领土”。)
文字段2:
====================================
近日,我国两艘海洋调查船前往钓鱼岛附近活动,却被日本海上保安厅巡逻舰强行驱离。日本方面就此大做文章,网站都在显著位置报道称“中国海洋调查船入侵日本领海”。
====================================
注:文字段1中的括号部分是在文字段2中删除的文字,如何得到大概下面的结果:
每句相似率:60%,整体文字的相似率(也就是可能出现的每句顺序的不同):80%,整体的相似率(60%+80%)/2=70%
需要考虑的问题:每句文字的相似率,整体文字的相似率,整段文字的相似率
请高手以Code演示,谢谢!
[解决办法]
C source code of "SIM" by Dick Grune : The software and text similarity tester SIM
Introduction to Algorithms: Text/HTML Similarity Algorithms
[解决办法]
http://download.csdn.net/source/805540
给你找了个下载地址,你看哈
[解决办法]
- C# code
using System;using System.Collections.Generic;using System.Text;namespace kmp{ /// <summary> /// Summary description for Class1. /// </summary> class Class1 { /// <summary> /// The main entry point for the application. /// </summary> static int[] next = new int[200]; static int count = 0; [STAThread] static void Main(string[] args) { // // TODO: Add code to start application here // int pos = 0, reval; char[] p1 = @"近日,我国两艘海洋调查船前往钓鱼岛附近(海域)活动,却被日本海上保安厅巡逻舰强行驱离。日本方面就此大做文章,(各大媒体)网站都在显著位置报道称“中国海洋调查船入侵日本领海”。(日本政府也放出厥词宣称“尖阁诸岛(钓鱼岛)是日本的固有领土”。) ".ToCharArray(); char[] p2 = @"近日,我国两艘海洋调查船前往钓鱼岛附近活动,却被日本海上保安厅巡逻舰强行驱离。日本方面就此大做文章,网站都在显著位置报道称“中国海洋调查船入侵日本领海”。".ToCharArray(); Console.WriteLine("第一个文字段长度为{0},第二个文字段长度为{1}", p1.Length, p2.Length); get_goodnext(p2, next); reval = index_kmp(p1, p2, pos); Console.WriteLine("====this is good kmp ===="); Console.WriteLine("value={0},count={1}", reval, count); Console.ReadLine(); } static int index_kmp(char[] a, char[] b, int pos) { int i = pos, j = 0; int lena = a.Length, lenb = b.Length; count = 0; while ((i <= lena - 1) && (j <= lenb - 1)) { if (j == -1 || a[i] == b[j]) { ++i; ++j;count++; } else { j = next[j]; } } if (j > lenb - 1) return i - lenb; else return 0; } static void get_goodnext(char[] a, int[] next) { int i = 0, j = -1; next[0] = -1; while (i < a.Length - 1) { if (j == -1 || a[i] == a[j]) { ++i; ++j; if (a[i] != a[j]) { next[i] = j; } else { next[i] = next[j]; } } else { j = next[j]; } } } }}
[解决办法]
可以参考Google《数学之美》系列文章,http://googlechinablog.com/2006/04/blog-post.html,文章列表在右边的“科学与技术”中,其中谈到了相似度的计算方法
[解决办法]
恐怕跟kmp还是有些区别的。
比较相似的算法应当满足这个条件:
strA与strB的相似度=strB与strA的相似度。
有个比法,效率恐怕比kmp差一点,但思路挺简单的。
比如:
strA = "我国两艘海洋调查船前往钓鱼岛附近(海域)活动,却被日本海上保安厅巡逻舰强行驱离"
strB = "近日,我国两艘海洋调查船前往钓鱼岛附近活动"
错开比:
我国两艘海洋调查船前往钓鱼岛附近(海域)活动,却被日本海上保安厅巡逻舰强行驱离
近日,我国两艘海洋调查船前往钓鱼岛附近活动
我国两艘海洋调查船前往钓鱼岛附近(海域)活动,却被日本海上保安厅巡逻舰强行驱离
近日,我国两艘海洋调查船前往钓鱼岛附近活动
我国两艘海洋调查船前往钓鱼岛附近(海域)活动,却被日本海上保安厅巡逻舰强行驱离
近日,我国两艘海洋调查船前往钓鱼岛附近活动
......
我国两艘海洋调查船前往钓鱼岛附近(海域)活动,却被日本海上保安厅巡逻舰强行驱离
近日,我国两艘海洋调查船前往钓鱼岛附近活动
......
我国两艘海洋调查船前往钓鱼岛附近(海域)活动,却被日本海上保安厅巡逻舰强行驱离
近日,我国两艘海洋调查船前往钓鱼岛附近活动
......
我国两艘海洋调查船前往钓鱼岛附近(海域)活动,却被日本海上保安厅巡逻舰强行驱离
近日,我国两艘海洋调查船前往钓鱼岛附近活动
用一个长度为strB.length的bool数组,统计strB被匹配的情况,这样一遍下来之后,就可以统计出strB中每个字符是否被匹配过。
统