Самый простой способ или самая легкая библиотека для получения биграмм и триграмм в Java? - PullRequest
3 голосов
/ 27 сентября 2010

Я бы предпочел не запускать лингпайп, если это возможно, что заставляет меня задуматься, есть ли в Java быстрые и простые способы извлечь все биграммы и триграммы из строки текста?

спасибо

Ответы [ 3 ]

3 голосов
/ 07 сентября 2014
public class NGramIterator implements Iterator<String> {

    String[] words;
    int pos = 0, n;

    public NGramIterator(int n, String str) {
        this.n = n;
        words = str.split(" ");
    }

    public boolean hasNext() {
        return pos < words.length - n + 1;
    }

    public String next() {
        StringBuilder sb = new StringBuilder();
        for (int i = pos; i < pos + n; i++)
            sb.append((i > pos ? " " : "") + words[i]);
        pos++;
        return sb.toString();
    }

    public void remove() {
        throw new UnsupportedOperationException();
    }
}
2 голосов
/ 01 февраля 2019

решение для биграмм

Строка str инициализируется словами «Я являюсь образцом строки и буду размечена в пространстве».Затем строка разбивается на токены с помощью StringTokenizer, который возвращает массив строк, например «I», «am», «sample» и т. Д. *

. Проверяется, чтобы массив строк содержал как минимум 2слова, так как слово не может сделать биграмм.Итак, вы перебираете массив строк, , если это первый раз, проходящий через цикл while, строка s1 инициализируется первым элементом в массиве строк.Затем строка s2 инициализируется вторым элементом в массиве, а s1 и s2 объединяются в форму s3, которая помещается в arrayList.

s1 = "I"; s2 = "am" s3 = s1 + " " + s2; //makes s3 = "I am"

После этого значение, которое было в s2, устанавливается в s1, а в s2 устанавливается пустая строка.Это заставляет последний (второй) элемент в биграмме перемещаться в первую позицию, освобождая место для другого элемента, чтобы занять s2 в следующей итерации.Теперь, когда вы перебираете массив остальных значений, только s2 будет присвоено значение.

import java.util.*;

class Test
{
    public static void main(String [] args)
    {
        String str = "I am sample string and will be tokenized on space";
        ArrayList<String> bigrams = new ArrayList<String>();
        StringTokenizer itr = new StringTokenizer(str);
        if(itr.countTokens() > 1)
        {
            System.out.println("String array size : " + itr.countTokens());
            String s1 = "";
            String s2 = "";
            String s3 = "";
            while (itr.hasMoreTokens())
            {
                if(s1.isEmpty())
                    s1 = itr.nextToken();
                s2 = itr.nextToken();
                s3 = s1 + " " + s2;
                bigrams.add(s3);
                s1 = s2;
                s2 = "";
            }

        }
        else
            System.out.println("Tokens is 1 or 0");
        int i = 0;
        while (i < bigrams.size()) 
        {
            System.out.println(bigrams.get(i));
            i++;
        }
    }
}
0 голосов
/ 30 сентября 2010

Всегда самый простой способ - использовать существующую библиотеку. Вы можете взглянуть на библиотеку simmetrics . Вы также можете использовать Lucene NgramTokenizer . Вы также можете реализовать этот алгоритм самостоятельно. Во-первых, вы должны найти все слова (используя StringTokenizer ) в тексте, а затем сгенерировать n-грамм вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...