例えば、「私はRを勉強しています」という文章があったとして、N=1(uni-gram)ならば、各文字が一つずつ出現することが得られます。N=2(bi-gram)ならば、「私は」「はR」「Rを」というように、2文字の組みで出現することを得ます。この文字の組は、共起関係と言います。この共起関係がどの程度の頻度で出現するかを調べたのが、共起頻度です。で、共起頻度がわかると、何が嬉しいかが問題ですよね。例えば、共起頻度を調べて文書の性質を見つけたり、ある文字列の直後に来やすい文字列を求めたり、音声認識なんかで訂正するときの情報として利用したりします。
では、RでN-gramを実行してみましょう。例文として、前回読み込んだ「風の又三郎」「セロ弾きのゴーシュ」「注文の多い料理店」を使います。フォルダ「NORUBY」の中に「kazeno_matasaburo2.txt」などのファイルが置いてあるものとします。このテキストファイルがない、という方は、前回までの「Rあれこれ」を見てご用意下さい。
> library(RMeCab)
> ngr1 <- Ngram("NORUBY/kazeno_matasaburo2.txt", type = 1)
file = NORUBY/kazeno_matasaburo2.txt Ngram = 2
length = 3967
> head(ngr1)
Ngram Freq
1 [あい-あいだ] 1
2 [あい-そこ] 1
3 [あい-づあ] 1
4 [あい-づやっぱり] 1
5 [あい-一郎] 1
6 [あい-嘉助] 1
>
Ngramという関数が、N-gramを求めるものです。第1引数はファイル名で、第2引数が形態素のN-gramを求めることを指定しています。もし、第2引数を省略すると、文字の間のNgramを求めることになります。Ngram = 2 と表示されていますように、bi-gramを求めています。
関数Ngramでは[あい-一郎]というように、形態素の組で表示されました。形態素ごとに分けて表示したい場合、関数NgramDFを使います。
> ngr2 <- NgramDF("NORUBY/kazeno_matasaburo2.txt", type = 1, pos = "名詞")
file = NORUBY/kazeno_matasaburo2.txt Ngram = 2
> head(ngr2)
Ngram1 Ngram2 Freq
1 あい あいだ 1
2 あい そこ 1
3 あい づあ 1
4 あい づやっぱり 1
5 あい 一郎 1
6 あい 嘉助 1
>
pos = "名詞"というのは、「名詞」だけ抽出しているということです。これを指定しないと、名詞と形容詞の形態素が抽出されます。
関数NgramDF2を使えば、第1引数にフォルダを指定してその中に含まれるファイルをすべて対象にできます。引数minFreqは、頻度の最低値を指定します。
> ngr3 <- NgramDF2("NORUBY", type = 1, pos = "名詞", minFreq=2)
file_name = NORUBY/chumonno_oi_ryoriten2.txt opened
file_name = NORUBY/kazeno_matasaburo2.txt opened
file_name = NORUBY/serohikino_goshu2.txt opened
number of extracted terms = 727
> head(ngr3)
Ngram1 Ngram2 chumonno_oi_ryoriten2.txt kazeno_matasaburo2.txt serohikino_goshu2.txt
1 あいつ 風 0 2 0
2 あっち こっち 0 3 0
3 あと あと 0 2 0
4 あと だい 0 3 0
5 あと よう 0 0 2
6 あと 一 0 2 0
>
結果を見ると、「風の又三郎」「セロ弾きのゴーシュ」「注文の多い料理店」では隣接する単語の組がまったく違っています。まあ、当然と言えば当然ですが、この違いは作品の特徴の一つの指標と考えることができます。つまり、その文書の特徴を表すキーワードというわけです。逆に、3つの作品に共通する単語の組が抽出できれば、その作者特有のキーワードが抽出できるかも知れません。注意しなければいけないのは、文書に含まれる文字数が文書によって違っているという点です。比較するなら、頻度を正規化する操作が必要でしょうね。
0 件のコメント:
コメントを投稿