最新網(wǎng)站源碼營銷網(wǎng)站建設(shè)方案
. # 📑前言
本文主要是SpringBoot進行自然語言處理,利用Hanlp進行文本情感分析,如果有什么需要改進的地方還請大佬指出??
🎬作者簡介:大家好,我是青衿🥇
??博客首頁:CSDN主頁放風(fēng)講故事
🌄每日一句:努力一點,優(yōu)秀一點
目錄
文章目錄
- **目錄**
- 一、說明
- 二、自然語言處理簡介
- 三、Hanlp文本分類與情感分析基本概念
- 語料庫
- 用Map描述
- 用文件夾描述
- 數(shù)據(jù)集實現(xiàn)
- 訓(xùn)練
- 分詞
- 特征提取
- 調(diào)參調(diào)參
- 訓(xùn)練
- 模型
- 分類
- 情感分析
- 四、具體流程
- 特征提取
- 訓(xùn)練
- 測試結(jié)果
- 📑文章末尾
一、說明
自然語言處理已經(jīng)進入大模型時代,然而從業(yè)人員必須了解整個知識體系、發(fā)展過程、知識結(jié)構(gòu),應(yīng)用范圍等一系列知識。本篇將報道此類概況。
二、自然語言處理簡介
自然語言處理,或簡稱NLP,是處理和轉(zhuǎn)換文本的計算機科學(xué)學(xué)科。它由幾個任務(wù)組成,這些任務(wù)從標(biāo)記化開始,將文本分成單獨的意義單位,應(yīng)用句法和語義分析來生成抽象的知識表示,然后再次將該表示轉(zhuǎn)換為文本,用于翻譯、問答或?qū)υ挼饶康摹?br />
三、Hanlp文本分類與情感分析基本概念
語料庫
本文語料庫特指文本分類語料庫,對應(yīng)IDataSet
接口。而文本分類語料庫包含兩個概念:文檔和類目。一個文檔只屬于一個類目,一個類目可能含有多個文檔。
用Map描述
這種關(guān)系可以用Java的Map<String, String[]>
來描述,其key
代表類目,value
代表該類目下的所有文檔。用戶可以利用自己的文本讀取模塊構(gòu)造一個Map<String, String[]>
形式的中間語料庫,然后利用IDataSet#add(java.util.Map<java.lang.String,java.lang.String[]>)
接口將其加入到訓(xùn)練語料庫中。
用文件夾描述
這種樹形結(jié)構(gòu)也很適合用文件夾描述,即:
/*** 加載數(shù)據(jù)集** @param folderPath 分類語料的根目錄.目錄必須滿足如下結(jié)構(gòu):<br>* 根目錄<br>* ├── 分類A<br>* │ └── 1.txt<br>* │ └── 2.txt<br>* │ └── 3.txt<br>* ├── 分類B<br>* │ └── 1.txt<br>* │ └── ...<br>* └── ...<br>*
每個分類里面都是一些文本文檔。任何滿足此格式的語料庫都可以直接加載。
數(shù)據(jù)集實現(xiàn)
考慮到大規(guī)模訓(xùn)練的時候,文本數(shù)量達到千萬級,無法全部加載到內(nèi)存中,所以本系統(tǒng)實現(xiàn)了基于文件系統(tǒng)的FileDataSet
。同時,在服務(wù)器資源許可的情況下,可以使用基于內(nèi)存的MemoryDataSet
,提高加載速度。兩者的繼承關(guān)系如下:
訓(xùn)練
訓(xùn)練指的是,利用給定訓(xùn)練集尋找一個能描述這種語言現(xiàn)象的模型的過程。開發(fā)者只需調(diào)用train接口即可,但在實現(xiàn)中,有許多細節(jié)。
分詞
目前,本系統(tǒng)中的分詞器接口一共有兩種實現(xiàn):
但文本分類是否一定需要分詞?答案是否定的。 ? 我們可以順序選取文中相鄰的兩個字,作為一個“詞”(術(shù)語叫bigram)。這兩個字在數(shù)量很多的時候可以反映文章的主題(參考清華大學(xué)2016年的一篇論文《Zhipeng Guo, Yu Zhao, Yabin Zheng, Xiance Si, Zhiyuan Liu, Maosong Sun. THUCTC: An Efficient Chinese Text Classifier. 2016》)。這在代碼中對應(yīng)BigramTokenizer
. ? 當(dāng)然,也可以采用傳統(tǒng)的分詞器,如HanLPTokenizer
。 ? 另外,用戶也可以通過實現(xiàn)ITokenizer
來實現(xiàn)自己的分詞器,并通過IDataSet#setTokenizer
來使其生效。
特征提取
特征提取指的是從所有詞中,選取最有助于分類決策的詞語。理想狀態(tài)下所有詞語都有助于分類決策,但現(xiàn)實情況是,如果將所有詞語都納入計算,則訓(xùn)練速度將非常慢,內(nèi)存開銷非常大且最終模型的體積非常大。
本系統(tǒng)采取的是卡方檢測,通過卡方檢測去掉卡方值低于一個閾值的特征,并且限定最終特征數(shù)不超過100萬。
調(diào)參調(diào)參
對于貝葉斯模型,沒有超參數(shù)需要調(diào)節(jié)。
訓(xùn)練
本系統(tǒng)實現(xiàn)的訓(xùn)練算法是樸素貝葉斯法,無需用戶關(guān)心內(nèi)部細節(jié)。另有一個子項目實現(xiàn)了支持向量機文本分類器,可供參考。由于依賴了第三方庫,所以沒有集成在本項目中。
模型
訓(xùn)練之后,我們就得到了一個模型,可以通過IClassifier#getModel
獲取到模型的引用。該接口返回一個AbstractModel
對象,該對象實現(xiàn)了Serializable
接口,可以序列化到任何地方以供部署。 ? 反序列化后的模型可以通過如下方式加載并構(gòu)造分類器: ?
NaiveBayesModel model = (NaiveBayesModel) IOUtil.readObjectFrom(MODEL_PATH);
NaiveBayesClassifier naiveBayesClassifier = new NaiveBayesClassifier(model);
分類
通過加載模型,我們可以得到一個分類器,利用該分類器,我們就可以進行文本分類了。
IClassifier classifier = new NaiveBayesClassifier(model);
目前分類器接口中與文本分類有關(guān)的接口有如下三種: ?
/*** 預(yù)測分類** @param text 文本* @return 所有分類對應(yīng)的分值(或概率, 需要enableProbability)* @throws IllegalArgumentException 參數(shù)錯誤* @throws IllegalStateException 未訓(xùn)練模型*/
Map<String, Double> predict(String text) throws IllegalArgumentException, IllegalStateException;/*** 預(yù)測分類* @param document* @return*/
Map<String, Double> predict(Document document) throws IllegalArgumentException, IllegalStateException;/*** 預(yù)測分類* @param document* @return* @throws IllegalArgumentException* @throws IllegalStateException*/
double[] categorize(Document document) throws IllegalArgumentException, IllegalStateException;/*** 預(yù)測最可能的分類* @param document* @return* @throws IllegalArgumentException* @throws IllegalStateException*/
int label(Document document) throws IllegalArgumentException, IllegalStateException;/*** 預(yù)測最可能的分類* @param text 文本* @return 最可能的分類* @throws IllegalArgumentException* @throws IllegalStateException*/
String classify(String text) throws IllegalArgumentException, IllegalStateException;/*** 預(yù)測最可能的分類* @param document 一個結(jié)構(gòu)化的文檔(注意!這是一個底層數(shù)據(jù)結(jié)構(gòu),請謹慎操作)* @return 最可能的分類* @throws IllegalArgumentException* @throws IllegalStateException*/
String classify(Document document) throws IllegalArgumentException, IllegalStateException;
classify
方法直接返回最可能的類別的String
形式,而predict
方法返回所有類別的得分(是一個Map
形式,鍵是類目,值是分數(shù)或概率),categorize
方法返回所有類目的得分(是一個double
數(shù)組,分類得分按照分類名稱的字典序排列),label
方法返回最可能類目的字典序。
情感分析
可以利用文本分類在情感極性語料上訓(xùn)練的模型做淺層情感分析。目前公開的情感分析語料庫有:中文情感挖掘語料-ChnSentiCorp,語料發(fā)布者為譚松波。
接口與文本分類完全一致,請參考com.hankcs.demo.DemoSentimentAnalysis
。
四、具體流程
特征提取
本系統(tǒng)采取的是卡方檢測,通過卡方檢測去掉卡方值低于一個閾值的特征,并且限定最終特征數(shù)不超過100萬。
訓(xùn)練
測試結(jié)果
HanLP Github地址:https://github.com/hankcs/HanLP
HanLP文檔地址:https://hanlp.hankcs.com/docs/api/hanlp/pretrained/index.html