『壹』 java語言中文分詞程序怎麼編寫
現可以提供兩種思路:
1.String或是StringBuffer(建議用) 中的indexOf("中華")方法,查找給定的的字元串中是否有給定詞表中的詞。
2.借鑒編譯原理中的狀態裝換的思想。
先編寫一個狀態機,用於測試給定字元串中的詞是否滿足詞表中的內容。
寫在最後:1)建議使用第一種方法,因為在java 內部實現的查找操作其實 和你想得思路是相同的,不過他的效率會高些。
2)如果個人的編程能力比較強或是不考慮效率只是想實現專有的分詞演算法。可以使用第二種方法。
3)以上的兩種方法都可以使用多線程來提高程序的效率。
『貳』 java如何分詞
如果你的分詞規則是在一個字元串的開頭和結尾加上"_",然後兩個字元一分的話,代碼可以這樣寫:
import java.util.ArrayList;
import java.util.List;
public class Participle
{
private static final String HEAD_END_STR = "_";
private static final int PARTICIPLE_LENGTH = 2;
public static void main(String[] args)
{
String exampleWord = "計算機";
exampleWord = "_" + exampleWord + "_";
int length = exampleWord.length();
List<String> result = new ArrayList<String>();
for (int i = 0; i < length - 1; i++)
{
String str = exampleWord.substring(i, i + PARTICIPLE_LENGTH);
result.add(str);
}
System.out.println(result);
}
}
輸出結果:_計, 計算, 算機, 機_
『叄』 怎麼使用java中文分片語件word
參考如下
1、快速體驗
運行項目根目錄下的腳本demo-word.bat可以快速體驗分詞效果
用法: command [text] [input] [output]
命令command的可選值為:demo、text、file
demo
text 楊尚川是APDPlat應用級產品開發平台的作者
file d:/text.txt d:/word.txt
exit
2、對文本進行分詞
移除停用詞:List<Word> words = WordSegmenter.seg("楊尚川是APDPlat應用級產品開發平台的作者");
保留停用詞:List<Word> words = WordSegmenter.segWithStopWords("楊尚川是APDPlat應用級產品開發平台的作者");
System.out.println(words);
輸出:
移除停用詞:[楊尚川, apdplat, 應用級, 產品, 開發平台, 作者]
保留停用詞:[楊尚川, 是, apdplat, 應用級, 產品, 開發平台, 的, 作者]
3、對文件進行分詞
String input = "d:/text.txt";
String output = "d:/word.txt";
移除停用詞:WordSegmenter.seg(new File(input), new File(output));
保留停用詞:WordSegmenter.segWithStopWords(new File(input), new File(output));
4、自定義配置文件
默認配置文件為類路徑下的word.conf,打包在word-x.x.jar中
自定義配置文件為類路徑下的word.local.conf,需要用戶自己提供
如果自定義配置和默認配置相同,自定義配置會覆蓋默認配置
配置文件編碼為UTF-8
5、自定義用戶詞庫
自定義用戶詞庫為一個或多個文件夾或文件,可以使用絕對路徑或相對路徑
用戶詞庫由多個詞典文件組成,文件編碼為UTF-8
詞典文件的格式為文本文件,一行代表一個詞
可以通過系統屬性或配置文件的方式來指定路徑,多個路徑之間用逗號分隔開
類路徑下的詞典文件,需要在相對路徑前加入前綴classpath:
指定方式有三種:
指定方式一,編程指定(高優先順序):
WordConfTools.set("dic.path", "classpath:dic.txt,d:/custom_dic");
DictionaryFactory.reload();//更改詞典路徑之後,重新載入詞典
指定方式二,Java虛擬機啟動參數(中優先順序):
java -Ddic.path=classpath:dic.txt,d:/custom_dic
指定方式三,配置文件指定(低優先順序):
使用類路徑下的文件word.local.conf來指定配置信息
dic.path=classpath:dic.txt,d:/custom_dic
如未指定,則默認使用類路徑下的dic.txt詞典文件
6、自定義停用詞詞庫
使用方式和自定義用戶詞庫類似,配置項為:
stopwords.path=classpath:stopwords.txt,d:/custom_stopwords_dic
7、自動檢測詞庫變化
可以自動檢測自定義用戶詞庫和自定義停用詞詞庫的變化
包含類路徑下的文件和文件夾、非類路徑下的絕對路徑和相對路徑
如:
classpath:dic.txt,classpath:custom_dic_dir,
d:/dic_more.txt,d:/DIC_DIR,D:/DIC2_DIR,my_dic_dir,my_dic_file.txt
classpath:stopwords.txt,classpath:custom_stopwords_dic_dir,
d:/stopwords_more.txt,d:/STOPWORDS_DIR,d:/STOPWORDS2_DIR,stopwords_dir,remove.txt
8、顯式指定分詞演算法
對文本進行分詞時,可顯式指定特定的分詞演算法,如:
WordSegmenter.seg("APDPlat應用級產品開發平台", SegmentationAlgorithm.BidirectionalMaximumMatching);
SegmentationAlgorithm的可選類型為:
正向最大匹配演算法:MaximumMatching
逆向最大匹配演算法:ReverseMaximumMatching
正向最小匹配演算法:MinimumMatching
逆向最小匹配演算法:ReverseMinimumMatching
雙向最大匹配演算法:BidirectionalMaximumMatching
雙向最小匹配演算法:BidirectionalMinimumMatching
雙向最大最小匹配演算法:
全切分演算法:FullSegmentation
最少分詞演算法:MinimalWordCount
最大Ngram分值演算法:MaxNgramScore
9、分詞效果評估
運行項目根目錄下的腳本evaluation.bat可以對分詞效果進行評估
評估採用的測試文本有253 3709行,共2837 4490個字元
評估結果位於target/evaluation目錄下:
corpus-text.txt為分好詞的人工標注文本,詞之間以空格分隔
test-text.txt為測試文本,是把corpus-text.txt以標點符號分隔為多行的結果
standard-text.txt為測試文本對應的人工標注文本,作為分詞是否正確的標准
result-text-***.txt,***為各種分詞演算法名稱,這是word分詞結果
perfect-result-***.txt,***為各種分詞演算法名稱,這是分詞結果和人工標注標准完全一致的文本
wrong-result-***.txt,***為各種分詞演算法名稱,這是分詞結果和人工標注標准不一致的文本
『肆』 中文分詞的常見項目
功能性能 功能描述:1.新詞自動識別
對詞典中不存在的詞,可以自動識別,對詞典的依賴較小;
2.詞性輸出
分詞結果中帶有豐富的詞性;
3.動態詞性輸出
分詞結果中的詞性並非固定,會根據不同的語境,賦予不同的詞性;
4.特殊詞識別
比如化學、葯品等行業詞彙,地名、品牌、媒體名等;
5.智能歧義解決
根據內部規則,智能解決常見分詞歧義問題;
6.多種編碼識別
自動識別各種單一編碼,並支持混合編碼;
7.數詞量詞優化
自動識別數量詞; 性能介紹:處理器:AMD Athlon II x2 250 3GHZ
單線程大於833KB/s,多線程安全。 一個php函數實現中文分詞。使分詞更容易,使用如下圖:
Paoding(庖丁解牛分詞)基於Java的開源中文分片語件,提供lucene和solr 介面,具有極 高效率和 高擴展性。引入隱喻,採用完全的面向對象設計,構思先進。
高效率:在PIII 1G內存個人機器上,1秒可准確分詞 100萬漢字。
採用基於 不限制個數的詞典文件對文章進行有效切分,使能夠將對詞彙分類定義。
能夠對未知的詞彙進行合理解析。
僅支持Java語言。 MMSEG4J基於Java的開源中文分片語件,提供lucene和solr 介面:
1.mmseg4j 用 Chih-Hao Tsai 的 MMSeg 演算法實現的中文分詞器,並實現 lucene 的 analyzer 和 solr 的TokenizerFactory 以方便在Lucene和Solr中使用。
2.MMSeg 演算法有兩種分詞方法:Simple和Complex,都是基於正向最大匹配。Complex 加了四個規則過慮。官方說:詞語的正確識別率達到了 98.41%。mmseg4j 已經實現了這兩種分詞演算法。 盤古分詞是一個基於.net 平台的開源中文分片語件,提供lucene(.net 版本) 和HubbleDotNet的介面
高效:Core Duo 1.8 GHz 下單線程 分詞速度為 390K 字元每秒
准確:盤古分詞採用字典和統計結合的分詞演算法,分詞准確率較高。
功能:盤古分詞提供中文人名識別,簡繁混合分詞,多元分詞,英文詞根化,強制一元分詞,詞頻優先分詞,停用詞過濾,英文專名提取等一系列功能。 jcseg是使用Java開發的一個中文分詞器,使用流行的mmseg演算法實現。
1。mmseg四種過濾演算法,分詞准確率達到了98.4%以上。
2。支持自定義詞庫。在lexicon文件夾下,可以隨便添加/刪除/更改詞庫和詞庫內容,並且對詞庫進行了分類,詞庫整合了《現代漢語詞典》和cc-cedict辭典。
3。詞條拼音和同義詞支持,jcseg為所有詞條標注了拼音,並且詞條可以添加同義詞集合,jcseg會自動將拼音和同義詞加入到分詞結果中。
4。中文數字和分數識別,例如:"四五十個人都來了,三十分之一。"中的"四五十"和"三十分之一",並且jcseg會自動將其轉換為對應的阿拉伯數字。
5。支持中英混合詞的識別。例如:B超,x射線。
6。支持基本單字單位的識別,例如2012年。
7。良好的英文支持,自動識別電子郵件,網址,分數,小數,百分數……。
8。智能圓角半形轉換處理。
9。特殊字母識別:例如:Ⅰ,Ⅱ
10。特殊數字識別:例如:①,⑩
11。配對標點內容提取:例如:最好的Java書《java編程思想》,『暢想杯黑客技術大賽』,被《,『,「,『標點標記的內容。
12。智能中文人名識別。中文人名識別正確率達94%以上。
jcseg佩帶了jcseg.properties配置文檔,使用文本編輯器就可以自主的編輯其選項,配置適合不同應用場合的分詞應用。例如:最大匹配分詞數,是否開啟中文人名識別,是否載入詞條拼音,是否載入詞條同義詞……。 friso是使用c語言開發的一個中文分詞器,使用流行的mmseg演算法實現。完全基於模塊化設計和實現,可以很方便的植入到其他程序中,例如:MySQL,PHP等。並且提供了一個php中文分詞擴展robbe。
1。只支持UTF-8編碼。【源碼無需修改就能在各種平台下編譯使用,載入完20萬的詞條,內存佔用穩定為14M。】。
2。mmseg四種過濾演算法,分詞准確率達到了98.41%。
3。支持自定義詞庫。在dict文件夾下,可以隨便添加/刪除/更改詞庫和詞庫詞條,並且對詞庫進行了分類。
4。詞庫使用了friso的Java版本jcseg的簡化詞庫。
5。支持中英混合詞的識別。例如:c語言,IC卡。
7。很好的英文支持,電子郵件,網址,小數,分數,百分數。
8。支持阿拉伯數字基本單字單位的識別,例如2012年,5噸,120斤。
9。自動英文圓角/半形,大寫/小寫轉換。
並且具有很高的分詞速度:簡單模式:3.7M/秒,復雜模式:1.8M/秒。
『伍』 java編個中文分詞的程序
importjava.io.Reader;
importjava.io.StringReader;
importorg.apache.lucene.analysis.*;
importorg.apache.lucene.analysis.cjk.CJKAnalyzer;
importorg.apache.lucene.analysis.cn.ChineseAnalyzer;
importorg.apache.lucene.analysis.standard.StandardAnalyzer;
importorg.mira.lucene.analysis.MIK_CAnalyzer;
publicclassJeAnalyzer{
publicstaticvoidtestStandard(StringtestString){
try{
Analyzeranalyzer=newStandardAnalyzer();
Readerr=newStringReader(testString);
StopFiltersf=(StopFilter)analyzer.tokenStream("",r);
System.err.println("=====standardanalyzer====");
Tokent;
while((t=sf.next())!=null){
System.out.println(t.termText());
}
}catch(Exceptione){
e.printStackTrace();
}
}
publicstaticvoidtestCJK(StringtestString){
try{
Analyzeranalyzer=newCJKAnalyzer();
Readerr=newStringReader(testString);
StopFiltersf=(StopFilter)analyzer.tokenStream("",r);
System.err.println("=====cjkanalyzer====");
Tokent;
while((t=sf.next())!=null){
System.out.println(t.termText());
}
}catch(Exceptione){
e.printStackTrace();
}
}
publicstaticvoidtestChiniese(StringtestString){
try{
Analyzeranalyzer=newChineseAnalyzer();
Readerr=newStringReader(testString);
TokenFiltertf=(TokenFilter)analyzer.tokenStream("",r);
System.err.println("=====chineseanalyzer====");
Tokent;
while((t=tf.next())!=null){
System.out.println(t.termText());
}
}catch(Exceptione){
e.printStackTrace();
}
}
publicstaticStringtransJe(StringtestString,Stringc1,Stringc2){
Stringresult="";
try{
Analyzeranalyzer=newMIK_CAnalyzer();
Readerr=newStringReader(testString);
TokenStreamts=(TokenStream)analyzer.tokenStream("",r);
Tokent;
while((t=ts.next())!=null){
result+=t.termText()+",";
}
}catch(Exceptione){
e.printStackTrace();
}
returnresult;
}
publicstaticvoidmain(String[]args){
try{
StringtestString="中文分詞的方法其實不局限於中文應用,也被應用到英文處理,如手寫識別,單詞之間的空格就很清楚,中文分詞方法可以幫助判別英文單詞的邊界";
System.out.println("測試的語句"+testString);
StringsResult[]=transJe(testString,"gb2312","utf-8").split(",");
for(inti=0;i<sResult.length;i++){
System.out.println(sResult[i]);
}
}catch(Exceptione){
e.printStackTrace();
}
}
}
jar包
lucene-analyzers-2.4.1.jar
lucene-core-2.4.1.jar
IKAnalyzer2.0.2OBF.jar
『陸』 求高手給我用java編寫一個英文單詞分詞器
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Danci {
public static void main(String[] args){
String str = new String();
System.out.print("請輸入一個英文句子:");
try{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//獲取鍵盤輸入
str = br.readLine();
}catch(IOException e){
e.printStackTrace();
}
String []s = str.split(" ");//轉換成數組
System.out.println("你輸入的句子共有單詞 "+s.length+" 個");//s.length獲取數組長度
}
}
//此程序只能獲取一句話的單詞個數.
『柒』 Java中文分詞演算法
這兩天正好在玩lucene,沒用庖丁分詞,主要是嫌它要配置環境,麻煩
下面是demo,記得要加lucene-core-2.3.2.jar和lucene-Analyzer.jar以及IKAnalyzer.jar這幾個包,有問題call我
import java.io.Reader;
import java.io.StringReader;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.StopFilter;
import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.TokenFilter;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.cjk.CJKAnalyzer;
import org.apache.lucene.analysis.cn.ChineseAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.mira.lucene.analysis.IK_CAnalyzer;
public class TestJeAnalyzer {
private static String testString1 = "冗長的代碼常常是復雜性的標志,會導致代碼難以測試和維護.";
public static void testStandard(String testString) throws Exception{
Analyzer analyzer = new StandardAnalyzer();
Reader r = new StringReader(testString);
StopFilter sf = (StopFilter) analyzer.tokenStream("", r);
System.err.println("=====standard analyzer====");
System.err.println("分析方法:默認沒有詞只有字");
Token t;
while ((t = sf.next()) != null) {
System.out.println(t.termText());
}
}
public static void testCJK(String testString) throws Exception{
Analyzer analyzer = new CJKAnalyzer();
Reader r = new StringReader(testString);
StopFilter sf = (StopFilter) analyzer.tokenStream("", r);
System.err.println("=====cjk analyzer====");
System.err.println("分析方法:交叉雙字分割");
Token t;
while ((t = sf.next()) != null) {
System.out.println(t.termText());
}
}
public static void testChiniese(String testString) throws Exception{
Analyzer analyzer = new ChineseAnalyzer();
Reader r = new StringReader(testString);
TokenFilter tf = (TokenFilter) analyzer.tokenStream("", r);
System.err.println("=====chinese analyzer====");
System.err.println("分析方法:基本等同StandardAnalyzer");
Token t;
while ((t = tf.next()) != null) {
System.out.println(t.termText());
}
}
public static void testJe(String testString) throws Exception{
// Analyzer analyzer = new MIK_CAnalyzer();
Analyzer analyzer = new IK_CAnalyzer();
Reader r = new StringReader(testString);
TokenStream ts = (TokenStream)analyzer.tokenStream("", r);
System.err.println("=====je analyzer====");
System.err.println("分析方法:字典分詞,正反雙向搜索,具體不明");
Token t;
while ((t = ts.next()) != null) {
System.out.println(t.termText());
}
}
public static void main(String[] args) throws Exception{
// String testString = testString1;
String testString = testString1;
System.out.println(testString);
testStandard(testString);
testCJK(testString);
// testPaoding(testString);
testChiniese(testString);
testJe(testString);
}
}
『捌』 java 怎麼用lucenes進行分詞
import java.io.IOException;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;
/**
* 使用IKAnalyzer進行Lucene索引和查詢的演示
* 2012-3-2
*
* 以下是結合Lucene4.0 API的寫法
*
*/
public class LuceneIndexAndSearchDemo {
/**
* 模擬:
* 創建一個單條記錄的索引,並對其進行搜索
* @param args
*/
public static void main(String[] args){
//Lucene Document的域名
String fieldName = "text";
//檢索內容
String text = "IK Analyzer是一個結合詞典分詞和文法分詞的中文分詞開源工具包。它使用了全新的正向迭代最細粒度切分演算法。";
//實例化IKAnalyzer分詞器
Analyzer analyzer = new IKAnalyzer(true);
Directory directory = null;
IndexWriter iwriter = null;
IndexReader ireader = null;
IndexSearcher isearcher = null;
try {
//建立內存索引對象
directory = new RAMDirectory();
//配置IndexWriterConfig
IndexWriterConfig iwConfig = new IndexWriterConfig(Version.LUCENE_40 , analyzer);
iwConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
iwriter = new IndexWriter(directory , iwConfig);
//寫入索引
Document doc = new Document();
doc.add(new StringField("ID", "10000", Field.Store.YES));
doc.add(new TextField(fieldName, text, Field.Store.YES));
iwriter.addDocument(doc);
iwriter.close();
//搜索過程**********************************
//實例化搜索器
ireader = DirectoryReader.open(directory);
isearcher = new IndexSearcher(ireader);
String keyword = "中文分詞工具包";
//使用QueryParser查詢分析器構造Query對象
QueryParser qp = new QueryParser(Version.LUCENE_40, fieldName, analyzer);
qp.setDefaultOperator(QueryParser.AND_OPERATOR);
Query query = qp.parse(keyword);
System.out.println("Query = " + query);
//搜索相似度最高的5條記錄
TopDocs topDocs = isearcher.search(query , 5);
System.out.println("命中:" + topDocs.totalHits);
//輸出結果
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (int i = 0; i < topDocs.totalHits; i++){
Document targetDoc = isearcher.doc(scoreDocs[i].doc);
System.out.println("內容:" + targetDoc.toString());
}
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (LockObtainFailedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} finally{
if(ireader != null){
try {
ireader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(directory != null){
try {
directory.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}