Stories

Detail Return Return

使用java語言如何實現一句話的分詞,不依賴es,可以引入依賴,給個樣例 - Stories Detail

在Java中實現一句話分詞而不依賴ES(Elasticsearch),有多種成熟的開源分詞庫可以選擇。下面我為你介紹幾種主流方案,並提供相應的代碼示例。

1. 使用HanLP進行分詞

HanLP是一個功能豐富的自然語言處理庫,分詞準確度高,支持詞性標註。

Maven依賴:

<dependency>
    <groupId>com.hankcs</groupId>
    <artifactId>hanlp</artifactId>
    <version>portable-1.8.4</version>
</dependency>

代碼示例:

import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.seg.common.Term;
import java.util.List;

public class HanLPDemo {
    public static void main(String[] args) {
        String text = "今天天氣真好,我們一起出去玩吧!";
        
        // 進行分詞
        List<Term> termList = HanLP.segment(text);
        
        // 輸出結果
        System.out.println("原句: " + text);
        System.out.println("分詞結果:");
        for (Term term : termList) {
            System.out.println(term.word + " [" + term.nature + "]");
        }
        
        // 如果只需要詞語,不需要詞性
        List<String> wordList = HanLP.segment(text).stream()
                .map(term -> term.word)
                .collect(java.util.stream.Collectors.toList());
        System.out.println("純詞語列表: " + wordList);
    }
}

2. 使用Jieba分詞(Java版)

Jieba分詞雖然源自Python,但其Java版本也非常流行。

Maven依賴:

<dependency>
    <groupId>com.huaban</groupId>
    <artifactId>jieba-analysis</artifactId>
    <version>1.0.2</version>
</dependency>

代碼示例:

import com.huaban.analysis.jieba.JiebaSegmenter;
import java.util.List;

public class JiebaDemo {
    public static void main(String[] args) {
        JiebaSegmenter segmenter = new JiebaSegmenter();
        String sentence = "我喜歡使用Java進行中文分詞處理";
        
        // 進行分詞
        List<String> words = segmenter.sentenceProcess(sentence);
        
        System.out.println("原句: " + sentence);
        System.out.println("分詞結果: " + words);
    }
}

3. 使用Ansj分詞

Ansj是另一個優秀的Java中文分詞工具,在效果和性能上都有不錯表現。

Maven依賴:

<dependency>
    <groupId>org.ansj</groupId>
    <artifactId>ansj_seg</artifactId>
    <version>5.1.6</version>
</dependency>

代碼示例:

import org.ansj.domain.Result;
import org.ansj.domain.Term;
import org.ansj.splitWord.analysis.ToAnalysis;
import java.util.List;

public class AnsjDemo {
    public static void main(String[] args) {
        String text = "歡迎使用ansj_seg進行中文分詞";
        
        // 進行分詞
        Result result = ToAnalysis.parse(text);
        List<Term> terms = result.getTerms();
        
        System.out.println("原句: " + text);
        System.out.println("分詞結果:");
        for (Term term : terms) {
            System.out.println(term.getName() + ":" + term.getNatureStr());
        }
    }
}

4. 使用IK Analyzer

IK Analyzer是一個輕量級的中文分詞工具包,特別適合Lucene集成。

Maven依賴:

<dependency>
    <groupId>com.janeluo</groupId>
    <artifactId>ikanalyzer</artifactId>
    <version>2012_u6</version>
</dependency>

代碼示例:

import org.wltea.analyzer.core.IKSegmenter;
import org.wltea.analyzer.core.Lexeme;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

public class IKDemo {
    public static void main(String[] args) throws Exception {
        String text = "這是一個基於IK分詞器的示例";
        
        List<String> words = new ArrayList<>();
        StringReader reader = new StringReader(text);
        IKSegmenter segmenter = new IKSegmenter(reader, true); // true啓用智能分詞
        
        Lexeme lexeme;
        while ((lexeme = segmenter.next()) != null) {
            words.add(lexeme.getLexemeText());
        }
        
        System.out.println("原句: " + text);
        System.out.println("IK分詞結果: " + words);
    }
}

5. 簡易自定義分詞器(基於詞典)

如果需要簡單的自定義分詞,可以參考以下基於逆向最大匹配的示例:

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.*;

public class SimpleSegmenter {
    private Set<String> dictionary = new HashSet<>();
    
    public void loadDictionary(String filePath) {
        try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = reader.readLine()) != null) {
                dictionary.add(line.trim());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public List<String> segment(String text) {
        List<String> result = new ArrayList<>();
        int maxLength = 4; // 最大詞長
        int end = text.length();
        
        while (end > 0) {
            int start = Math.max(0, end - maxLength);
            String word = text.substring(start, end);
            
            while (start < end - 1) {
                if (dictionary.contains(word)) {
                    break;
                } else {
                    start++;
                    word = text.substring(start, end);
                }
            }
            
            result.add(0, word);
            end = start;
        }
        
        return result;
    }
    
    public static void main(String[] args) {
        SimpleSegmenter segmenter = new SimpleSegmenter();
        // 加載詞典文件(每行一個詞)
        segmenter.loadDictionary("dictionary.txt");
        
        String text = "今天天氣不錯";
        List<String> words = segmenter.segment(text);
        System.out.println("自定義分詞結果: " + words);
    }
}

主流分詞庫對比

下表幫助你根據需求選擇合適的分詞庫:

分詞庫

特點

適用場景

HanLP

功能全面,準確率高,支持多種NLP任務

需要詞性標註、實體識別等高級功能

Jieba

性能均衡,準確度好,使用廣泛

通用中文分詞場景

Ansj

速度快,支持多種分詞模式

對性能要求較高的場景

IK Analyzer

輕量級,與Lucene集成好

搜索場景,Lucene/Solr項目

Paoding

高效率,擴展性好

大數據量處理

選擇建議

  • 對於一般應用,推薦從 HanLPJieba開始,它們平衡了準確性和易用性。
  • 對於搜索場景IK Analyzer是不錯的選擇。
  • 對於高性能需求,可以考慮 AnsjPaoding

以上方案都可以獨立使用,不依賴ES,根據你的具體需求選擇合適的分詞庫即可。

user avatar mannayang Avatar king_wenzhinan Avatar u_17513518 Avatar xiaoniuhululu Avatar journey_64224c9377fd5 Avatar sofastack Avatar u_16502039 Avatar u_13529088 Avatar debuginn Avatar seazhan Avatar xuxueli Avatar tech Avatar
Favorites 17 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.