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