读书人

怎么对两段文字进行比较得出相似程度

发布时间: 2012-03-23 12:06:21 作者: rapoo

如何对两段文字进行比较,得出相似程度
如何对两段文字进行比较,得出相似程度,用百分比表示?

如:
文字段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中每个字符是否被匹配过。

读书人网 >C#

热点推荐