Я пытаюсь выполнить «перевод» своего рода потока текста.Более конкретно, мне нужно токенизировать входной поток, найти каждый термин в специализированном словаре и вывести соответствующий «перевод» токена.Однако я также хочу сохранить все исходные пробелы, стоп-слова и т. Д. Из входных данных, чтобы выходные данные форматировались так же, как входные, вместо того, чтобы в конечном итоге быть потоком переводов.Так что, если мой ввод
Term1: Term2 Stopword!Term3 Term4
тогда я хочу, чтобы результат выглядел как
Term1 ': Term2' Stopword!Term3 'Term4'
(где 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)
{</p>
<pre><code>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;
}