一、什麼是分詞器? 分詞器,是將用戶輸入的一段文本,分析成符合邏輯的一種工具。到目前為止呢,分詞器沒有辦法做到完全的符合人們的要求。和我們有關的分詞器有英文的和中文的分詞器:輸入文本-關鍵詞切分-去停用詞-形態還原-轉為小寫中文的分詞器分為: 單子分詞 例:中國人 分成中,國,人 二分法人詞 例:中 ...
一、什麼是分詞器?
分詞器,是將用戶輸入的一段文本,分析成符合邏輯的一種工具。到目前為止呢,分詞器沒有辦法做到完全的符合人們的要求。和我們有關的分詞器有英文的和中文的分詞器:輸入文本-關鍵詞切分-去停用詞-形態還原-轉為小寫中文的分詞器分為:
單子分詞 例:中國人 分成中,國,人
二分法人詞 例:中國人 分成中國,國人
詞典分詞 例:中國人 分成中國,國人,中國人
現在用的是極易分詞和庖丁分詞
停用詞:不影響語意的詞
分詞器有很多,比如中文分詞器 IK Analyzer,有興趣的可以看我的另一篇博文,其中有介紹它和Solr的結合使用
地址:Solr 7.2.1 配置中文分詞器 IK Analyzer
歡迎你加入 邀請碼 靈狐
二、什麼是HanLP分詞器?
首先:分詞器≠自然語言處理!
其次:HanLP也是一種分詞器
最後:HanLP不僅能夠分詞,而且還可以標註單詞的詞性(這個很關鍵的,後面章節會再次講到這個特性)
比如,在Java中隨便來個句子使用HanLP進行分詞如下:
這裡我們還額外添加了自己的分詞,比如好熱啊中的“好熱”,我們添加後並標註其詞性為ng,當然ng是我們隨便起的
執行這段代碼,分詞效果如下
這種詞性標註有什麼好處呢? == 比如,所有人名均可以用nr這個標簽來替代,思考下如下3個問題
1、張學友的生日是什麼時候
2、鞏俐的生日是什麼時候
3、成龍的生日是什麼時候
如果用HanLP分詞後,相信 張學友 、鞏俐、成龍的詞性均是nr,不信的話,請看下麵的截圖
為什麼HanLP會有這種能力呢? (博文下麵會講到如何在Spring-Boot項目中集成HanLP)
因為其有一堆的字/詞典數據集,其中就包括了人名這個dict,如下
因此,針對1、2、3的問題,我們可以將其做成一個問題模板,如下
nr的生日是什麼時候
於是乎,不管你問上述三個哪一個問題,我得到最終答案的步驟如下:
1、拿到原始句子(問題)
2、對原句子進行抽象,將人名用nr替換並抽象句子,比如張學友的生日是多少替換成nr的生日是多少
3、抽象句子匹配問題模板(一堆問題數據集合由Spark進行訓練並計算),比如 nr 生日
4、問題模板還原成最終的問題,比如 nr 生日,替換其中的nr=張學友,最後效果就是 張學友 生日
5、拿到問題後,去圖形資料庫neo4j中查找問題的答案,比如
項目中使用HanLP+Spark的效果如下
前端展示如下
三、HanLP下載安裝
官網下載地址:HanLP-漢語言處理包
這裡我們採用第二種方式下載
(1)由於我們要集成到Spring-Boot中,因此,我們不需要下載jar包,而是通過pom依賴進行jar添加,而這裡,我們需要下載hanlp的配置文件
(2)下載完配置文件後,我們需要下載HanLP的字典數據集
github下載地址:https://github.com/hankcs/HanLP/releases
打開地址,我們找到數據包的下載鏈接:
這個數據集有點大,下載會慢一點,請耐心等待下載完成
(3)上述兩步完成後,接下來就是集成到我們的項目中使用了
四、Spring-Boot集成HanLP
(1)pom依賴
[html] view plain copy
- <!-- JUnit單元測試 -->
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- </dependency>
- <!-- HanLP漢語言處理包 -->
- <dependency>
- <groupId>com.hankcs</groupId>
- <artifactId>hanlp</artifactId>
- <version>portable-1.6.3</version>
- </dependency>
(2)添加HanLP屬性配置文件【基於上述下載下來的】
(3)hanlp.properties屬性文件說明
其實也沒有上面好說明的,文件裡面的註釋已經很詳細了,唯一註意一點的是這個地方:
!每次更新自定義的新詞典xxx.txt的內容時,要刪除同目錄下的詞典緩存文件CustomDictionary.txt.bin!
刪除後,重啟項目會報一個警告的錯誤,我們不用理會,由於HanLP會載入數據集到記憶體中,因此啟動的過程會有點慢,等待HanLP載入完數據後,我們就可以使用它了
五、HanLP單元測試
HanLPTest.java
[java] view plain copy
- import com.hankcs.hanlp.HanLP;
- import com.hankcs.hanlp.dictionary.CustomDictionary;
- import com.hankcs.hanlp.seg.Segment;
- import com.hankcs.hanlp.seg.common.Term;
- public class HanLPTest {
- @Test
- public void TestA(){
- String lineStr = "明天雖然會下雨,但是我還是會看周傑倫的演唱會。";
- try{
- Segment segment = HanLP.newSegment();
- segment.enableCustomDictionary(true);
- /**
- * 自定義分詞+詞性
- */
- CustomDictionary.add("好熱","ng 0");
- List<Term> seg = segment.seg(lineStr);
- for (Term term : seg) {
- System.out.println(term.toString());
- }
- }catch(Exception ex){
- System.out.println(ex.getClass()+","+ex.getMessage());
- }
- }
- }
執行結果如下:
[plain] view plain copy
- 明天/t
- 雖然/c
- 會/v
- 下雨/vi
- ,/w
- 但是/c
- 我/rr
- 還是/c
- 會/v
- 看/v
- 周傑倫/nr
- 的/ude1
- 演唱會/n
- 。/w