1. 基本分詞方式,速度快;
創(chuàng)新互聯(lián)建站2013年開創(chuàng)至今,先為仙居等服務(wù)建站,仙居等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為仙居企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
官方示例:
ListTerm parse = BaseAnalysis.parse("讓戰(zhàn)士們過一個(gè)歡樂祥和的新春佳節(jié)。");
System.out.println(parse);
result:[讓/v, 戰(zhàn)士/n, 們/k, 過/ug, 一個(gè)/m, 歡樂/a, 祥和/a, 的/uj, 新春/t, 佳節(jié)/n, 。/w]
2. 精準(zhǔn)分詞方式兼顧精度與速度,比較均衡;
官方示例:
ListTerm parse = ToAnalysis.parse("讓戰(zhàn)士們過一個(gè)歡樂祥和的新春佳節(jié)。");
System.out.println(parse);
3. NLP分詞方式可是未登錄詞,但速度較慢;
如果你的分詞規(guī)則是在一個(gè)字符串的開頭和結(jié)尾加上"_",然后兩個(gè)字符一分的話,代碼可以這樣寫:
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 = "計(jì)算機(jī)";
exampleWord = "_" + exampleWord + "_";
int length = exampleWord.length();
ListString result = new ArrayListString();
for (int i = 0; i length - 1; i++)
{
String str = exampleWord.substring(i, i + PARTICIPLE_LENGTH);
result.add(str);
}
System.out.println(result);
}
}
輸出結(jié)果:_計(jì), 計(jì)算, 算機(jī), 機(jī)_
這個(gè)分詞是一個(gè)很大很難的東西,中科院做了五年才做出ICTCLAS,如果你自己寫的話估計(jì)可以暈了,建議你用現(xiàn)成的分詞工具,用java調(diào)用,比較好的有上面的ICTCLAS,如果你是做搜索引擎,那么用lucene支持的一些分詞工具會(huì)很不錯(cuò)
需要commons-io包,?或者自己寫讀文件的部分
import?java.io.File;
import?java.io.IOException;
import?java.util.ArrayList;
import?java.util.Collections;
import?java.util.Comparator;
import?java.util.List;
import?java.util.regex.Matcher;
import?java.util.regex.Pattern;
import?org.apache.commons.io.FileUtils;
public?class?Test20?{
/**
*?@param?args
*/
public?static?void?main(String[]?args)?{
//?TODO?Auto-generated?method?stub
String?str?=?null;
try?{
str?=?FileUtils.readFileToString(new?File("e.txt"));
}?catch?(IOException?e)?{
//?TODO?Auto-generated?catch?block
e.printStackTrace();
}
Pattern?p?=?Pattern.compile("\\b[\\w-']+\\b");
Matcher?m?=?p.matcher(str);
ListWord?words?=?new?ArrayListWord();
while(m.find()){
add(words,?m.group().trim());
}
Collections.sort(words,?new?ComparatorWord(){
@Override
public?int?compare(Word?o1,?Word?o2)?{
//?TODO?Auto-generated?method?stub
return?o1.getWord().compareTo(o2.getWord());
}});
System.out.println(words);
}
private?static?void?add(ListWord?words,?String?word)?{
//?TODO?Auto-generated?method?stub
for(Word?temp?:?words){
if(temp.getWord().equals(word)){
temp.setCount(temp.getCount()?+?1);
return;
}
}
Word?w?=?new?Word();
w.setWord(word);
words.add(w);
}
}
class?Word{
private?String?word;
private?int?count?=?1;
public?String?getWord()?{
return?word;
}
public?void?setWord(String?word)?{
this.word?=?word;
}
public?int?getCount()?{
return?count;
}
public?void?setCount(int?count)?{
this.count?=?count;
}
@Override
public?String?toString()?{
return?"Word?[word="?+?word?+?",?count="?+?count?+?"]";
}
}
這兩天正好在玩lucene,沒用庖丁分詞,主要是嫌它要配置環(huán)境,麻煩
下面是demo,記得要加lucene-core-2.3.2.jar和lucene-Analyzer.jar以及IKAnalyzer.jar這幾個(gè)包,有問題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 = "冗長(zhǎng)的代碼常常是復(fù)雜性的標(biāo)志,會(huì)導(dǎo)致代碼難以測(cè)試和維護(hù).";
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("分析方法:默認(rèn)沒有詞只有字");
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);
}
}
現(xiàn)可以提供兩種思路:
1.String或是StringBuffer(建議用) 中的indexOf("中華")方法,查找給定的的字符串中是否有給定詞表中的詞。
2.借鑒編譯原理中的狀態(tài)裝換的思想。
先編寫一個(gè)狀態(tài)機(jī),用于測(cè)試給定字符串中的詞是否滿足詞表中的內(nèi)容。
寫在最后:1)建議使用第一種方法,因?yàn)樵趈ava 內(nèi)部實(shí)現(xiàn)的查找操作其實(shí) 和你想得思路是相同的,不過他的效率會(huì)高些。
2)如果個(gè)人的編程能力比較強(qiáng)或是不考慮效率只是想實(shí)現(xiàn)專有的分詞算法。可以使用第二種方法。
3)以上的兩種方法都可以使用多線程來提高程序的效率。