Подтвердить что ты не робот

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. Это тест, тестовая строка.

4b9b3361

Ответ 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();
    }
}

}