什么算法用于查找 ngram?
假设我的输入数据是一个单词数组和我想找到的 ngram 的大小,我应该使用什么算法?
我要求代码,优先考虑 R。数据存储在数据库中,因此也可以是 plgpsql 函数。Java 是一种我更了解的语言,所以我可以将它“翻译”成另一种语言。
我并不懒惰,我只是要求代码,因为我不想重新发明轮子试图做一个已经完成的算法。
编辑:重要的是要知道每个 n-gram 出现了多少次。
编辑 2:N-GRAMS 有一个 R 包吗?
如果你想用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
对于仍然对此主题感兴趣的任何人,起重机上已经有一个包。
ngram:一个 n-gram Babbler
该软件包提供了用于创建、显示和“乱码”n-gram 的实用程序。babbler 是一个简单的马尔可夫过程。
通常计算 n-gram 以找到其频率分布。所以是的,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中不知道它,但也许以下内容可以很容易地转换。
好吧,这取决于您想要的 ngram 的大小。
我在单个字母方面取得了很大的成功(对于语言检测尤其准确),这很容易获得:
$letters=str_split(preg_replace('/[^a-z]/', '', strtolower($text)));
$letters=array_count_values($letters);
然后有以下函数用于从单词计算 ngram:
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;
}
以上内容的来源在这里,我建议您阅读,它们有很多功能可以完全按照您的意愿行事。
简单的继承人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()
您可以使用 ngram 包。其用法的一个示例是http://amunategui.github.io/speak-like-a-doctor/