ある種のテキストストリームの「翻訳」を実行しようとしています。具体的には、入力ストリームをトークン化し、専門辞書ですべての用語を検索し、トークンの対応する「翻訳」を出力する必要があります。ただし、出力が翻訳のストリームになるのではなく、入力と同じ方法でフォーマットされるように、入力からすべての元の空白、ストップワードなども保持したいと思います。だから私の入力が
Term1:Term2ストップワード!Term3 Term4
次に、出力を次のように表示します
Term1':Term2'ストップワード!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)
{
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;
}