8

RパッケージのopenNLPで名詞+名詞または(adj|名詞)+名詞を抽出できるか問い合わせたいのですが?やり方を教えていただけますか?どうもありがとう。


回答ありがとうございます。コードは次のとおりです。

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

リーダーは、 acqTagSplitのインデックスを参照して、名詞 + 名詞または (adj|名詞) + 名詞の抽出を行うことができます。(コードは最適ではありませんが動作します。何かアイデアがあれば教えてください。)

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

Justeson と Katz (1995) は、名詞句の候補を抽出する別の言語フィルタリングを提案しました。

((Adj|名詞)+|((Adj|名詞) (名詞-プレップ)?)(Adj|名詞) )名詞

その意味がよく理解できません。それを説明するか、そのような表現をR言語に変換してください。どうもありがとう。

4

2 に答える 2

5

これをテストするための開いているコンソールはありませんが、tagPOS でトークン化してから、「名詞」、「名詞」、またはおそらく paste(tagPOS(acq), collapse=".") を grep して検索してみてください。 「名詞.名詞」の場合。次に、gregexpr を使用して位置を抽出できます。

編集: タグ付けされた出力の形式は、私が覚えていたものとは少し異なりました。スペースを "\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
于 2011-01-05T04:06:48.343 に答える
3

可能です。

編集:

了解しました。POS タガーを使用し、スペースで分割します: ll <- strsplit(acqTag,' ')。そこから、次のように入力リストの長さ (ll の長さ) を反復処理します: for (i in 1:37){qq <-strsplit(ll[[1]][i],'/')}あなたが探している音声シーケンスの。

スペースで分割した後は、R でのリスト処理だけです。

于 2011-01-05T03:47:20.783 に答える