首页 > 编程语言 >.net 自动分类算法【原创】

.net 自动分类算法【原创】

时间:2022-11-11 14:31:08浏览次数:40  
标签:Dictionary 分类 dic 算法 var new net

自行根据网上论文研发的自动分类算法,欢迎交流,实践和完善。

目前自动分类算法是参考网上的思路和想法个人自主研发的。

当然互联网上有很多人采用不同的方式去解决自动分类问题,也有不同的算法和论文支持去做,但纵观自动分类这块工作是属于机器学习这块工作内容,总结出来比较简单的实现方式就是本文档采用的方式(如果有其他方式,欢迎交流)。

自动分类算法主要分为样本训练和余弦算法判别两块内容。

1) 采用已经做好归类的高质量的文档(理论上文档要越多,分类的精准度更会更加趋向精准),使用自动分类算法进行训练归类的学习, 产生分类数据模型。

2)输入一篇文章,使用余弦算法,采用分类数据模型进行自动判别。

样本训练

1)采用中文分词(或者其他分词方式,IK,庖丁,盘古等都可以)对文档进行分词处理,产生分词数据字典。(词典频率统计)

所产生的数据字典,即为分类数据模型。(不断保存分类数据模型)

余弦算法

1)新的一篇文章采用相同的分词方式,进行分词数据字典生成。根据该数据字典和分类的数据字典进行相似度判别(余弦算法),从而自动判定文章的归类。

自动分类算法的效果

个人认为效果取决于:分词的效果 ,训练文本的质量,算法本身的效果;未充分验证!!!

分词的效果:如果采用特定行业的词和一些行业相关的词,可能会对自动分类的效果产生影响。

训练文本:如果训练的文本的质量足够高,文本数量足够多,应该会对自动分类的效果产生影响。

算法效果:目前采用余弦进行相似度判别,从而自动区别分类。如果有更好的算法,效果会更加。

影响优先级:算法>训练文本>分词效果

【限定字典:是指行业特定的字典;在分词的结果基础上对行业特定字典进行过滤。】

限于目前的时间这块,没有深入研究和验证,以及优化算法和一些其他的改进。仅仅根据理论,用C#进行编写。

/// <summary>
/// 自动分类算法 欢迎交流 by 车江毅 开源QQ群: .net 开源基础服务 238543768
/// </summary>
public class AutoCategoryAlgorithm
{
/// <summary>
/// 限定字典
/// </summary>
public List<string> Words = new List<string>();
/// <summary>
/// 获取样本训练结果
/// </summary>
public Dictionary<string, Dictionary<string, int>> CategorySampleDic { get { return categorySampleDic; } }

/// <summary>
/// 样本分类训练集
/// </summary>
private Dictionary<string, Dictionary<string, int>> categorySampleDic = new Dictionary<string, Dictionary<string, int>>();
public AutoCategoryAlgorithm(Dictionary<string, Dictionary<string, int>> categorysampledic)
{
categorySampleDic = categorysampledic;
}
public AutoCategoryAlgorithm()
{ }
/// <summary>
/// 自动分类
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
public string AutoCategory(string text)
{
var dic = Token(text);
Dictionary<string, double> scores = new Dictionary<string, double>();

foreach (var c in categorySampleDic)
{
var s= CosineSimilar(dic,c.Value);
scores.Add(c.Key, s);
}
var max = scores.OrderByDescending(c => c.Value).FirstOrDefault();
return max.Key;
}
/// <summary>
/// 自动分类
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
public Dictionary<string, double> AutoCategoryScores(string text)
{
var dic = Token(text);
Dictionary<string, double> scores = new Dictionary<string, double>();

foreach (var c in categorySampleDic)
{
var s = CosineSimilar(dic, c.Value);
scores.Add(c.Key, s);
}
return scores;
}
/// <summary>
/// 样本训练
/// </summary>
public void Train(string category,List<string> samples)
{
if (categorySampleDic.ContainsKey(category))
{
if (categorySampleDic[category] == null)
categorySampleDic[category] = new Dictionary<string, int>();
}
else
categorySampleDic.Add(category,new Dictionary<string, int>());
var cdic = categorySampleDic[category];//上次样本训练集
foreach (var s in samples)
{
var dic= Token(s);
foreach (var kv in dic)
{
if (cdic.ContainsKey(kv.Key))
cdic[kv.Key] += kv.Value;
else
cdic.Add(kv.Key, kv.Value);
}
}
}

private Dictionary<string, int> Token(string text)
{
ChineseAnalyer ca = new ChineseAnalyer();
var dic = ca.Token(text);
if (Words.Count > 0)
{
var r = new Dictionary<string, int>();
foreach (var w in Words)
{
if (dic.ContainsKey(w))
{
r.Add(w,dic[w]);
}
}
return r;
}
return dic;
}
/// <summary>
/// 余弦算法
/// </summary>
/// <param name="map1"></param>
/// <param name="map2"></param>
/// <returns></returns>
private double CosineSimilar(Dictionary<string, int> map1, Dictionary<string, int> map2)
{
var AlgorithmMap = new Dictionary<int, int[]>();
foreach (var m in map1)
{
int key = m.Key.GetHashCode();
AlgorithmMap.Add(key,new int[] { m.Value,0});
}
foreach (var m in map2)
{
int key = m.Key.GetHashCode();
if (AlgorithmMap.ContainsKey(key))
AlgorithmMap[key][1] = m.Value;
else
AlgorithmMap.Add(key, new int[] { 0,m.Value });
}

double sqdoc1 = 0;
double sqdoc2 = 0;
double denominator = 0;
foreach (var kv in AlgorithmMap)
{
int[] c = kv.Value;
denominator += c[0] * c[1];
sqdoc1 += c[0] * c[0];
sqdoc2 += c[1] * c[1];
}

return denominator / Math.Sqrt(sqdoc1 * sqdoc2);
}
}

 by 车江毅

