1. 基本分詞方式,速度快;
創新互聯建站2013年開創至今,先為仙居等服務建站,仙居等地企業,進行企業商務咨詢服務。為仙居企業網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。
官方示例:
ListTerm parse = BaseAnalysis.parse("讓戰士們過一個歡樂祥和的新春佳節。");
System.out.println(parse);
result:[讓/v, 戰士/n, 們/k, 過/ug, 一個/m, 歡樂/a, 祥和/a, 的/uj, 新春/t, 佳節/n, 。/w]
2. 精準分詞方式兼顧精度與速度,比較均衡;
官方示例:
ListTerm parse = ToAnalysis.parse("讓戰士們過一個歡樂祥和的新春佳節。");
System.out.println(parse);
3. NLP分詞方式可是未登錄詞,但速度較慢;
如果你的分詞規則是在一個字符串的開頭和結尾加上"_",然后兩個字符一分的話,代碼可以這樣寫:
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();
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);
}
}
輸出結果:_計, 計算, 算機, 機_
這個分詞是一個很大很難的東西,中科院做了五年才做出ICTCLAS,如果你自己寫的話估計可以暈了,建議你用現成的分詞工具,用java調用,比較好的有上面的ICTCLAS,如果你是做搜索引擎,那么用lucene支持的一些分詞工具會很不錯
需要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,沒用庖丁分詞,主要是嫌它要配置環境,麻煩
下面是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);
}
}
現可以提供兩種思路:
1.String或是StringBuffer(建議用) 中的indexOf("中華")方法,查找給定的的字符串中是否有給定詞表中的詞。
2.借鑒編譯原理中的狀態裝換的思想。
先編寫一個狀態機,用于測試給定字符串中的詞是否滿足詞表中的內容。
寫在最后:1)建議使用第一種方法,因為在java 內部實現的查找操作其實 和你想得思路是相同的,不過他的效率會高些。
2)如果個人的編程能力比較強或是不考慮效率只是想實現專有的分詞算法。可以使用第二種方法。
3)以上的兩種方法都可以使用多線程來提高程序的效率。
新聞名稱:情感分詞字典java代碼的簡單介紹
轉載來源:http://vcdvsql.cn/article4/hiocie.html
成都網站建設公司_創新互聯,為您提供App設計、標簽優化、品牌網站建設、虛擬主機、自適應網站、品牌網站制作
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