Hive基於UDF進行文字分詞
阿新 • • 發佈:2020-12-31
## 本文大綱
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c0170e79f2864df995bc953487c902aa~tplv-k3u1fbpfcp-zoom-1.image)
## UDF 簡介
`Hive`作為一個`sql`查詢引擎,自帶了一些基本的函式,比如`count(計數)`,`sum(求和)`,有時候這些基本函式滿足不了我們的需求,這時候就要寫`hive hdf(user defined funation)`,又叫使用者自定義函式。編寫`Hive UDF`的步驟:
- 新增相關依賴,建立專案,這裡我用的管理工具是maven,所以我建立的也是一個maven 專案(這個時候你需要選擇合適的依賴版本,主要是Hadoop 和 Hive,可以使用`hadoop version`和`hive --version` 來分別檢視版本)
- 繼承`org.apache.hadoop.hive.ql.exec.UDF`類,實現evaluate方法,然後打包;
- 使用 `add`方法新增jar 包到分散式快取,**如果jar包是上傳到$HIVE_HOME/lib/目錄以下,就不需要執行add命令了**;
- 通過`create temporary function`建立臨時函式,不加`temporary`就建立了一個永久函式;
- 在SQL 中使用你建立的UDF;
## UDF分詞
這個是一個比較常見的場景,例如公司的產品有每天都會產生大量的彈幕或者評論,這個時候我們可能會想去分析一下大家最關心的熱點話題是什麼,或者是我們會分析最近一段時間的網路趨勢是什麼,但是這裡有一個問題就是你的詞庫建設的問題,因為你使用通用的詞庫可能不能達到很好的分詞效果,尤其有很多網路流行用語它是不在詞庫裡的,還有一個就是停用詞的問題了,因為很多時候停用詞是沒有意義的,所以這裡我們需要將其過濾,而過濾的方式就是通過停用詞詞表進行過濾。
這個時候我們的解決方案主要有兩種,一種是使用第三方提供的一些詞庫,還有一種是自建詞庫,然後有專人去維護,這個也是比較常見的一種情況。
最後一個就是我們使用的分詞工具,因為目前主流的分詞器很多,選擇不同的分詞工具可能對我們的分詞結果有很多影響。
## 分詞工具
**1:[Elasticsearch的開源中文分詞器 IK Analysis](http://www.17ky.net/soft/152.html)**(Star:2471)
IK中文分詞器在Elasticsearch上的使用。原生IK中文分詞是從檔案系統中讀取詞典,es-ik本身可擴充套件成從不同的源讀取詞典。目前提供從sqlite3資料庫中讀取。es-ik-plugin-sqlite3使用方法: 1. 在elasticsearch.yml中設定你的sqlite3詞典的位置: ik_analysis_db_path: /opt/ik/dictionary.db
**2:[開源的java中文分詞庫 IKAnalyzer](http://www.17ky.net/soft/153.html)**(Star:343)
IK Analyzer 是一個開源的,基於java語言開發的輕量級的中文分詞工具包。從2006年12月推出1.0版開始, IKAnalyzer已經推出了4個大版本。最初,它是以開源專案Luence為應用主體的,結合詞典分詞和文法分析演算法的中文分片語件。從3.0版本開始,IK發展為面向Java的公用分片語件,獨立於Lucene專案
**3:[java開源中文分詞 Ansj](http://www.17ky.net/soft/261.html)**(Star:3019)
Ansj中文分詞 這是一個ictclas的java實現.基本上重寫了所有的資料結構和演算法.詞典是用的開源版的ictclas所提供的.並且進行了部分的人工優化 分詞速度達到每秒鐘大約200萬字左右,準確率能達到96%以上。
目前實現了.中文分詞. 中文姓名識別 . 詞性標註、使用者自定義詞典,**關鍵字提取**,自動摘要,關鍵字標記等功能。
可以應用到自然語言處理等方面,適用於對分詞效果要求高的各種專案.
**4:[結巴分詞 ElasticSearch 外掛](http://www.17ky.net/soft/720.html)**(Star:188)
elasticsearch官方只提供smartcn這個中文分詞外掛,效果不是很好,好在國內有medcl大神(國內最早研究es的人之一)寫的兩個中文分詞外掛,一個是ik的,一個是mmseg的
**5:[Java分散式中文分片語件 - word分詞](http://www.17ky.net/soft/752.html)**(Star:672)
word分詞是一個Java實現的分散式的中文分片語件,提供了多種基於詞典的分詞演算法,並利用ngram模型來消除歧義。能準確識別英文、數字,以及日期、時間等數量詞,能識別人名、地名、組織機構名等未登入詞
**6:[Java開源中文分詞器jcseg](http://www.17ky.net/soft/6024.html)**(Star:400)
Jcseg是什麼? Jcseg是基於mmseg演算法的一個輕量級開源中文分詞器,同時集成了關鍵字提取,關鍵短語提取,關鍵句子提取和文章自動摘要等功能,並且提供了最新版本的lucene, solr, elasticsearch的分詞介面, Jcseg自帶了一個 jcseg.properties檔案...
**7:[中文分詞庫Paoding](http://www.17ky.net/soft/6030.html)**
庖丁中文分詞庫是一個使用Java開發的,可結合到Lucene應用中的,為網際網路、企業內部網使用的中文搜尋引擎分片語件。Paoding填補了國內中文分詞方面開源元件的空白,致力於此並希翼成為網際網路網站首選的中文分詞開源元件。 Paoding中文分詞追求分詞的高效率和使用者良好體驗。
**8:[中文分詞器mmseg4j](http://www.17ky.net/soft/6031.html)**
mmseg4j 用 Chih-Hao Tsai 的 MMSeg 演算法(http://technology.chtsai.org/mmseg/ )實現的中文分詞器,並實現 lucene 的 analyzer 和 solr 的TokenizerFactory 以方便在Lucene和Solr中使...
**9:[中文分詞Ansj](http://www.17ky.net/soft/6032.html)**(Star:3015)
Ansj中文分詞 這是一個ictclas的java實現.基本上重寫了所有的資料結構和演算法.詞典是用的開源版的ictclas所提供的.並且進行了部分的人工優化 記憶體中中文分詞每秒鐘大約100萬字(速度上已經超越ictclas) 檔案讀取分詞每秒鐘大約30萬字 準確率能達到96%以上 目前實現了....
**10:[Lucene中文分詞庫ICTCLAS4J](http://www.17ky.net/soft/6034.html)**
ictclas4j中文分詞系統是sinboy在中科院張華平和劉群老師的研製的FreeICTCLAS的基礎上完成的一個java開源分詞專案,簡化了原分詞程式的複雜度,旨在為廣大的中文分詞愛好者一個更好的學習機會。
### 程式碼實現
#### **第一步:**引入依賴
這裡我們引入了兩個依賴,其實是兩個不同分詞工具
```java
```
在開始之前我們先寫一個demo 玩玩,讓大家有個基本的認識
```java
@Test
public void testAnsjSeg() {
String str = "我叫李太白,我是一個詩人,我生活在唐朝" ;
// 選擇使用哪種分詞器 BaseAnalysis ToAnalysis NlpAnalysis IndexAnalysis
Result result = ToAnalysis.parse(str);
System.out.println(result);
KeyWordComputer kwc = new KeyWordComputer(5);
Co