开源是一种态度,分享是一种精神,学习仍需坚持,进步仍需努力,.net生态圈因你我更加美好。



标签:Dictionary,分类,dic,算法,var,new,net
From: https://blog.51cto.com/chejiangyi/5844866

相关文章

  • 【开源】.Net Aop(静态织入)框架 BSF.Aop
    【开源】.Net免费开源,静态Aop织入(直接修改IL中间语言)框架,类似PostSharp(收费);实现前后Aop切面和INotifyPropertyChanged注入方式,性能接近原生编码方式......
  • 【开源】.net 分布式架构之监控平台
    .net分布式集群监控平台,用于集群的性能监控,应用耗时监控管理,统一日志管理等多维度的性能监控分析。.net简单监控平台,用于集群的性能监控,应用......
  • 【开源】.Net Api开放接口文档网站
    ApiView是.netapi的接口文档查看网站,用于解决分布式开发过程中的Api接口管理和沟通问题。自动生成api文档;方便调试及第三方开发人员对接,可以应用在as......
  • .net erp(办公oa)开发平台架构概要说明之表单设计器
    .neterp(办公oa)开发平台架构概要说明之表单设计器介绍背景:搭建一个适合公司erp业务的开发平台。架构概要图: 表单设计开发部署示例图 表单设计开发......
  • .net erp(办公oa)开发平台架构之流程服务概要介绍
    .neterp(办公oa)开发平台架构之流程服务(流程引擎)概要介绍背景搭建一个适合公司erp业务的开发平台。架构概要图: 流程引擎开发平台: 包含流程引擎......
  • .net 分布式架构之分布式缓存中间件
    便实现缓存的分布式,集群,负载均衡,故障自动转移,并兼容多种缓存存储的.net分布式缓存中间件。分布式缓存中间件 方便实现缓存的分布式,集群,负载均衡,故......
  • .net 分布式架构之配置中心
    .net统一配置中心,用于所有项目统一的配置集中管理,简化运维和项目部署,具备高灵活性,高性能,高稳定性,高及时性。同时具备配置项的负载均衡和故障转移,从......
  • .net 分布式架构之分布式锁实现
    .net分布式锁,包括redis分布式锁和zookeeper分布式锁的.net实现。分布式锁在解决分布式环境下的业务一致性是非常有用的。分布式锁经常用于在解决......
  • .net 分布式架构之任务调度平台
    .net简单任务调度平台,用于.netdll,exe的任务的挂载,任务的隔离,调度执行,访问权限控制,监控,管理,日志,错误预警,性能分析等。.net任务调度平台用于.net......
  • .net 分布式架构之业务消息队列
    .net业务消息队列是应用于业务的解耦和分离,应具备分布式,高可靠性,高性能,高实时性,高稳定性,高扩展性等特性。大量的业务消息堆积能力;无单点故障及故障监控......