我需要什么算法才能找到n-gram?

时间:2011-11-17 01:53:43

标签: r n-gram

使用什么算法查找ngrams?

假设我的输入数据是一个单词数组和我想要找到的ngram的大小,我应该使用什么算法?

我要求代码,优先选择R.数据存储在数据库中,因此也可以是plgpsql函数。 Java是我更熟悉的语言,因此我可以将其“翻译”为另一种语言。

我不是懒惰,我只是要求代码,因为我不想重新发明轮子试图做一个已经完成的算法。

修改:了解每个n-gram出现的次数非常重要。

编辑2:N-GRAMS有一个R包吗?

7 个答案:

答案 0 :(得分:24)

如果您想使用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

帽子提示:http://tm.r-forge.r-project.org/faq.html

答案 1 :(得分:8)

对于仍然对这个主题感兴趣的人,已经有了一个包裹。

ngram:一个n-gram Babbler

该软件包提供了用于创建,显示和“唠叨”n-gram的实用程序。说话者是一个简单的马尔可夫过程。

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

答案 2 :(得分:2)

通常计算n-gram以找到其频率分布。是的,n-gram出现的次数确实很重要。

您还需要字符级n-gram或字级n-gram。我编写了一个代码,用于从r中的csv文件中查找字符级别n-gram。我使用了包'tau'。你可以找到它here

这里是我写的代码:

 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

干杯!

答案 3 :(得分:1)

编辑:对不起,这是PHP。我不太确定你想要什么。我不知道它在java中,但也许以下内容可以很容易地转换。

这取决于你想要的ngram的大小。

我用单个字母(特别是语言检测准确)获得了很多成功,这很容易获得:

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

上面的内容是here,我建议您阅读,它们有很多功能可以完全按照您的意愿进行。

答案 4 :(得分:0)

您可以使用ngram包。其用法的一个示例是http://amunategui.github.io/speak-like-a-doctor/

答案 5 :(得分:0)

查看https://cran.r-project.org/web/packages/ngram/vignettes/ngram-guide.pdf

这是一个简单的例子。它很快就看到了小插曲的基准。

require(ngram)

"hi i am ig" %>% ngram(n = 2) %>% get.ngrams()

答案 6 :(得分:0)

简单的继承人的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