日期:2014-05-18  浏览次数:21146 次

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

如: 
文字段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 = "我国两艘海洋调查船前往钓鱼岛附近(海域)活动,却被日本海上保安厅巡逻舰强行驱离"