2011-01-05 7 views
8

Me gustaría preguntar si es posible extraer sustantivo + sustantivo o (adj | noun) + sustantivo en el paquete R openNLP? Es decir, me gustaría utilizar el filtrado lingüístico para extraer frases nominales candidatas. ¿Podrías dirigirme cómo hacerlo? Muchas gracias.Extrayendo sustantivo + sustantivo o (adj | noun) + sustantivo de Texto


Gracias por las respuestas. Aquí está el código:

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 

lector puede referirse índice de en acqTagSplit hacer sustantivo + sustantivo o (adj | sustantivo) + sustantivo extractation. (El código no es óptimo pero funciona. Si tiene alguna idea, hágamelo saber)

Además, todavía tengo un problema.

Justeson y Katz (1995) proponen otra filtrado lingüística para extraer candidatos frases nominales:?

((Adj | Sustantivo) + | ((Adj | Sustantivo) (Noun-Prep)) (Adj | Sustantivo)) Sustantivo

No puedo entender bien su significado. ¿Podría hacerme un favor para explicarlo o transformar esa representación en el lenguaje R.? Muchas gracias.

+1

Publicada lo que creo que es una solución limpia. Su solicitud posterior es una extensión considerable de la pregunta original. Creo que deberías cerrar esta y hacer otra pregunta. –

+1

@DWin: Creo que no. Solo agrega algunas condiciones adicionales. Además, traducir eso a R sería una pregunta para los mineros de texto, no para los programadores. Sugiero que ssuhan lea el artículo de Justeson y Katz para entender su significado. –

+1

@Joris: ¿Hubo un par de nuevos operadores "+" y "?" que no entendí Pensé que podrían traducir a regex de alguna manera, sin embargo, desconocido para mí, y la cita no estaba disponible en una búsqueda web. Así que pensé que el envío de publicaciones sería un mejor enfoque, ya que la OP original y mi esfuerzo de racionalización respondieron a la pregunta original. –

Respuesta

3

Es posible.

EDITAR:

Lo tienes. Utilice el rotulador POS y divídalo en espacios: ll < - strsplit (acqTag, ''). Desde allí itere en la longitud de la lista de entrada (longitud de ll) como: para (i en 1:37) {qq < -strsplit (ll [[1]] [i], '/')} y obtenga el parte de la secuencia de discurso que estás buscando.

Después de la división de espacios es sólo procesamiento de listas en R.

+0

Gracias carlosdc. ¿Podría amablemente darme alguna dirección para programar tal proceso? – ssuhan

+0

Gracias carlosdc.Escribo algunos códigos siguiendo tu dirección. ¿Podrías darme alguna recomendación otra vez? Muchas gracias. – ssuhan

5

no tengo una consola abierta en la cual probar esto, pero he tratado de su tokenize con tagPOS y luego grep para "sustantivo", "sustantivo" o quizás pegar (tagPOS (acq), collapse = ".") y buscar "noun.noun". Entonces gregexpr podría usarse para extraer posiciones.

EDITAR: El formato de la salida etiquetada era un poco diferente de lo que recordaba. Creo que este método de read.table() - ing después de sustituir "\ n" s por espacios es mucho más eficiente que lo que veo arriba:

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

Gracias respondidas. Tu idea me atrajo bastante. Pero todavía soy un debutante de R. ¿Podría darme más información detallada? Muchas gracias. – ssuhan

+0

Gracias DWin. ¡Qué bueno eres! (Pulgares hacia arriba) – ssuhan

Cuestiones relacionadas