Wie benutzt ich einen Lucene -Analysator, um eine Zeichenfolge zu token?
Frage
Gibt es eine einfache Möglichkeit, eine Unterklasse von Lucene zu verwenden? Analyzer
analysieren/tokene a String
?
Etwas wie:
String to_be_parsed = "car window seven";
Analyzer analyzer = new StandardAnalyzer(...);
List<String> tokenized_string = analyzer.analyze(to_be_parsed);
Lösung
Soweit ich weiß, müssen Sie die Schleife selbst schreiben. So etwas (direkt aus meinem Quellbaum genommen):
public final class LuceneUtils {
public static List<String> parseKeywords(Analyzer analyzer, String field, String keywords) {
List<String> result = new ArrayList<String>();
TokenStream stream = analyzer.tokenStream(field, new StringReader(keywords));
try {
while(stream.incrementToken()) {
result.add(stream.getAttribute(TermAttribute.class).term());
}
}
catch(IOException e) {
// not thrown b/c we're using a string reader...
}
return result;
}
}
Andere Tipps
Basierend auf der obigen Antwort ist dies leicht modifiziert, um mit Lucene 4.0 zu arbeiten.
public final class LuceneUtil {
private LuceneUtil() {}
public static List<String> tokenizeString(Analyzer analyzer, String string) {
List<String> result = new ArrayList<String>();
try {
TokenStream stream = analyzer.tokenStream(null, new StringReader(string));
stream.reset();
while (stream.incrementToken()) {
result.add(stream.getAttribute(CharTermAttribute.class).toString());
}
} catch (IOException e) {
// not thrown b/c we're using a string reader...
throw new RuntimeException(e);
}
return result;
}
}
Noch besser durch Verwendung von Try-with-Ressources! Auf diese Weise müssen Sie nicht explizit anrufen .close()
Dies ist in höheren Versionen der Bibliothek erforderlich.
public static List<String> tokenizeString(Analyzer analyzer, String string) {
List<String> tokens = new ArrayList<>();
try (TokenStream tokenStream = analyzer.tokenStream(null, new StringReader(string))) {
tokenStream.reset(); // required
while (tokenStream.incrementToken()) {
tokens.add(tokenStream.getAttribute(CharTermAttribute.class).toString());
}
} catch (IOException e) {
new RuntimeException(e); // Shouldn't happen...
}
return tokens;
}
Und die Tokenizer -Version:
try (Tokenizer standardTokenizer = new HMMChineseTokenizer()) {
standardTokenizer.setReader(new StringReader("我说汉语说得很好"));
standardTokenizer.reset();
while(standardTokenizer.incrementToken()) {
standardTokenizer.getAttribute(CharTermAttribute.class).toString());
}
} catch (IOException e) {
new RuntimeException(e); // Shouldn't happen...
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow