這兩天正好在玩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);
}
}
Ⅱ 求lucene4.6 中的幾種中文分詞方法的詳細介紹,
在analyzers-smartcn里,沒在core里。
SmartChineseAnalyzer是基於隱馬爾可夫模型的,用的中科院分詞的詞典數據
文檔地址:http://lucene.apache.org/core/4_6_1/analyzers-smartcn/index.html
Ⅲ 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();
}
}
}
}
}
Ⅳ lucene3.0如何實現中英數字混合字元串分詞,例"wo是一個19歲的小伙",分詞為w,o,是,一,個,1,9,歲,的,小
你可用不同的分詞器(Analyser)來時間中文和英文的分詞,主流的中文分詞器有IKAnalyzer,SmartChineseAnalyzer,等等有五六種,你可也網路一下中文分詞器,用些分詞器可以同時對英文和中文進行分詞,很好用的。。。
Ⅳ Lucene是什麼
Lucene針對中文單字為詞,「我是學生」在standardAnalyzer分割下,分為「我」,「是」,「學」,「生」。
車東做了CJKAnalyzer可以分為「我是」,「是學」,「學生」。
你也可以用Dijkstra演算法來自己做一個,源代碼向家立要,他和我寫過《Lucene分析與應用》,他會告訴你去如何下載這個代碼,這種分詞都是有經驗值的,也就是說「學生」,已經是分割過的,就是有字典存在。
不配合字典你再想一想,自然語言是什麼?是人類的交談工具吧,有沒有規律哪?頻率,位置依賴關系,但是不管如何,人類自己要能明白,沒有人類自身的經驗,就別談「分詞」,「字典」。
分詞與Lucene關系不大,它只是輸入,雖然也會影響索引,與效率,效能,但是Lucene與你談論的問題關系不太大。
Ⅵ 如何避免lucene queryparser中文分詞的缺陷
這個問題簡單說來就是,對於一個連續的中文query,queryparser將Analyzer返回的Term序列構成了PhraseQuery(也有可能是MultiPhraseQuery),而PhraseQuery默認的匹配規則是要求Term序列在索引的文檔中完全順序匹配。這對於英文查詢來說是可以接受的,因為queryparser在分析query時,首先通過AND、OR、NOT將query進行切分(這可以理解為queryparser 的第一層分析,這樣切分後構成的TOP Query就是BooleanQuery),然後將切分後的subquery交由Analyzer分析(當然這要求是滿足FieldQuery的情況,否則也可能是RangeQuery、WildcardQuery等),因為英文單詞之間以空格分割,相當於OR查詢,所以英文中的subquery就可以理解是個短語(比如由多個連字元連接的短語,或者是英文和數字接合的短語,在lucene查詢語法中,顯示的雙引號之間的內容認為是短語)。但對中文來說,如果將subquery分析成PhraseQuery,就很成問題。比如subquery是」諾基亞N97「,如果構成PhraseQuery,則要求索引的文檔中必須存在」諾基亞N97「,如果」諾基亞「和」N97「中間有其他詞,就不算匹配。對於這個例子,是可以調整PhraseQuery的 slop參數來變相解決,但這種情況,使用AND BooleanQuery更合適,使用BooleanQuery在對文檔打分上也要比PhraseQuery好很多。而對於query分詞結果,也存在一些TermQuery之間是OR的情況,使用PhraseQuery顯然也不合適。
如LUCENE-2458提到,這個bug會在3.1和4中被修復,修復方法是,只有顯示通過雙引號括起來的subquery才生成 PhraseQuery,否則可以派生子類來自定義處理。就目前使用來說,如果你使用IK做Analyzer,那麼它提供的IKQueryParser是很好的替代方案,它構造的就是由AND和OR聯合的BooleanQuery。但因為BooleanQuery沒有考慮各個Term在文檔中的位置關系,一味的根據詞頻計算得分,檢索效果有時也不是很好。不知道大家是怎麼處理的?我有想到去擴展它的Query和Scorer,不過看起來有些麻煩,暫且還沒精力投入上去。
Ⅶ lucene中分詞和索引的區別
ucene中分詞和索引的區別如下:
1、分詞器,對文本資源進行切分,將字元文本串按照一定的規則切分為一個個可以進行索引的最小單位(關鍵詞),以便檢索時使用。
Ⅷ 如何在lucene中使用中文自動分詞技術
因為一元分詞不適合進行中文檢索。一元分詞是按字拆分的,比如一句話「夢想很豐滿」,使用一元分詞拆分的結果是:「夢」,「想」,「很」,「豐」,「滿」。如果查找「夢想」這個詞,是找不到查詢結果的。這並不符合我們的檢索習慣,所以極少使用。
Ⅸ lucene怎麼使用nlpir進行分詞
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using Lucene.Net.Analysis;
namespace Lucene.Net.Analysis.DChinese
{
[StructLayout(LayoutKind.Explicit)]
public struct result_t
{
[FieldOffset(0)]
public int start;
[FieldOffset(4)]
public int length;
[FieldOffset(8)]
public int sPos1;
[FieldOffset(12)]
public int sPos2;
[FieldOffset(16)]
public int sPos3;
[FieldOffset(20)]
public int sPos4;
[FieldOffset(24)]
public int sPos5;
[FieldOffset(28)]
public int sPos
Ⅹ lucene 中文分詞
StandardAnalyzer是可以用於中文分詞,但它是一元分詞,機械地將一個漢字做為一個詞元來切分的,速度慢不說,語義也沒有了,當然應該能保證查全率,呵呵.
ChineseAnalyzer比它好一點,也相當於一元分詞。
lucene的第三方分詞包有很多,上面兩個不建議使用。可以去了解:
IK_CAnalyzer
庖丁解牛分詞器
JE分詞器