这个比较文本用到的主要是余弦定理比较文本相似度,具体原理右转某度,主要适用场景是在考试系统中的简答题概述,可根据权重自动打分,感觉实用性蛮广的。

先说下思路:

  1. 文本分词,中文于英文不同,规范的英文每个都有空格自动分词,中文则是连成长串,我们只有一一比对每个词出现的频率做简单的比较,在这里使用到了SCWS的一个分词api接口http://www.ftphp.com/scws/api.php(仅支持POST,因为要模拟Http请求,所以请求时间也是根据具体环境而定,所以可以自己手写一些字典,本地分词要来的快)。但是用此接口分词过程中,标点符号不会被去掉,所以需要自己手动写方法去掉标点。
  2. 获取两个文本的去重复并集
  3. 比较每个词出现的频率
  4. 根据余弦定理计算权重

下面是具体的代码段(请求是在网上找的,原链接找不到了。。)

class Program
{
static void Main(string[] args)
{
Console.Write(Sim("床前明月光,疑是地上霜", "床前明月光,疑是地上霜"));
}
public static double Sim(string txt1, string txt2)
{
List<string> sl1 = Segment(txt1);
List<string> sl2 = Segment(txt2);
//去重
List<string> sl = sl1.Union(sl2).ToList<string>();
//获取重复次数
List<int> arrA = new List<int>();
List<int> arrB = new List<int>(); foreach (var str in sl)
{
arrA.Add(sl1.Where(x => x == str).Count());
arrB.Add(sl2.Where(x => x == str).Count());
}
//计算商
double num = 0;
//被除数
double numA = 0;
double numB = 0;
for (int i = 0; i < sl.Count; i++)
{
num += arrA[i] * arrB[i];
numA += Math.Pow(arrA[i], 2);
numB += Math.Pow(arrB[i], 2);
}
double cos = num / (Math.Sqrt(numA)* Math.Sqrt(numB));
return cos;
}
public static List<string> Segment(string str)
{
List<string> sl = new List<string>();
try
{
string s = string.Empty;
System.Net.CookieContainer cookieContainer = new System.Net.CookieContainer();
// 将提交的字符串数据转换成字节数组
byte[] postData = System.Text.Encoding.ASCII.GetBytes("data=" + System.Web.HttpUtility.UrlEncode(str) + "&respond=json&charset=utf8&ignore=yes&duality=no&traditional=no&multi=0"); // 设置提交的相关参数
System.Net.HttpWebRequest request = System.Net.WebRequest.Create("http://www.ftphp.com/scws/api.php") as System.Net.HttpWebRequest;
request.Method = "POST";
request.KeepAlive = false;
request.ContentType = "application/x-www-form-urlencoded";
request.CookieContainer = cookieContainer;
request.ContentLength = postData.Length; // 提交请求数据
System.IO.Stream outputStream = request.GetRequestStream();
outputStream.Write(postData, 0, postData.Length);
outputStream.Close(); // 接收返回的页面
System.Net.HttpWebResponse response = request.GetResponse() as System.Net.HttpWebResponse;
System.IO.Stream responseStream = response.GetResponseStream();
System.IO.StreamReader reader = new System.IO.StreamReader(responseStream, System.Text.Encoding.GetEncoding("utf-8"));
string val = reader.ReadToEnd(); Newtonsoft.Json.Linq.JObject results = Newtonsoft.Json.Linq.JObject.Parse(val);
foreach (var item in results["words"].Children())
{
Newtonsoft.Json.Linq.JObject word = Newtonsoft.Json.Linq.JObject.Parse(item.ToString());
var sss = word["word"].ToString();
//判断是否为标点符
bool offom = false;
foreach (char t in sss)
{
if (t >= 0x4e00 && t <= 0x9fbb)
{
offom = true;
}
else
{
offom = false;
}
}
if (offom)
{
sl.Add(sss);
}
}
}
catch
{
} return sl;
}
}

  以上 感觉很多地方都可以优化,以后想到更好的再重新来一遍

