Какой алгоритм мне нужен, чтобы найти n-грамм? - PullRequest
14 голосов
/ 17 ноября 2011

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

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

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

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

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

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

Ответы [ 7 ]

24 голосов
/ 12 апреля 2013

Если вы хотите использовать 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

8 голосов
/ 08 октября 2014

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

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

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

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

2 голосов
/ 19 июля 2013

Обычно 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

Приветствия!

1 голос
/ 17 ноября 2011

РЕДАКТИРОВАТЬ: Извините, это 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;
}

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

0 голосов
/ 29 ноября 2018

Простой вот ответ 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 
0 голосов
/ 26 февраля 2017

Взгляните на https://cran.r -project.org / web / packages / ngram / vignettes / ngram-guide.pdf

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

require(ngram)

"hi i am ig" %>% ngram(n = 2) %>% get.ngrams()
0 голосов
/ 31 марта 2016

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

...