8

我想查询R包openNLP中是否可以提取名词+名词或(adj|noun)+名词?也就是说,我想使用语言过滤来提取候选名词短语。你能指导我怎么做吗?非常感谢。


感谢您的回复。这是代码:

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|noun)+名词的提取。(代码不是最佳但可以工作。如果您有任何想法,请告诉我。)

此外,我还有一个问题。

Justeson 和 Katz (1995) 提出了另一种语言过滤来提取候选名词短语:

((Adj|Noun)+|((Adj|Noun) (Noun-Prep)?)(Adj|Noun) )名词

我不能很好地理解它的含义。您能否帮我解释一下或将这种表示形式转换为 R 语言。非常感谢。

4

2 回答 2

5

我没有可以在其上测试的开放式控制台,但是您尝试使用 tagPOS 进行标记,然后使用 grep 查找“名词”、“名词”或 paste(tagPOS(acq), collapse=".") 并搜索对于“名词.名词”。然后可以使用 gregexpr 来提取位置。

编辑:标记输出的格式与我记忆中的有点不同。我认为这种用“\n”代替空格后的 read.table()-ing 方法比我在上面看到的要有效得多:

 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 回答