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

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

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

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 > )
{
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,});
}
foreach (var m in map2)
{
int key = m.Key.GetHashCode();
if (AlgorithmMap.ContainsKey(key))
AlgorithmMap[key][] = m.Value;
else
AlgorithmMap.Add(key, new int[] { ,m.Value });
} double sqdoc1 = ;
double sqdoc2 = ;
double denominator = ;
foreach (var kv in AlgorithmMap)
{
int[] c = kv.Value;
denominator += c[] * c[];
sqdoc1 += c[] * c[];
sqdoc2 += c[] * c[];
} return denominator / Math.Sqrt(sqdoc1 * sqdoc2);
}
}

by 车江毅

.net 自动分类算法【原创】的更多相关文章

  1. 信息安全-2:python之hill密码算法[原创]

    转发注明出处:http://www.cnblogs.com/0zcl/p/6106513.html 前言: hill密码算法我打算简要介绍就好,加密矩阵我用教材上的3*3矩阵,只做了加密,解密没有做, ...

  2. Twitter面试题蓄水池蓄水量算法(原创 JS版,以后可能会补上C#的)

    之前在群里有人讨论Twitter的面试题,蓄水池蓄水量计算,于是自己写了个JS版的(PS:主要后台代码还要编译,想想还是JS快,于是就使用了JS了.不过算法主要还是思路嘛,而且JS应该都没问题吧^_^ ...

  3. Sunday算法[原创]

    一.应用: 同样的,sunday算法也是在一个字符串中查找另一个字符串出现的首地址,是Daniel M.Sunday于1990年提出的,从销量上讲,Sunday>BM>KMP,是这类问题的 ...

  4. 《zw版·Halcon-delphi系列原创教程》 水果自动分类脚本(机器学习、人工智能)

    <zw版·Halcon-delphi系列原创教程> 水果自动分类脚本(机器学习.人工智能) 前面介绍了超市,流水线,酸奶的自动分类算法,下面再介绍一个水果的自动分类算法. Halcon强大 ...

  5. 信息安全-5:RSA算法详解(已编程实现)[原创]

    转发注明出处:http://www.cnblogs.com/0zcl/p/6120389.html 背景介绍 1976年以前,所有的加密方法都是同一种模式: (1)甲方选择某一种加密规则,对信息进行加 ...

  6. 【特征检测】BRISK特征提取算法

    [特征检测]BRISK特征提取算法原创hujingshuang 发布于2015-07-24 22:59:21 阅读数 17840 收藏展开简介        BRISK算法是2011年ICCV上< ...

  7. 人工智能头条(公开课笔记)+AI科技大本营——一拨微信公众号文章

    不错的 Tutorial: 从零到一学习计算机视觉:朋友圈爆款背后的计算机视觉技术与应用 | 公开课笔记 分享人 | 叶聪(腾讯云 AI 和大数据中心高级研发工程师) 整    理 | Leo 出   ...

  8. 【洛谷P1318积水面积】最小生成树

    我写一篇绝对原创的题解,算法原创,求洛谷通过!!!(让更多人看到这篇题解) 绝大多数人肯定认为这道题是一道模拟题 以下为正解 我们来看一下这一道题,其实就是找到左右高点,在模拟. 但是这个是正常人的想 ...

  9. 《zw版·Halcon-delphi系列原创教程》 酸奶自动分类脚本(机器学习、人工智能)

    <zw版·Halcon-delphi系列原创教程>酸奶自动分类脚本(机器学习.人工智能) Halcon强大的图像处理能力,令人往往会忽视其内核,是更加彪悍的机器学习.人工智能.       ...

随机推荐

  1. HTML/XML/XPATH基础

    Html超文本标记语言 网页上单击右键→查看源文件/查看源代码 Html基本结构 <html>               为文档根元素,所有元素都在内部进行 <head>   ...

  2. 【Selenium】Selenium1

    一.Selenium1组件 (1)Selenium服务器,负责启动关闭浏览器:解释和运行从测试程序中传来的Selenium命令:HTTP代理:获取和验证在浏览器和被测试的应用程序之间的传递的HTTP消 ...

  3. 【原创】Ajax的用法总结

    一.什么是Ajax Ajax英文全称为“ Asynchr JavsScript and XML”(异步的JavaScript和XML),是一种创建 交互式网页的开发技术. 二.Ajax技术的核心 Aj ...

  4. vue-router路由参数刷新消失的问题

    场景:vue-router实现的单页应用,登录页调用登录接口后,服务器返回用户信息,然后通过router.push({name: 'index', params: res.data})传给主页组件,并 ...

  5. CSS3学习系列之选择器(四)

    使用选择器来插入文字 css2中,使用before选择器在元素前面插入内容,使用after选择器在元素后面插入内容,在选择器的content属性中定义要插入的内容.将content属性值设定为none ...

  6. Jquery页面滚动动态加载数据,页面下拉自动加载内容

    <!DOCTYPE=html> <html> <head> <script src="js/jquery.js" type="t ...

  7. 如何自定义容器网络?- 每天5分钟玩转 Docker 容器技术(33)

    除了 none, host, bridge 这三个自动创建的网络,用户也可以根据业务需要创建 user-defined 网络. Docker 提供三种 user-defined 网络驱动:bridge ...

  8. SyntaxError: Unexpected token < in JSON at position 0 错误

    当你使用AJAX时有设定dataType : 'json' 所以在接回传值的时候会以json格式来解析但回传的资料非json格式就会出现这个错误讯息

  9. 马踏棋盘算法递归+回溯法实现 C语言

    r为矩阵的行,c为矩阵的列 将结果输出到当前目录下的results.txt. 结果将给出:1.是否存在路径使马可以按要求走遍所有的方格: 2.解的总数: 3.程序执行的时间: #include< ...

  10. [leetcode-494-Target Sum]

    You are given a list of non-negative integers, a1, a2, ..., an, and a target, S. Now you have 2 symb ...