C# 比较两文本相似度的更多相关文章

  1. NLP点滴——文本相似度

    [TOC] 前言 在自然语言处理过程中,经常会涉及到如何度量两个文本之间的相似性,我们都知道文本是一种高维的语义空间,如何对其进行抽象分解,从而能够站在数学角度去量化其相似性.而有了文本之间相似性的度 ...

  2. TF-IDF 文本相似度分析

    前阵子做了一些IT opreation analysis的research,从产线上取了一些J2EE server运行状态的数据(CPU,Menory...),打算通过训练JVM的数据来建立分类模型, ...

  3. 文本相似度算法——空间向量模型的余弦算法和TF-IDF

    1.信息检索中的重要发明TF-IDF TF-IDF是一种统计方法,TF-IDF的主要思想是,如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分 ...

  4. 【机器学习】使用gensim 的 doc2vec 实现文本相似度检测

    环境 Python3, gensim,jieba,numpy ,pandas 原理:文章转成向量,然后在计算两个向量的余弦值. Gensim gensim是一个python的自然语言处理库,能够将文档 ...

  5. 文本离散表示(三):TF-IDF结合n-gram进行关键词提取和文本相似度分析

    这是文本离散表示的第二篇实战文章,要做的是运用TF-IDF算法结合n-gram,求几篇文档的TF-IDF矩阵,然后提取出各篇文档的关键词,并计算各篇文档之间的余弦距离,分析其相似度. TF-IDF与n ...

  6. 从0到1,了解NLP中的文本相似度

    本文由云+社区发表 作者:netkiddy 导语 AI在2018年应该是互联网界最火的名词,没有之一.时间来到了9102年,也是项目相关,涉及到了一些AI写作相关的功能,为客户生成一些素材文章.但是, ...

  7. NLP文本相似度

    NLP文本相似度 相似度 相似度度量:计算个体间相似程度 相似度值越小,距离越大,相似度值越大,距离越小 最常用--余弦相似度:​ 一个向量空间中两个向量夹角的余弦值作为衡量两个个体之间差异的大小 余 ...

  8. 【NLP】Python实例:基于文本相似度对申报项目进行查重设计

    Python实例:申报项目查重系统设计与实现 作者:白宁超 2017年5月18日17:51:37 摘要:关于查重系统很多人并不陌生,无论本科还是硕博毕业都不可避免涉及论文查重问题,这也对学术不正之风起 ...

  9. NLP文本相似度(TF-IDF)

    本篇博文是数据挖掘部分的首篇,思路主要是先聊聊相似度的理论部分,下一篇是代码实战.       我们在比较事物时,往往会用到“不同”,“一样”,“相似”等词语,这些词语背后都涉及到一个动作——双方的比 ...

随机推荐

  1. websocket --- 05 . http与websocket

    一.http协议 1.基于 TCP 协议 2.一次请求 一次响应 断开 3.客户端永远处于主动状态 4.服务器永远处于被动状态 5.Http无状态 - 在服务器不保存客户端的信息 6.服务器无法主动找 ...

  2. Qt对象树

    Qt提供了一种机制,能够自动.有效的组织和管理继承自QObject的Qt对象,这种机制就是对象树.子对象动态分配空间不需要释放.

  3. Use SourceLink enables a great source debugging experience

    posts Exploring .NET Core's SourceLink - Stepping into the Source Code of NuGet packages you don't o ...

  4. CSRF、XSS、clickjacking、SQL 的攻击与防御

    CSRF攻击 原理: 跨站请求伪造.是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法. 网站通过cookie来实现登录功能.而cookie只要存在浏览器中,那么浏览器在访问含有这 ...

  5. numpy计算结果的保存——ndarray格式数据保存

    1 Python保存numpy数据: numpy.savetxt("result.txt", numpy_data) 2 保存list数据: file = open('data.t ...

  6. lambda 委托 匿名方法

    委托: delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类.与其它的类不同,delegate类能够拥有一个签名(signature),并且它只能持有与它的签名相匹配的方法的 ...

  7. 有效的括号(Java实现)

    题目: 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. 注意空字符 ...

  8. 20190320xlVBA_考场座位设置

    花了一写时间做了一个Excel宏工作簿,可以根据考场人数.座位排列和考生名单 生成<考试座位表><考生去向表><考试通知单>,想要的前往了解哦: https://i ...

  9. flex属性介绍

  10. 瀑布流布局(等宽不等高jQuery)

    在百度上看见的好多都是引用Masonry插件   ,之后我自己尝试了一个没有使用插件的 <body> <div id="main"> <div cla ...