【发布时间】:2020-03-21 01:25:39
【问题描述】:
我正在尝试使用apache Lucene 5.5.4 为给定的集合输入文本生成 N-gram。以下是我的 java 代码来做同样的事情。
public static void main( String[] args )
{
Analyzer analyzer = createAnalyzer( 2 );
List<String> nGrams = generateNgrams( analyzer, "blah1 blah2 blah3" );
for ( String nGram : nGrams ) {
System.out.println( nGram );
}
}
public static Analyzer createAnalyzer( final int shingles )
{
return new Analyzer() {
@Override
protected TokenStreamComponents createComponents( @NotNull String field )
{
final Tokenizer source = new WhitespaceTokenizer();
final ShingleFilter shingleFilter = new ShingleFilter( new LowerCaseFilter( source ), shingles );
shingleFilter.setOutputUnigrams( true );
return new TokenStreamComponents( source, shingleFilter );
}
};
}
public static List<String> generateNgrams( Analyzer analyzer, String str )
{
List<String> result = new ArrayList<>();
try {
TokenStream stream = analyzer.tokenStream( null, new StringReader( str ) );
stream.reset();
while ( stream.incrementToken() ) {
String nGram = stream.getAttribute( CharTermAttribute.class ).toString();
result.add( nGram );
LOG.debug( "Generated N-gram = {}", nGram );
}
} catch ( IOException e ) {
LOG.error( "IO Exception occured! {}", e );
}
return result;
}
对于我的输入blah1 blah2 blah3,输出如下,我可以接受。
废话1
废话1废话2
废话2
废话2废话3
废话3
但是,当输入为Foo bar Foo2时,我的要求是生成以下输出:
FooFoo barbarbar Foo2Foo2
如果你注意到了,我必须保留两个单词之间的空格,因为它在输入中。(Foo bar 而不是Foo bar)。
我可以进行任何调整并让 lucene 在内部处理它吗?
可能是它的一个小调整,比如添加过滤器或其他东西,因为我是 Lucene 的新手,我不知道从哪里开始。 提前致谢。
【问题讨论】:
标签: indexing lucene tokenize n-gram