2011-01-05 21 views
8

RのopenNLPパッケージで名詞+名詞または名詞+名詞を抽出することができるか照会したいですか?候補の名詞句を抽出するために言語フィルタリングを使用する。あなたは私に方法を指示できますか? 多くのありがとうございます。テキストから名詞+名詞または(adj |名詞)+名詞を抽出する


ありがとうございます。 +名詞extractation |

library("openNLP") 

acq <- "Gulf Applied Technologies Inc said it sold its subsidiaries engaged in 
     pipeline and terminal operations for 12.2 mln dlrs. The company said 
     the sale is subject to certain post closing adjustments, 
     which it did not explain. Reuter." 

acqTag <- tagPOS(acq)  
acqTagSplit = strsplit(acqTag," ") 
acqTagSplit 

qq = 0 
tag = 0 

for (i in 1:length(acqTagSplit[[1]])){ 
    qq[i] <-strsplit(acqTagSplit[[1]][i],'/') 
    tag[i] = qq[i][[1]][2] 
} 

index = 0 

k = 0 

for (i in 1:(length(acqTagSplit[[1]])-1)) { 

    if ((tag[i] == "NN" && tag[i+1] == "NN") | 
     (tag[i] == "NNS" && tag[i+1] == "NNS") | 
     (tag[i] == "NNS" && tag[i+1] == "NN") | 
     (tag[i] == "NN" && tag[i+1] == "NNS") | 
     (tag[i] == "JJ" && tag[i+1] == "NN") | 
     (tag[i] == "JJ" && tag[i+1] == "NNS")) 
    {  
      k = k +1 
      index[k] = i 
    } 

} 

index 

Readerが名詞+名詞かを(名詞ADJ)やってacqTagSplitインデックスを参照することができます。 はここのコードです。 (コードは最適ではありませんが、問題があれば教えてください)

さらに、私はまだ問題があります。

Justesonとカッツ(1995)は候補名詞句を抽出するために、別の言語フィルタリングを提案:

((ADJ |名詞)+ |((ADJ |名詞)(名詞プレップ))(ADJ |名詞? ))名詞

私はその意味をよく理解できません。あなたはそれを説明したり、そのような表現をR言語に変えたりする好意を私に与えてもらえますか? 多くのありがとうございます。

+1

私はクリーンなソリューションだと思っています。後のリクエストは元の質問のかなりの延長です。私はあなたがこれを閉じて別の質問をするべきだと思います。 –

+1

@DWin:そうは思いません。余分な条件を追加するだけです。さらに、それをRに翻訳することは、プログラマーにとってではなく、テキスト・マイナーにとっての質問になるでしょう。私は、その意味を理解するために、JustesonとKatzの記事を読んでみてください。 –

+1

@Joris:新しい演算子「+」と「?」がいくつかありました。私は理解していませんでした。私は彼らが正規表現に翻訳するかもしれないと思っていましたが、私には知られておらず、引用はWeb検索では利用できませんでした。だから私は元の質問が合理化のOPと私の努力の両方によって答えられて以来、再ポスティングはより良いアプローチであると思った。 –

答えて

3

可能です。

編集:

あなたはそれを持っています。スペース上でPOSタガーと分割を使用します:ll < - strsplit(acqTag、 '')。そこから入力リストの長さ(llの長さ)を反復して、 (i in 1:37){qq < -strsplit(ll [[1]] [i]、 '/')}を取得し、あなたが探している音声シーケンスの一部。

それはR.

+0

ありがとうcarlosdc。あなたは親切に私にそのようなプロセスをプログラムするための指示を与えることができますか? – ssuhan

+0

ありがとうcarlosdc。私はあなたの指示に従ういくつかのコードを書く。もう一度勧めてください。どうもありがとう。ありがとう、答えました。 – ssuhan

5

でリストだけの処理であるスペースに分割した後、私はこれをテストするために開いているコンソールを持っていないが、あなたのtagPOSでトークン化し、その後、「名詞」をgrepしようとしました、 "noun"または貼り付け(tagPOS(acq)、collapse = "。")、 "noun.noun"を検索します。次に、gregexprを使用して位置を抽出することができます。

EDIT:タグ付き出力のフォーマットは、私が記憶したものとは少し異なります。空白に "\ n"を代入した後のread.table()のこのメソッドは、上記のものよりもはるかに効率的です。

acqdf <- read.table(textConnection(gsub(" ", "\n", acqTag)), sep="/", stringsAsFactors=FALSE) 
acqdf$nnadj <- grepl("NN|JJ", acqdf$V2) 
acqdf$nnadj 
# [1] TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE FALSE TRUE TRUE 
#[16] FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE FALSE TRUE FALSE TRUE TRUE TRUE 
#[31] TRUE FALSE FALSE FALSE FALSE TRUE FALSE 
acqdf$nnadj[1:(nrow(acqdf)-1)] & acqdf$nnadj[2:nrow(acqdf)] 
# [1] TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE 
#[16] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE 
#[31] FALSE FALSE FALSE FALSE FALSE FALSE 
acqdf$pair <- c(NA, acqdf$nnadj[1:(nrow(acqdf)-1)] & acqdf$nnadj[2:nrow(acqdf)]) 
acqdf[1:7, ] 

      V1 V2 nnadj pair 
1   Gulf NNP TRUE NA 
2  Applied NNP TRUE TRUE 
3 Technologies NNP TRUE TRUE 
4   Inc NNP TRUE TRUE 
5   said VBD FALSE FALSE 
6   it PRP FALSE FALSE 
7   sold VBD FALSE FALSE 
+0

あなたの考えは私を非常に魅了しています。しかし、私はまだRのデビューしています。詳細な指示を私に与えてください。どうもありがとう。 – ssuhan

+0

ありがとうございました。あなたはどれくらい素晴らしい! (いいぞ) – ssuhan