web-dev-qa-db-ja.com

n-gramを見つけるために必要なアルゴリズムは何ですか?

Ngramを見つけるためにどのアルゴリズムが使用されていますか?

入力データが単語の配列と検索したいngramのサイズであるとすると、どのアルゴリズムを使用する必要がありますか?

Rを優先してコードを要求しています。データはデータベースに保存されるため、plgpsql関数にすることもできます。 Javaは私がよく知っている言語なので、別の言語に「翻訳」できます。

私は怠惰ではありません。すでに実行されているアルゴリズムを実行しようとして車輪の再発明をしたくないので、コードを要求しているだけです。

編集:各n-gramが何回表示されるかを知ることが重要です。

編集2:N-GRAMS用のRパッケージはありますか?

14
Renato Dinhani

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

帽子のヒント: http://tm.r-forge.r-project.org/faq.html

24
Ben

このトピックにまだ興味がある人のために、すでに一族にパッケージがあります。

ngram:n-gramバブラー

このパッケージは、n-gramを作成、表示、および「バブリング」するためのユーティリティを提供します。バブラーは単純なマルコフ過程です。

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

8
IceBruce

通常、n-gramは、度数分布を見つけるために計算されます。そうです、n-gramが何回現れるかは重要です。

また、文字レベルのn-gramまたは単語レベルのn-gramが必要です。 rのcsvファイルから文字レベルのn-gramを見つけるためのコードを書きました。そのためにパッケージ「タウ」を使用しました。あなたはそれを見つけることができます ここ

また、私が書いたコードは次のとおりです。

 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

乾杯!

2
Aravind Asok

編集:申し訳ありませんが、これはPHPです。何が欲しいのかよくわかりませんでした。 Javaではわかりませんが、おそらく次のように簡単に変換できます。

まあそれはあなたが望むngramのサイズに依存します。

私は1文字(特に言語検出に正確)でかなりの成功を収めてきました。これは次の方法で簡単に取得できます。

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

次に、Wordから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;
}

上記のソースは ここ です。これを読むことをお勧めします。これらには、必要なことを正確に実行するための関数がたくさんあります。

1
Alasdair

Ngramパッケージを使用できます。その使用法の一例は http://amunategui.github.io/speak-like-a-doctor/

0
Niru

ご覧ください https://cran.r-project.org/web/packages/ngram/vignettes/ngram-guide.pdf

これが簡単な例です。ビネットのベンチマークをすばやく確認できます。

require(ngram)

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

簡単なここに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
user9077699