HanLP-朴素贝叶斯分类预测缺陷_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > HanLP-朴素贝叶斯分类预测缺陷

HanLP-朴素贝叶斯分类预测缺陷

 2019/7/22 13:10:05  adnb34g  程序员俱乐部  我要评论(0)
  • 摘要:文章整理自baiziyu的知乎专栏,感兴趣的朋友可以去关注下这位大神的专栏,很多关于自然语言处理的文章写的很不错。昨天看到他的分享的两篇关于朴素贝叶斯分类预测的文章,整理了一下分享给给大家,文章已做部分修改!朴素贝叶斯分类时,最好取对数变相乘为相加,防止预测结果溢出。可能出现的badcase就是明明训练语料X类目下没有词语t,而系统就将文本预测为X类目。解决方法就时改相乘为取对数相加。HanLP的朴素贝叶斯分类计算没有用对数相加的方法,而是直接用的概率相乘,很有可能溢出。对上述内容做一些更正
  • 标签:

class="MsoNormal">?

文章整理自?baiziyu?的知乎专栏,感兴趣的朋友可以去关注下这位大神的专栏,很多关于自然语言处理的文章写的很不错。昨天看到他的分享的两篇关于朴素贝叶斯分类预测的文章,整理了一下分享给给大家,文章已做部分修改!

?

朴素贝叶斯分类时,最好取对数变相乘为相加,防止预测结果溢出。可能出现的badcase就是明明训练语料X类目下没有词语t,而系统就将文本预测为X类目。解决方法就时改相乘为取对数相加。HanLP的朴素贝叶斯分类计算没有用对数相加的方法,而是直接用的概率相乘,很有可能溢出。

?

对上述内容做一些更正HanLP的朴素贝叶斯是按照概率取对数相加做的。

看一下下边的代码

?

?@Override

????public double[] categorize(Document document) throws IllegalArgumentException, IllegalStateException

????{

????????Integer category;

????????Integer feature;

????????Integer occurrences;

????????Double logprob;

?

????????double[] predictionScores = new double[model.catalog.length];

????????for (Map.Entry<Integer, Double> entry1 : model.logPriors.entrySet())

????????{

????????????category = entry1.getKey();

????????????logprob = entry1.getValue(); //用类目的对数似然初始化概率

?

????????????//对文档中的每个特征

????????????for (Map.Entry<Integer, int[]> entry2 : document.tfMap.entrySet())

????????????{

????????????????feature = entry2.getKey();

?

????????????????if (!model.logLikelihoods.containsKey(feature))

????????????????{

????????????????????continue; //如果在模型中找不到就跳过了

????????????????}

?

????????????????occurrences = entry2.getValue()[0]; //获取其在文档中的频次

?

????????????????logprob += occurrences * model.logLikelihoods.get(feature).get(category); //将对数似然乘上频次

????????????}

????????????predictionScores[category] = logprob;

????????}

?

????????if (configProbabilityEnabled) MathUtility.normalizeExp(predictionScores);

????????return predictionScores;

????}

?

这么看来,之前遇到的下边的这个badcase就还要再分析

[1] 化验指标一变化患者就六神无主,看医生怎么讲解

核心词:患者 看医生

这里“患者”和“看医生”两个词都没在“艺术”类训练语料中出现,但是预测概率最大的反倒是“艺术”。

由于用PyHanLP没法看到预测概率的计算过程,所以还是把Python的分类预测代码改为Java代码调式看一下。今天移植了预处理,资源加载,人工干预部分的代码,明天把剩余预测部分移植为Java再来看这个badcase。这就是朴素贝叶斯的优势,分析起来非常清晰容易。不过从PyHanLP的预测输出概率值来看,不太像是取了对数相加得到的,因为都是0-1之间的数值,这一看就是概率值。

?

上一篇: 置顶:关于本博客(尤其是文章版权) 下一篇: 没有下一篇了!
  • 相关文章
发表评论
用户名: 匿名