ssu*_*han 8 nlp r pos-tagger opennlp
我想查询是否有可能在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
Run Code Online (Sandbox Code Playgroud)
读者可以参考指数上acqTagSplit做名词+名词或(形容词|名词)+名词extractation.(代码不是最佳但工作.如果您有任何想法,请告诉我.)
此外,我还有一个问题.
Justeson和Katz(1995)提出了另一种语言过滤来提取候选名词短语:
((形容词|名词)+ |((ADJ |名词)(名词-PREP))(形容词?|名词))名词
我不太清楚它的含义.你能帮我解释一下还是将这种表现形式转化为R语言.非常感谢.
我没有一个开放的控制台来测试它,但你试图用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
Run Code Online (Sandbox Code Playgroud)
有可能的。
编辑:
你说对了。使用 POS 标记器并按空格分割:ll <- strsplit(acqTag,' ')。从那里迭代输入列表的长度(ll 的长度),例如: for (i in 1:37){qq <-strsplit(ll[[1]][i],'/')} 并获取部分您正在寻找的语音序列。
在按空格分割之后,它只是 R 中的列表处理。