前言
前言仅代表个人观点
不会谈恋爱,是部分人都面临的问题,其实矛盾的诞生,源自于你读不懂对方当前的话语背后的情绪,其实标题也可以是你和上司(不要跑偏)。
其实这一篇,我本来不想写的,聊聊容器它不香吗,OK,我不全是为了流量,头发都薅掉不少。
回归正题,目前大模型、机器学习风头正盛,对于我们正常打工人来说,离得远,也不远。你可能早已听说,但如果让你来做,无从下手,什么?先买 1000 张 RTX 5000 显卡吗?
所以本篇,简单讲讲我是如何基于神经网络实现情绪分析的。
演示
大家可以一起训练模型,造福更多人
别划走,OK,先看效果,
- 比如你女友说 “你真讨厌”,请看结果
- 当你女友说 “那个女生比我好看是吧”,请看结果
- 再比如,她说 “渣男”
- 再来一个神仙回答 “随便”
正文
全流程
核心技术
Eclipse Deeplearning4j
- 是一套用于在 JVM 上运行深度学习的工具。它是唯一一个允许您从 java 训练模型,同时通过我们的 cpython 绑定、模型导入支持以及其他运行时
- (例如 tensorflow-java 和 onnxruntime)的互操作混合执行 python 与 python 生态系统进行互操作的框架。
hanNLP
- 中国人民大学自然语言处理与社会人文计算实验室开发和维护。它提供了一系列中文文本处理的功能,包括分词、词性标注、命名实体识别、依存句法分析等。
情感分析适用算法
- 朴素贝叶斯
- 支持向量机
- 决策树
- 随机森林
- 深度学习模型
(这些都太麻烦了,我这里采用 多层感知 (MLP)算法 实现)
训练数据
数据太少了,如果有 1000 万 ,就可以预测 八九不离十了
嗯,敷衍
没事,敷衍
嗯嗯,敷衍
还行吧,敷衍
没意思,敷衍
我要睡了,敷衍
早上好,正常
中午好,正常
晚上好,正常
我刚吃了午饭,正常
肚子饿了,正常
我在开会,正常
哈哈哈哈哈,开心
嘿嘿,开心
发工资啦,开心
吃好吃去,开心
吃火锅去,开心
我被踩了一脚,愤怒
明天要加班,愤怒
今天迟到了,愤怒
老板是傻子,愤怒
讨厌,开心
你真讨厌,开心
我讨厌你,愤怒
大坏蛋,开心
核心实现
汉语博大精深
- 数据清洗后,通过 hanLP 对语句进行分词
- (好处是:更高的准确性,以汉语词汇,词性,词频等信息)
public static List<String> segment(String sentence) {
List<Term> termList = HanLP.segment(sentence);
List<String> tokens = new ArrayList<>();
for (Term term : termList) {
tokens.add(term.word);
}
return tokens;
}
- 将语句作为样本塞入Nd4j,作为向量,为了更高的识别度,讲分词后的语句作为特征向量
- 这里偷懒,用 hashCode 处理
private static INDArray sentenceToFeatures(List<String> tokens, int uniqueTokensSize, int embeddingSize) {
INDArray features = Nd4j.create(1, uniqueTokensSize * embeddingSize);
for (String token : tokens) {
int index = hashFunction(token) % (uniqueTokensSize * embeddingSize);
features.putScalar(index, 1.0);
}
return features;
}
-
构建一个多层感知模型并定义神经网络层级
- 输入
.layer(new DenseLayer.Builder() .nIn(uniqueTokens.size() * embeddingSize) .nOut(128) .weightInit(WeightInit.XAVIER) .activation(Activation.RELU) .build())
- 输出
.layer(new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD) .nIn(128) .nOut(numClasses) .weightInit(WeightInit.XAVIER) .activation(Activation.SOFTMAX) .build())
-
从数据中提取到特征,并塞入模型进行训练,最后分析模型准确度,对算法或模型层级进行微调
========================Evaluation Metrics======================== # of classes: 5 Accuracy: 0.4400 Precision: 0.4929 (1 class excluded from average) Recall: 0.4244 (1 class excluded from average) F1 Score: 0.5079 (2 classes excluded from average) Precision, recall & F1: macro-averaged (equally weighted avg. of 5 classes) Warning: 1 class was never predicted by the model and was excluded from average precision Classes excluded from average precision: [1] Warning: 1 class was never predicted by the model and was excluded from average recall Classes excluded from average recall: [3] =========================Confusion Matrix========================= 0 1 2 3 4 ----------- 3 0 3 5 2 | 0 = 0 0 0 1 0 0 | 1 = 1 0 0 4 0 1 | 2 = 2 0 0 0 0 0 | 3 = 3 0 0 2 0 4 | 4 = 4 Confusion matrix format: Actual (rowClass) predicted as (columnClass) N times ==================================================================
大致意思就是,一共有 5 个指标,模型准确率只有 0.4 也就是 44 % (完全是样本不足)
期间需要关注混淆矩阵,可以告诉你每个类被预测到目标类的情况,然后结合实际情况进行调整
结语
这只是机器学习中深度学习内最基础的神经网络,你可以感受到它的魅力吗?
关注公众号并回复源码,即可获取到本程序源码。
祝你好运。