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

Какой алгоритм мне нужно найти n-граммы?

Какой алгоритм используется для поиска ngrams?

Предположим, что мои входные данные - это массив слов и размер ngrams, которые я хочу найти, какой алгоритм я должен использовать?

Я прошу код с предпочтением R. Данные хранятся в базе данных, поэтому также может быть функцией plgpsql. Java - это язык, который я знаю лучше, поэтому я могу "перевести" его на другой язык.

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

Изменить: важно знать, сколько раз появляется каждый n-грамм.

Изменить 2: есть R-пакет для N-GRAMS?

4b9b3361

Ответ 1

Если вы хотите использовать R для идентификации ngrams, вы можете использовать пакет tm и пакет RWeka. Он расскажет вам, сколько раз ngram происходит в ваших документах, например:

  library("RWeka")
  library("tm")

  data("crude")

  BigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 2, max = 2))
  tdm <- TermDocumentMatrix(crude, control = list(tokenize = BigramTokenizer))

  inspect(tdm[340:345,1:10])

A term-document matrix (6 terms, 10 documents)

Non-/sparse entries: 4/56
Sparsity           : 93%
Maximal term length: 13 
Weighting          : term frequency (tf)

               Docs
Terms           127 144 191 194 211 236 237 242 246 248
  and said        0   0   0   0   0   0   0   0   0   0
  and security    0   0   0   0   0   0   0   0   1   0
  and set         0   1   0   0   0   0   0   0   0   0
  and six-month   0   0   0   0   0   0   0   1   0   0
  and some        0   0   0   0   0   0   0   0   0   0
  and stabilise   0   0   0   0   0   0   0   0   0   1

hat-tip: http://tm.r-forge.r-project.org/faq.html

Ответ 2

Для всех, кто по-прежнему интересуется этой темой, уже есть пакет на кране.

ngram: n-gram Babbler

В этом пакете содержатся утилиты для создания, отображения и "болтовни" n-граммов. Бабблер - простой марковский процесс.

http://cran.r-project.org/web/packages/ngram/index.html

Ответ 3

Обычно n-граммы рассчитываются для нахождения его частотного распределения. Итак, да, важно, сколько раз появляются n-граммы.

Также вы хотите ввести n-грамм уровня или n-грамм уровня слова. Я написал код для нахождения n-грамма уровня символа из файла csv в r. Для этого я использовал пакет "tau". Вы можете найти здесь здесь.

Также вот код, который я написал:

 library(tau)
temp<-read.csv("/home/aravi/Documents/sample/csv/ex.csv",header=FALSE,stringsAsFactors=F)
r<-textcnt(temp, method="ngram",n=4L,split = "[[:space:][:punct:]]+", decreasing=TRUE)
a<-data.frame(counts = unclass(r), size = nchar(names(r)))
b<-split(a,a$size)
b

Ура!

Ответ 4

EDIT: Извините, это PHP. Я не был уверен, что ты хочешь. Я не знаю этого в java, но, возможно, следующее может быть легко преобразовано.

Ну, это зависит от размера нужных вам нграмм.

У меня был довольно большой успех с единственными буквами (особенно точными для определения языка), с которыми легко справиться:

$letters=str_split(preg_replace('/[^a-z]/', '', strtolower($text)));
$letters=array_count_values($letters);

Тогда для вычисления ngrams из слова существует следующая функция:

function getNgrams($word, $n = 3) {
        $ngrams = array();
        $len = strlen($word);
        for($i = 0; $i < $len; $i++) {
                if($i > ($n - 2)) {
                        $ng = '';
                        for($j = $n-1; $j >= 0; $j--) {
                                $ng .= $word[$i-$j];
                        }
                        $ngrams[] = $ng;
                }
        }
        return $ngrams;
}

Источник выше здесь, который я рекомендую вам прочитать, и у них есть много функций, которые нужно делать именно так, как вы хотите.