初试身手—融入自己的中文分词器
现在准备着手写一个真正意义上的聚类搜素了。一开始担心老外的carrot2对中文会进行“歧视”,后来发现原
来carrot2还是比较重视中文的,在有一个
org.carrot2.filter.lingo.local.ChineseLingoLocalFilterComponent的类,专门用来为中文提供分词操作。
再次往下细看,底层的分词造作在org.carrot2.util.tokenizer.parser.jflex.JeZHWordSplit中实现的,采用
的是基于lucene的MMAnalyer 。我没有使用过这种分词器,不知道它的消歧机制和切分效率如何,于是想拿经
常使用的分词器来做个比较。于是,必须建立一个自己的中文filter组建。 以往经常使用的是中科院的java
改良版(还是很慢)和c++版本的mmseg,由于使用的是自己家是windows平台的,所以只好用中科院的java改良
版。
1. 首先在org.carrot2.util.tokenizer.parser中新加一个分析器就叫KellyWordSplit:
package org.carrot2.util.tokenizer.parser;
import org.apache.lucene.analysis.ictcals.FMNM;
import org.carrot2.util.tokenizer.parser.jflex.PreprocessedJFlexWordBasedParserBase;
public class KellyWordSplit extends PreprocessedJFlexWordBasedParserBase {
//public Segment seg = null;
public KellyWordSplit() {
// try {
// seg = new Segment(1, new File(".").getCanonicalPath()
// + File.separator+"dic"+File.separator);
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
@Override
public String preprocess(String input) {
System.out.println("cut:"+input);
return FMNM.ICTCLASCut(input) ;
}
}
然后再在这个包中建立一个解析工厂:ICTCALWordBasedParserFactory
package org.carrot2.util.tokenizer.parser;
import org.apache.commons.pool.BasePoolableObjectFactory;
import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.impl.SoftReferenceObjectPool;
public class ICTCALWordBasedParserFactory {
/** Chinese tokenizer factory */
public static final ICTCALWordBasedParserFactory ChineseSimplified = new
KellyICTCALWordBasedParserFactory();
/** Parser pool */
protected ObjectPool parserPool;
/** No public constructor */
private ICTCALWordBasedParserFactory() {
// No public constructor
}
public WordBasedParserBase borrowParser() {
try {
parserPool.returnObject(parser);
} catch (Exception e) {
throw new RuntimeException("Cannot return a parser", e);
}
}
/**
* @author Stanislaw Osinski
* @version $Revision: 2122 $
*/
private static class KellyICTCALWordBasedParserFactory extends
ICTCALWordBasedParserFactory {
public KellyICTCALWordBasedParserFactory() {
parserPool = new SoftReferenceObjectPool(
new BasePoolableObjectFactory() {
public Object makeObject() throws Exception {
return new KellyWordSplit();
}
});
}
}
}
现在准备着手写一个真正意义上的聚类搜素了。一开始担心老外的carrot2对中文会进行“歧视”,后来发现原
来carrot2还是比较重视中文的,在有一个
org.carrot2.filter.lingo.local.ChineseLingoLocalFilterComponent的类,专门用来为中文提供分词操作。
再次往下细看,底层的分词造作在org.carrot2.util.tokenizer.parser.jflex.JeZHWordSplit中实现的,采用
的是基于lucene的MMAnalyer 。我没有使用过这种分词器,不知道它的消歧机制和切分效率如何,于是想拿经
常使用的分词器来做个比较。于是,必须建立一个自己的中文filter组建。 以往经常使用的是中科院的java
改良版(还是很慢)和c++版本的mmseg,由于使用的是自己家是windows平台的,所以只好用中科院的java改良
版。
1. 首先在org.carrot2.util.tokenizer.parser中新加一个分析器就叫KellyWordSplit:
package org.carrot2.util.tokenizer.parser;
import org.apache.lucene.analysis.ictcals.FMNM;
import org.carrot2.util.tokenizer.parser.jflex.PreprocessedJFlexWordBasedParserBase;
public class KellyWordSplit extends PreprocessedJFlexWordBasedParserBase {
//public Segment seg = null;
public KellyWordSplit() {
// try {
// seg = new Segment(1, new File(".").getCanonicalPath()
// + File.separator+"dic"+File.separator);
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
@Override
public String preprocess(String input) {
System.out.println("cut:"+input);
return FMNM.ICTCLASCut(input) ;
}
}
然后再在这个包中建立一个解析工厂:ICTCALWordBasedParserFactory
package org.carrot2.util.tokenizer.parser;
import org.apache.commons.pool.BasePoolableObjectFactory;
import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.impl.SoftReferenceObjectPool;
public class ICTCALWordBasedParserFactory {
/** Chinese tokenizer factory */
public static final ICTCALWordBasedParserFactory ChineseSimplified = new
KellyICTCALWordBasedParserFactory();
/** Parser pool */
protected ObjectPool parserPool;
/** No public constructor */
private ICTCALWordBasedParserFactory() {
// No public constructor
}
public WordBasedParserBase borrowParser() {
try {
parserPool.returnObject(parser);
} catch (Exception e) {
throw new RuntimeException("Cannot return a parser", e);
}
}
/**
* @author Stanislaw Osinski
* @version $Revision: 2122 $
*/
private static class KellyICTCALWordBasedParserFactory extends
ICTCALWordBasedParserFactory {
public KellyICTCALWordBasedParserFactory() {
parserPool = new SoftReferenceObjectPool(
new BasePoolableObjectFactory() {
public Object makeObject() throws Exception {
return new KellyWordSplit();
}
});
}
}
}