Java Lucene NGramTokenizer
Я пытаюсь инициализировать строки в ngrams. Странно в документации для NGramTokenizer Я не вижу метода, который будет возвращать отдельные ngrams, которые были маркированы. На самом деле, я вижу только два метода в классе NGramTokenizer, которые возвращают String Objects.
Вот код, который у меня есть:
Reader reader = new StringReader("This is a test string");
NGramTokenizer gramTokenizer = new NGramTokenizer(reader, 1, 3);
- Где обозначены ngrams?
- Как я могу получить результат в строках/словах?
Я хочу, чтобы мой вывод выглядел следующим образом: This, is, a, test, string, This is, a, test, test string. Это тест, тестовая строка.
Ответы
Ответ 1
Я не думаю, что вы найдете то, что ищете, пытаясь найти методы, возвращающие String. Вам нужно будет иметь дело с Attribute s.
Должно работать что-то вроде:
Reader reader = new StringReader("This is a test string");
NGramTokenizer gramTokenizer = new NGramTokenizer(reader, 1, 3);
CharTermAttribute charTermAttribute = gramTokenizer.addAttribute(CharTermAttribute.class);
gramTokenizer.reset();
while (gramTokenizer.incrementToken()) {
String token = charTermAttribute.toString();
//Do something
}
gramTokenizer.end();
gramTokenizer.close();
Обязательно reset() Tokenizer, если это необходимо повторить после этого.
Обозначение группировки слов, а не символов, для комментариев:
Reader reader = new StringReader("This is a test string");
TokenStream tokenizer = new StandardTokenizer(Version.LUCENE_36, reader);
tokenizer = new ShingleFilter(tokenizer, 1, 3);
CharTermAttribute charTermAttribute = tokenizer.addAttribute(CharTermAttribute.class);
while (tokenizer.incrementToken()) {
String token = charTermAttribute.toString();
//Do something
}
Ответ 2
Для последней версии Lucene (4.2.1) это чистый код, который работает. Перед выполнением этого кода вам необходимо импортировать 2 файла jar:
- Lucene-ядро-4.2.1.jar
- Lucene-analuzers-синфазного 4.2.1.jar
Найти эти файлы в http://www.apache.org/dyn/closer.cgi/lucene/java/4.2.1
//LUCENE 4.2.1
Reader reader = new StringReader("This is a test string");
NGramTokenizer gramTokenizer = new NGramTokenizer(reader, 1, 3);
CharTermAttribute charTermAttribute = gramTokenizer.addAttribute(CharTermAttribute.class);
while (gramTokenizer.incrementToken()) {
String token = charTermAttribute.toString();
System.out.println(token);
}
Ответ 3
Не создавая тестовую программу, я бы предположил, что incrementToken() возвращает следующий токен, который будет одним из ngrams.
Например, используя ngram lengths 1-3 со строкой 'a b c d', NGramTokenizer может вернуть:
a
a b
a b c
b
b c
b c d
c
c d
d
где 'a', 'a b' и т.д. являются результирующими ngrams.
[изменить]
Вы также можете посмотреть запрос маркеров lucene без индексирования, поскольку он говорит о том, чтобы заглянуть в поток токенов.
Ответ 4
пакет ngramalgoimpl;
import java.util. *;
public class ngr {
public static List<String> n_grams(int n, String str) {
List<String> n_grams = new ArrayList<String>();
String[] words = str.split(" ");
for (int i = 0; i < words.length - n + 1; i++)
n_grams.add(concatination(words, i, i+n));
return n_grams;
}
/*stringBuilder is used to cancatinate mutable sequence of characters*/
public static String concatination(String[] words, int start, int end) {
StringBuilder sb = new StringBuilder();
for (int i = start; i < end; i++)
sb.append((i > start ? " " : "") + words[i]);
return sb.toString();
}
public static void main(String[] args) {
for (int n = 1; n <= 3; n++) {
for (String ngram : n_grams(n, "This is my car."))
System.out.println(ngram);
System.out.println();
}
}
}