r - 从文本中提取名词+名词或(形容词|名词)+名词

标签 r nlp opennlp pos-tagger

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

我还有一个问题:

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

((Adj|Noun)+|((Adj|Noun)*(Noun-Prep)?)(Adj|Noun)*)Noun

我不太明白它的意思。你能帮我解释一下吗?或者展示如何用R语言编写过滤规则? 非常感谢。

最佳答案

我没有一个开放的控制台来测试这个,但是你可以尝试使用 tagPOS 进行标记,然后 grep 查找“名词”,“名词”或者粘贴(tagPOS(acq),崩溃=“。” )并搜索“名词.名词”。然后可以使用 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

关于r - 从文本中提取名词+名词或(形容词|名词)+名词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4600612/

相关文章:

r - 包装长轴标签

使用索引保留不正确的名称

r - fisher.test() 的 p 值与 phyper() 不匹配

prolog - 极其低效且不优雅的代码

java - 从文本中提取协议(protocol)特征

java - 在 nlp 中查找文本中的标记概率

r - 网页上的 Shiny 服务器错误 : An error has occurred The application failed to start. 应用程序在初始化期间退出

python - NLTK 使用的实际例子

java - 如何使用 stanford-nlp 提供的 OpenIEDemo.java 生成自定义三元组

javax.servlet.ServletException : java. lang.OutOfMemoryError:Java堆空间