为了更了解女友的情绪,我居然...

前言

前言仅代表个人观点

不会谈恋爱,是部分人都面临的问题,其实矛盾的诞生,源自于你读不懂对方当前的话语背后的情绪,其实标题也可以是你和上司(不要跑偏)。

其实这一篇,我本来不想写的,聊聊容器它不香吗,OK,我不全是为了流量,头发都薅掉不少。

回归正题,目前大模型、机器学习风头正盛,对于我们正常打工人来说,离得远,也不远。你可能早已听说,但如果让你来做,无从下手,什么?先买 1000 张 RTX 5000 显卡吗?

所以本篇,简单讲讲我是如何基于神经网络实现情绪分析的。

演示

大家可以一起训练模型,造福更多人

别划走,OK,先看效果,

  • 比如你女友说 “你真讨厌”,请看结果

为了更了解女友的情绪,我居然..._第1张图片

  • 当你女友说 “那个女生比我好看是吧”,请看结果

为了更了解女友的情绪,我居然..._第2张图片

  • 再比如,她说 “渣男”

为了更了解女友的情绪,我居然..._第3张图片

  • 再来一个神仙回答 “随便”

为了更了解女友的情绪,我居然..._第4张图片

正文

全流程

为了更了解女友的情绪,我居然..._第5张图片

核心技术

  • 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 % (完全是样本不足)

    期间需要关注混淆矩阵,可以告诉你每个类被预测到目标类的情况,然后结合实际情况进行调整

结语

这只是机器学习中深度学习内最基础的神经网络,你可以感受到它的魅力吗?

关注公众号并回复源码,即可获取到本程序源码。

祝你好运。

你可能感兴趣的:(人工智能,神经网络,nlp)