论坛
门户
内部优惠
喜欢
话题
VIP会员
搜索
新浪微博
登录
注册
100%
100%
首页
>
网络技术
>
网络技术
>
HanLP-朴素贝叶斯分类预测缺陷
回复
« 返回列表
hadoop小学生
精灵王
注册日期
2018-09-13
发帖数
160
QQ
3234520070
火币
360枚
粉丝
0
关注
0
加关注
写私信
打招呼
阅读:
7870
回复:
0
HanLP-朴素贝叶斯分类预测缺陷
楼主
#
更多
只看楼主
倒序阅读
发布于:2019-07-22 10:02
保存
100%
100%
[]
1
文章整理自
baiziyu
的知乎专栏,
感兴趣的朋友可以去关注下这位大神的专栏,很多关于
自然语言处理
的文章写的很不错。昨天看到他的分享的两篇关于
朴素贝叶斯分类
预测的文章,整理了一下分享给给
自然语言处理
1,文章已做部分修改!
朴素贝叶斯分类时,最好取对数变相乘为相加,防止预测结果溢出。可能出现的
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
之间的数值,这一看就是概率值。
喜欢
0
评分
0
最新喜欢:
DKHadoop用着还不错!
回复
100%
发帖
回复
« 返回列表
普通帖
您需要登录后才可以回帖,
登录
或者
注册
100%
返回顶部
关闭
最新喜欢