【问题标题】:Extracting noun+noun or (adj|noun)+noun from Text从文本中提取名词+名词或(adj|noun)+名词
【发布时间】:2011-06-03 18:58:49
【问题描述】:

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

此外,我还有一个问题。

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

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

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

【问题讨论】:

  • 发布了我认为是干净的解决方案。您后来的请求是对原始问题的相当大的扩展。我认为你应该关闭这个并提出另一个问题。
  • @DWin:我不这么认为。它只是增加了一些额外的条件。另外,将其翻译成 R 将是文本挖掘者的问题,而不是程序员的问题。我建议 ssuhan 阅读 Justeson 和 Katz 的文章以了解其含义。
  • @Joris:有几个新的运算符“+”和“?”我不明白。我认为它们可能会以某种方式转换为正则表达式,但我不知道,并且在网络搜索中无法获得引用。所以我认为重新发布会是一种更好的方法,因为原始问题已经得到了 OP 和我在精简方面的努力的回答。

标签: r nlp opennlp pos-tagger


【解决方案1】:

我没有一个开放的控制台来测试这个,但是你试过用 tagPOS 标记化,然后用 grep 搜索“名词”、“名词”或者 paste(tagPOS(acq), collapse="。" ) 并搜索“noun.noun”。然后可以使用 gregexpr 来提取位置。

编辑:标记输出的格式与我记忆中的有点不同。我认为这种用 "\n"s 代替空格后的 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的初出茅庐,能否再给我详细的指导?非常感谢。
  • 感谢 DWin。你真棒! (竖起大拇指)
【解决方案2】:

这是可能的。

编辑:

你明白了。使用 POS 标记器并在空格上拆分:ll

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

【讨论】:

  • 感谢 carlosdc。你能给我一些指导来编写这样一个过程吗?
  • 感谢 carlosdc。我按照您的指示编写了一些代码。你能再给我一些建议吗?非常感谢。
猜你喜欢
  • 2011-06-04
  • 2010-12-25
  • 1970-01-01
  • 2011-05-09
  • 2016-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多