从文本中提取名词+名词或(adj |名词)+名词

时间:2011-01-05 03:34:15

标签: r nlp opennlp pos-tagger

我想查询是否有可能在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 |名词)的(名词-PREP))(ADJ |?名词))名词

我无法理解它的含义。你能帮我解释一下还是将这种表现形式转化为R语言。 非常感谢。

2 个答案:

答案 0 :(得分:5)

我没有可以测试它的开放式控制台,但是你尝试用tagPOS标记,然后用grep代替“名词”,“名词”或者粘贴(tagPOS(acq),collapse =“。” )并搜索“noun.noun”。然后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

答案 1 :(得分:3)

有可能。

编辑:

你明白了。使用POS标记器并拆分空格:ll&lt; - strsplit(acqTag,'')。从那里迭代输入列表的长度(ll的长度),如: for(i in 1:37){qq&lt; -strsplit(ll [[1]] [i],'/')}并获得您正在寻找的词性序列。

在拆分空格后,它只是R中的列表处理。