如何找到N-grams?
假设我的输入数据是一个单词数组,我想要找到的N-grams的大小是多少,则应使用什么算法?
我需要代码,并希望使用R语言。数据存储在数据库中,因此也可以是plgpsql函数。 Java是我比较熟悉的语言,所以我可以将其“转换”为另一种语言。
我不是懒,只是希望得到代码,因为我不想重新发明轮子,尝试做已经完成的算法。
编辑:重要的是知道每个N-gram出现的次数。
编辑2:是否有R包可以处理N-GRAMS?
如果您想使用R
识别ngram,可以使用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
对于仍然对此话题感兴趣的人,cran上已经有一个包了。
ngram: 一个n-gram Babbler
此包提供了用于创建、显示和“babbling” n-grams的实用工具。Babbler是一个简单的马尔可夫过程。
通常计算n-grams以查找其频率分布。因此,n-gram出现的次数确实很重要。
您还想要字符级别的n-gram或单词级别的n-gram。我编写了一段代码,在r中从csv文件中查找字符级别n-gram。我使用了包“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
干杯!
编辑:抱歉,这是PHP。我不太确定你想要什么。我不知道Java中的情况,但以下内容可能很容易转换。
好吧,这取决于您想要的ngrams的大小。
我在单个字母方面取得了相当大的成功(特别适用于语言检测),可以使用以下简单方法获得:
$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;
}
请查看https://cran.r-project.org/web/packages/ngram/vignettes/ngram-guide.pdf。
这里有一个快速的例子。根据vignette的基准测试,它非常快。
require(ngram)
"hi i am ig" %>% ngram(n = 2) %>% get.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
tm
)和一个textcat
包...library("sos"); findFn("n-gram")
。 - Ben Bolker