个人网站建设推广服务,wordpress安装百度站长资源平台,南宁seo 网站收录,可以做淘宝客的网站有哪些. # #x1f4d1;前言 本文主要是SpringBoot进行自然语言处理#xff0c;利用Hanlp进行文本情感分析#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ #x1f3ac;作者简介#xff1a;大家好#xff0c;我是青衿#x1f947; ☁️博客首页#xff1a;CSDN主页放风…. # 前言 本文主要是SpringBoot进行自然语言处理利用Hanlp进行文本情感分析如果有什么需要改进的地方还请大佬指出⛺️ 作者简介大家好我是青衿 ☁️博客首页CSDN主页放风讲故事 每日一句努力一点优秀一点 目录 文章目录 **目录**一、说明二、自然语言处理简介三、Hanlp文本分类与情感分析基本概念语料库用Map描述用文件夹描述数据集实现训练分词特征提取调参调参训练模型分类情感分析 四、具体流程特征提取训练测试结果 文章末尾 一、说明
自然语言处理已经进入大模型时代然而从业人员必须了解整个知识体系、发展过程、知识结构应用范围等一系列知识。本篇将报道此类概况。
二、自然语言处理简介
自然语言处理或简称NLP是处理和转换文本的计算机科学学科。它由几个任务组成这些任务从标记化开始将文本分成单独的意义单位应用句法和语义分析来生成抽象的知识表示然后再次将该表示转换为文本用于翻译、问答或对话等目的。
三、Hanlp文本分类与情感分析基本概念
语料库
本文语料库特指文本分类语料库对应IDataSet接口。而文本分类语料库包含两个概念文档和类目。一个文档只属于一个类目一个类目可能含有多个文档。
用Map描述
这种关系可以用Java的MapString, String[]来描述其key代表类目value代表该类目下的所有文档。用户可以利用自己的文本读取模块构造一个MapString, String[]形式的中间语料库然后利用IDataSet#add(java.util.Mapjava.lang.String,java.lang.String[])接口将其加入到训练语料库中。
用文件夹描述
这种树形结构也很适合用文件夹描述即
/*** 加载数据集** param folderPath 分类语料的根目录.目录必须满足如下结构:br* 根目录br* ├── 分类Abr* │ └── 1.txtbr* │ └── 2.txtbr* │ └── 3.txtbr* ├── 分类Bbr* │ └── 1.txtbr* │ └── ...br* └── ...br*每个分类里面都是一些文本文档。任何满足此格式的语料库都可以直接加载。
数据集实现
考虑到大规模训练的时候文本数量达到千万级无法全部加载到内存中所以本系统实现了基于文件系统的FileDataSet。同时在服务器资源许可的情况下可以使用基于内存的MemoryDataSet提高加载速度。两者的继承关系如下 训练
训练指的是利用给定训练集寻找一个能描述这种语言现象的模型的过程。开发者只需调用train接口即可但在实现中有许多细节。
分词
目前本系统中的分词器接口一共有两种实现
但文本分类是否一定需要分词答案是否定的。 我们可以顺序选取文中相邻的两个字作为一个“词”术语叫bigram。这两个字在数量很多的时候可以反映文章的主题参考清华大学2016年的一篇论文《Zhipeng Guo, Yu Zhao, Yabin Zheng, Xiance Si, Zhiyuan Liu, Maosong Sun. THUCTC: An Efficient Chinese Text Classifier. 2016》。这在代码中对应BigramTokenizer. 当然也可以采用传统的分词器如HanLPTokenizer。 另外用户也可以通过实现ITokenizer来实现自己的分词器并通过IDataSet#setTokenizer来使其生效。
特征提取
特征提取指的是从所有词中选取最有助于分类决策的词语。理想状态下所有词语都有助于分类决策但现实情况是如果将所有词语都纳入计算则训练速度将非常慢内存开销非常大且最终模型的体积非常大。 本系统采取的是卡方检测通过卡方检测去掉卡方值低于一个阈值的特征并且限定最终特征数不超过100万。
调参调参
对于贝叶斯模型没有超参数需要调节。
训练
本系统实现的训练算法是朴素贝叶斯法无需用户关心内部细节。另有一个子项目实现了支持向量机文本分类器可供参考。由于依赖了第三方库所以没有集成在本项目中。
模型
训练之后我们就得到了一个模型可以通过IClassifier#getModel获取到模型的引用。该接口返回一个AbstractModel对象该对象实现了Serializable接口可以序列化到任何地方以供部署。 反序列化后的模型可以通过如下方式加载并构造分类器
NaiveBayesModel model (NaiveBayesModel) IOUtil.readObjectFrom(MODEL_PATH);
NaiveBayesClassifier naiveBayesClassifier new NaiveBayesClassifier(model); 分类
通过加载模型我们可以得到一个分类器利用该分类器我们就可以进行文本分类了。
IClassifier classifier new NaiveBayesClassifier(model); 目前分类器接口中与文本分类有关的接口有如下三种
/*** 预测分类** param text 文本* return 所有分类对应的分值(或概率, 需要enableProbability)* throws IllegalArgumentException 参数错误* throws IllegalStateException 未训练模型*/
MapString, Double predict(String text) throws IllegalArgumentException, IllegalStateException;/*** 预测分类* param document* return*/
MapString, Double predict(Document document) throws IllegalArgumentException, IllegalStateException;/*** 预测分类* param document* return* throws IllegalArgumentException* throws IllegalStateException*/
double[] categorize(Document document) throws IllegalArgumentException, IllegalStateException;/*** 预测最可能的分类* param document* return* throws IllegalArgumentException* throws IllegalStateException*/
int label(Document document) throws IllegalArgumentException, IllegalStateException;/*** 预测最可能的分类* param text 文本* return 最可能的分类* throws IllegalArgumentException* throws IllegalStateException*/
String classify(String text) throws IllegalArgumentException, IllegalStateException;/*** 预测最可能的分类* param document 一个结构化的文档(注意!这是一个底层数据结构,请谨慎操作)* return 最可能的分类* throws IllegalArgumentException* throws IllegalStateException*/
String classify(Document document) throws IllegalArgumentException, IllegalStateException; classify方法直接返回最可能的类别的String形式而predict方法返回所有类别的得分是一个Map形式键是类目值是分数或概率categorize方法返回所有类目的得分是一个double数组分类得分按照分类名称的字典序排列label方法返回最可能类目的字典序。
情感分析
可以利用文本分类在情感极性语料上训练的模型做浅层情感分析。目前公开的情感分析语料库有中文情感挖掘语料-ChnSentiCorp语料发布者为谭松波。
接口与文本分类完全一致请参考com.hankcs.demo.DemoSentimentAnalysis。
四、具体流程
特征提取
本系统采取的是卡方检测通过卡方检测去掉卡方值低于一个阈值的特征并且限定最终特征数不超过100万。 训练 测试结果 HanLP Github地址https://github.com/hankcs/HanLP
HanLP文档地址https://hanlp.hankcs.com/docs/api/hanlp/pretrained/index.html
文章末尾