2011-01-05 6 views
8

Je voudrais savoir s'il est possible d'extraire nom + nom ou (adj | nom) + nom dans R paquet openNLP? C'est, je voudrais utiliser le filtrage linguistique pour extraire les noms nominaux candidats. Pourriez-vous me dire comment faire? Merci beaucoup.Extraction nom + nom ou (adj | nom) + nom du texte


Merci pour les réponses. voici le code:

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 

lecteur peut se référer index sur acqTagSplit faire nom + nom ou (adj | nom) + nom extractation. (Le code n'est pas optimal mais fonctionne Si vous avez une idée, s'il vous plaît faites le moi savoir.)

En outre, j'ai toujours un problème.

Justeson et Katz (1995) ont proposé une autre filtrage linguistique pour extraire des phrases candidats substantif:

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

Je ne peux pas comprendre sa signification. Pourriez-vous me rendre un service pour l'expliquer ou transformer une telle représentation en langage R. Merci beaucoup.

+1

Posté ce que je pense est une solution propre. Votre demande ultérieure est une extension considérable de la question initiale. Je pense que vous devriez fermer celui-ci et poser une autre question. –

+1

@DWin: Je ne pense pas. C'est juste d'ajouter des conditions supplémentaires. De plus, traduire cela en R serait une question pour les mineurs de texte, pas pour les programmeurs. Je suggère de lire l'article de Justeson et Katz pour avoir son sens. –

+1

@Joris: Il y avait un couple de nouveaux opérateurs "+" et "?" que je n'ai pas compris. Je pensais qu'ils pourraient traduire en regex d'une certaine manière, inconnu pour moi cependant, et la citation n'était pas disponible sur une recherche sur le Web. J'ai donc pensé que le repostage serait une meilleure approche, étant donné que la question initiale avait été traitée à la fois par le PO et par mes efforts de rationalisation. –

Répondre

3

C'est possible.

EDIT:

Vous l'avez. Utilisez le marqueur POS et divisez les espaces: ll < - strsplit (acqTag, ''). De là, itérer sur la longueur de la liste d'entrée (longueur de ll) comme: pour (i en 1:37) {qq < -strsplit (ll [[1]] [i], '/')} et obtenir le partie de la séquence de discours que vous recherchez.

Après séparation sur les espaces, il est juste traitement de la liste dans l'affaire R.

+0

Merci carlosdc. Pourriez-vous me donner des indications pour programmer un tel processus? – ssuhan

+0

Merci carlosdc.J'écris quelques codes suivant votre direction. Pourriez-vous s'il vous plaît me donner encore une recommandation? Merci beaucoup. – ssuhan

5

Je n'ai pas une console ouverte sur laquelle le tester, mais ont essayé de votre tokenizer avec TAGPOS puis grep pour « nom », "nom" ou peut-être coller (tagPOS (acq), collapse = ".") et rechercher "nom.nom". Puis gregexpr pourrait être utilisé pour extraire des positions.

EDIT: Le format de la sortie étiquetée était un peu différent de ce dont je me souvenais. Je pense que cette méthode de read.table() - après avoir remplacé "\ n" s pour les espaces est beaucoup plus efficace que ce que je vois ci-dessus:

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

Merci répondu. Ton idée m'a tout à fait attiré. Mais je suis encore un débutant de R. Pourrais-je s'il vous plaît me donner plus de détails? Merci beaucoup. – ssuhan

+0

Merci DWin. Comme tu étais génial! (Pouces vers le haut) – ssuhan