我正在嘗試執行各種文本流的「翻譯」。更具體地說,我需要標記輸入流,查找專用字典中的每個術語並輸出令牌的相應「翻譯」。但是,我還想保留輸入中的所有原始空格,停用詞等,以便輸出的格式與輸入相同,而不是最終成爲翻譯流。所以如果我的輸入是Lucene:如何在標記流時保留空格等?
Term1:Term2停用詞! TERM3 Term4
那麼我想輸出看起來像
起租1 ':詞條2' 停用詞! TERM3' Term4'
(其中TERMI」是TERMI翻譯),而不是簡單地
起租1' 詞條2' 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();
...
}
但這當然失去了一切espaces等。我怎樣才能修改這個能夠重新插入到輸出中?非常感謝!
============更新!
我嘗試將原始流拆分爲「單詞」和「非單詞」。它似乎工作正常。不能確定它是否是最有效的方式,但:
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 2012-01-14 10:26:38
@milan實際的翻譯是通過搜索由Lucene索引的詞典完成的 – 2012-01-16 17:18:29
我做了一個包含任何標記生成器的包裝器,生成帶有「缺失標記」的標記流。它是尚未開源的更大項目的一部分,所以如果你需要的話,請糾正錯誤。 – fulmicoton 2015-04-24 01:24:32