. # 📑前言
本文主要是SpringBoot进行自然语言处理,利用Hanlp进行文本情感分析,如果有什么需要改进的地方还请大佬指出⛺️
🎬作者简介:大家好,我是青衿🥇
☁️博客首页:CSDN主页放风讲故事
🌄每日一句:努力一点,优秀一点
目录
文章目录
一、说明
自然语言处理已经进入大模型时代,然而从业人员必须了解整个知识体系、发展过程、知识结构,应用范围等一系列知识。本篇将报道此类概况。
二、自然语言处理简介
自然语言处理,或简称NLP,是处理和转换文本的计算机科学学科。它由几个任务组成,这些任务从标记化开始,将文本分成单独的意义单位,应用句法和语义分析来生成抽象的知识表示,然后再次将该表示转换为文本,用于翻译、问答或对话等目的。
三、Hanlp文本分类与情感分析基本概念
语料库
本文语料库特指文本分类语料库,对应IDataSet
接口。而文本分类语料库包含两个概念:文档和类目。一个文档只属于一个类目,一个类目可能含有多个文档。
用Map描述
这种关系可以用Java的Map<String, String[]>
来描述,其key
代表类目,value
代表该类目下的所有文档。用户可以利用自己的文本读取模块构造一个Map<String, String[]>
形式的中间语料库,然后利用IDataSet#add(java.util.Map<java.lang.String,java.lang.String[]>)
接口将其加入到训练语料库中。
用文件夹描述
这种树形结构也很适合用文件夹描述,即:
/ * 加载数据集 * * @param folderPath 分类语料的根目录.目录必须满足如下结构:<br> * 根目录<br> * ├── 分类A<br> * │ └── 1.txt<br> * │ └── 2.txt<br> * │ └── 3.txt<br> * ├── 分类B<br> * │ └── 1.txt<br> * │ └── ...<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
来使其生效。
特征提取
调参调参
对于贝叶斯模型,没有超参数需要调节。
训练
本系统实现的训练算法是朴素贝叶斯法,无需用户关心内部细节。另有一个子项目实现了支持向量机文本分类器,可供参考。由于依赖了第三方库,所以没有集成在本项目中。
模型
训练之后,我们就得到了一个模型,可以通过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 未训练模型 */ Map<String, Double> predict(String text) throws IllegalArgumentException, IllegalStateException; / * 预测分类 * @param document * @return */ Map<String, 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
📑文章末尾
到此这篇SpringBoot进行自然语言处理,利用Hanlp进行文本情感分析的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/rgzn-zryycl/4720.html