2011-01-05 6 views
8

Хотелось бы запросить, если можно извлечь noun + noun или (adj | noun) + noun в R package openNLP? То есть, я бы хотел использовать лингвистическую фильтрацию для извлечения кандидатских именных фраз. Можете ли вы направить меня, как это сделать? Большое спасибо.Извлечение noun + noun или (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 сделать существительное + существительное или (прил | существительное) + существительное extractation. (Код не оптимален, но работает. Если у вас есть какие-либо идеи, сообщите мне.)

Кроме того, у меня все еще есть проблема.

Justeson и Katz (1995) предложили другую языковую фильтрацию для извлечения кандидатского существительного фразы:

((Adj | Существительное) + | ((Adj | Существительное) (Существительное-Prep)) (Adj | существительного)) Существительное

Я не могу понять его смысл. Могли бы вы сделать мне одолжение, чтобы объяснить это или преобразовать такое представление в R-язык. Большое спасибо.

+1

Опубликовано, что я думаю, является чистым решением. Ваш более поздний запрос является значительным расширением исходного вопроса. Я думаю, вы должны закрыть этот вопрос и задать другой вопрос. –

+1

@ DWin: думаю нет. Это просто добавление дополнительных условий. Плюс, чтобы перевести это в R, будет вопрос для текстовых шахтеров, а не для программистов. Я предлагаю сухану прочитать статью Юстэсона и Каца, чтобы понять ее смысл. –

+1

@ Joris: Было несколько новых операторов «+» и «?» что я не понял. Я думал, что они могут перевести на регулярное выражение каким-то образом, но неизвестно мне, и цитата была недоступна при веб-поиске. Поэтому я подумал, что перепродажа будет лучшим подходом, поскольку на исходный вопрос ответили как ОП, так и мои усилия по рационализации. –

ответ

3

Это возможно.

EDIT:

У вас есть это. Используйте теггер POS и разделите на пробелы: ll < - strsplit (acqTag, ''). Оттуда итерация по длине входного списка (длина ll) равна: для (i в 1:37) {qq < -strsplit (ll [[1]] [i], '/')} и получить часть последовательности речи, которую вы ищете.

После расщепления на пространствах это просто обработка списка в R.

+0

Спасибо carlosdc. Не могли бы вы дать мне какое-то направление для программирования такого процесса? – ssuhan

+0

Спасибо carlosdc.Я пишу несколько кодов, следующих за вами. Не могли бы вы снова дать мне несколько рекомендаций? Огромное спасибо. – ssuhan

5

не имеют открытую консоль, на которой, чтобы проверить это, но ваш пытались разметить с tagPOS, а затем вычленить информацию «существительное», «существительное» или, возможно, вставить (tagPOS (acq), collapse = «.») и выполнить поиск «noun.noun». Тогда gregexpr может использоваться для извлечения позиций.

EDIT: Формат отмеченного вывода был немного иным, чем я помнил. Я думаю, что этот метод read.table() после замены «\ n» s для пространств намного эффективнее, чем то, что я вижу выше:

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 
+0

Спасибо. Твоя идея меня очень привлекает. Но я все еще дебютант Р. Могу ли я, пожалуйста, дать мне подробное руководство? Большое спасибо. – ssuhan

+0

Спасибо DWin. Как вы здоровы! (Пальцы вверх) – ssuhan

 Смежные вопросы

  • Нет связанных вопросов^_^