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

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

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

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

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

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

Редактировать 2: есть пакет R для N-GRAMS?

7 ответов

Если вы хотите использовать R чтобы определить нграмм, вы можете использовать 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

шапка: http://tm.r-forge.r-project.org/faq.html

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

ngram: болтун n-граммы

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

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

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

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

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

 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

Ура!

РЕДАКТИРОВАТЬ: Извините, это PHP. Я не был уверен, что ты хотел. Я не знаю это в Java, но, возможно, следующее может быть преобразовано достаточно легко.

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

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

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

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

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;
}

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

Вы можете использовать пакет Ngram. Одним из примеров его использования является http://amunategui.github.io/speak-like-a-doctor/

Простой вот ответ Java:

int ngrams = 9;// let's say 9-grams since it's the length of "bonasuera"... 
String string = "bonasuera";
for (int j=1; j <= ngrams;j++) {    
    for (int k=0; k < string.length()-j+1;k++ )
        System.out.print(string.substring(k,k+j) + " ");
    System.out.println();
}

выход:

b o n a s u e r a 
bo on na as su ue er ra 
bon ona nas asu sue uer era 
bona onas nasu asue suer uera 
bonas onasu nasue asuer suera 
bonasu onasue nasuer asuera 
bonasue onasuer nasuera 
bonasuer onasuera 
bonasuera 

Посмотрите на https://cran.r-project.org/web/packages/ngram/vignettes/ngram-guide.pdf

Вот быстрый пример. Это довольно быстрый взгляд на эталон виньетки.

require(ngram)

"hi i am ig" %>% ngram(n = 2) %>% get.ngrams()
Другие вопросы по тегам