【发布时间】:2012-02-09 21:06:28
【问题描述】:
我正在尝试对各种文本流进行“翻译”。更具体地说,我需要对输入流进行标记,在专门的字典中查找每个术语并输出标记的相应“翻译”。但是,我还想保留输入中的所有原始空格、停用词等,以便输出以与输入相同的方式格式化,而不是最终成为翻译流。所以如果我的输入是
Term1:Term2 停用词!第三学期 第四学期
然后我希望输出看起来像
Term1': Term2' 停用词!第三学期' 第四学期'
(其中 Termi' 是 Termi 的翻译)而不是简单的
Term1' Term2' Term3' Term4'
目前我正在做以下事情:
PatternAnalyzer pa = new PatternAnalyzer(Version.LUCENE_31,
PatternAnalyzer.WHITESPACE_PATTERN,
false,
WordlistLoader.getWordSet(new File(stopWordFilePath)));
TokenStream ts = pa.tokenStream(null, in);
CharTermAttribute charTermAttribute = ts.getAttribute(CharTermAttribute.class);
while (ts.incrementToken()) { // loop over tokens
String termIn = charTermAttribute.toString();
...
}
但是,这当然会丢失所有空格等。如何修改它以便能够将它们重新插入输出中?非常感谢!
============更新!
我尝试将原始流拆分为“单词”和“非单词”。它似乎工作正常。不过,不确定这是否是最有效的方法:
public ArrayList splitToWords(String sIn)
{
if (sIn == null || sIn.length() == 0) {
return null;
}
char[] c = sIn.toCharArray();
ArrayList<Token> list = new ArrayList<Token>();
int tokenStart = 0;
boolean curIsLetter = Character.isLetter(c[tokenStart]);
for (int pos = tokenStart + 1; pos < c.length; pos++) {
boolean newIsLetter = Character.isLetter(c[pos]);
if (newIsLetter == curIsLetter) {
continue;
}
TokenType type = TokenType.NONWORD;
if (curIsLetter == true)
{
type = TokenType.WORD;
}
list.add(new Token(new String(c, tokenStart, pos - tokenStart),type));
tokenStart = pos;
curIsLetter = newIsLetter;
}
TokenType type = TokenType.NONWORD;
if (curIsLetter == true)
{
type = TokenType.WORD;
}
list.add(new Token(new String(c, tokenStart, c.length - tokenStart),type));
return list;
}
【问题讨论】:
-
你在翻译一段文字,但这与 Lucene 有什么关系?!
-
@milan 实际翻译是通过搜索由 Lucene 索引的字典完成的
-
我对任何生成带有“缺失标记”的标记流的标记器进行了包装。它是一个更大的项目的一部分,还没有开源,所以如果你想要的话,请告诉我。
标签: lucene tokenize stop-words