1. 程式人生 > >大資料工具:IKAnalyzer分詞工具介紹與使用

大資料工具:IKAnalyzer分詞工具介紹與使用

簡單介紹IKAnalyzer分詞工具與使用

文章目錄

簡介

以下簡介參考前輩和專案文件介紹

  • 為什麼要分詞呢,當大資料處理中要提取語句的特徵值,進行向量計算。所有我們要用開源分詞工具把語句中的關鍵詞提取出來。

  • IK Analyzer是什麼呢,就是我們需要的這個工具,是基於java開發的輕量級的中文分詞工具包。它是以開源專案Luence為主體的,結合詞典分詞和文法分析演算法的中文分片語件。IK有很多版本,在2012版本中,IK實現了簡單的分詞歧義排除演算法。

  • 我們為什麼選擇IK作為我們的分詞工具呢,這裡我們簡單介紹一下。這裡我們採用了網上的一些介紹。

    • 1、IK才用了特有的“正向迭代最細粒度切分演算法”,支援細粒度和智慧分詞兩種切分模式。
    • 2、在系統環境:Core2 i7 3.4G雙核,4G記憶體,window 7 64位, Sun JDK 1.6_29 64位 普通pc環境測試,IK2012具有160萬字/秒(3000KB/S)的高速處理能力。
    • 3、2012版的只能分詞模式支援簡單的分詞排歧義處理和數量詞合併輸出。
    • 4、用了多子處理器分析模式,支援 英文字母 數字 中文詞彙等
    • 5、優化詞典儲存,更小的記憶體佔用。

IKAnalyzer的引入使用

由於maven庫裡沒有ik的座標。我們需要手動新增到本地的maven倉庫中。或則lib引用

專案地址:https://github.com/wks/ik-analyzer

  • 1、首先要clone程式碼

git clone https://github.com/wks/ik-analyzer

克隆到本地。

  • 2、編譯並且安裝到本地的repository

mvn install -Dmaven.test.skip=true

(1)編譯後也可以將jar上傳到自己的maven私有庫(如果有maven私有庫,那麼久直接使用2012版本,直接網上下載,然後上傳到maven庫即可)。

(2)可以放在本地maven倉庫的對應座標

(3)專案lib下引用

  • 3、在pom.xml中加入如下配置即可
<dependency>
   <groupId>org.wltea.ik-analyzer</groupId>
    <artifactId>ik-analyzer</artifactId>
    <version>3.2.8</version>
</dependency> 

IK的兩個重要詞典

  • 擴充套件詞典:為的是讓需要切分的字串的詞語 根據擴充套件詞典裡的詞,不要切分開來。

例如:擴充套件詞典中有:中國的臺灣 。那麼原本會切分成:中國 的 臺灣 在 東海 。會切分成:中國的臺灣 在 東海

  • 停止詞典:對比停止詞典,直接刪掉停止詞典中出現的詞語

IK的使用

自己案例
maven工程

resource目錄下三個配置檔案
IKAnalyzer.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <comment>IK Analyzer 擴充套件配置</comment>
    <entry key="ext_dict">/extend.dic</entry>
    <entry key="ext_stopwords">/stopword.dic</entry>
</properties>

extend.dic 擴充套件詞典

這是一個
巨大的牆

stopword.dic

一個
一
個
的

IKAnalyzerTest.java

package com.mym.ikanalyzer;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.wltea.analyzer.lucene.IKAnalyzer;

import java.io.IOException;
import java.io.StringReader;

public class IKAnalyzerTest {

    public static String beginAnalyzer(String line){
        IKAnalyzer analyzer = new IKAnalyzer();

        //使用智慧分詞
        //ik2012和ik3.0,3.0沒有這個方法
//        analyzer.setUseSmart(true);


        try {
            return printAnalyzerResult(analyzer, line);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    public static String printAnalyzerResult(Analyzer analyzer, String keyword) throws IOException {
        String resultData = "";
        String infoData = "";

        TokenStream tokenStream = analyzer.tokenStream("content",new StringReader(keyword));
        tokenStream.addAttribute(CharTermAttribute.class);
        while(tokenStream.incrementToken()){
            CharTermAttribute charTermAttribute = tokenStream.getAttribute(CharTermAttribute.class);
            infoData = infoData+ "    "+charTermAttribute.toString();

        }
        if(!"".equals(infoData)){
            resultData = resultData + infoData.trim()+"\r\n";
        }else{
            resultData = "";
        }
        return resultData;
    }

    public static void main(String[] args) {
        String line = "這是一個粗糙的柵欄,浪費錢,我想要一堵巨大的牆!”網友Mary說,還附上了“理想”中的邊境牆照片";
        String s = IKAnalyzerTest.beginAnalyzer(line);
        System.out.println(s);
    }

}

執行結果

這是一個    這是    粗糙    柵欄    浪費    費錢    我    想要    一堵    巨大的牆    巨大    網友    mary    說    還    附上    上了    理想    中    邊境    牆    照片

更詳細使用可參考github上該工程有demo和文件