2016-11-17 1 views
0

J'essaie d'extraire le texte d'une balise correspondante dans une phrase en séquence. Fondamentalement, j'essaie d'obtenir une partie du discours correspond à chaque phrase dans le fichier texte. code:Sélection du texte des balises correspondantes dans une séquence R

posText<- "The VeriFone is not working, when customers slide card nothing happens. The screen is frozen. We rebooted but it did not help." 
    posText1<- c("The VeriFone is not working","scanner is not scanning","printer offline","when customers slide card nothing happens. The screen is frozen. We rebooted but it did not help.") 

    tagPOS <- function(x, ...) { 
    s <- as.String(x) 
    word_token_annotator <- Maxent_Word_Token_Annotator() 
    a2 <- Annotation(1L, "sentence", 1L, nchar(s)) 
    a2 <- annotate(s, word_token_annotator, a2) 
    a3 <- annotate(s, Maxent_POS_Tag_Annotator(), a2) 
    a3w <- a3[a3$type == "word"] 
    POStags <- unlist(lapply(a3w$features, `[[`, "POS")) 
    POStagged <- paste(sprintf("%s/%s", s[a3w], POStags), collapse = " ") 
    list(POStagged = POStagged, POStags = POStags) 
    } 

    dd1 <- do.call(rbind, strsplit(as.character(posText), ' ')) 
    dd_V1 <- tagPOS(dd1)$POStagged 
    dd_V1 

Sortie

[1] "The/DT VeriFone/NNP is/VBZ not/RB working/VBG ,/, when/WRB customers/NNS slide/NN card/NN nothing/NN happens/VBZ ./. The/DT screen/NN is/VBZ frozen/VBN ./. We/PRP rebooted/VBD but/CC it/PRP did/VBD not/RB help/VB ./." 

Je veux extraire le texte de la balise dans une séquence. Par exemple: je veux extraire des textes dont le tag est 'NNP', 'VBZ', 'RB', 'VBG' dans la séquence du fichier texte entier partout où nous avons la séquence suivante dans les phrases.

Mes sorties souhaitées est:

[1] VeriFone is not working 

Merci pour votre aide.

+0

Votre exemple de code génère une erreur et nécessite probablement le code de la réponse donnée ici: http://stackoverflow.com/questions/28764056/could-not-find-function-tagpos –

+0

Merci Daniel pour l'avoir mentionné. J'ai incorrectement copié collé mon autre code ici. Ma faute. Maintenant je l'ai mis à jour. – Kiwi

+0

Ça ne marche toujours pas pour moi, désolé! Êtes-vous sûr que ce code fonctionne pour vous? Par exemple 'as.String' et' Maxent_Word_Token_Annotator() 'ne sont pas dans la base R. Peut-être que vous pourriez également éditer la question pour' posText' étant un vecteur et ce que la sortie est, respectivement votre sortie désirée dans ce cas. –

Répondre

0

C'est une approche plutôt naïve et si vous avez beaucoup de cordes, il est probablement trop lent, mais juste donner un essai

# Get the constrol sequence IDs (probably with RegEx nicer to do...) 
    tags <- sapply(strsplit(strsplit(dd_V1,"/")[[1]][-1]," "),"[",1) 

# Define constants 
    matchSeq <- c('NNP','VBZ','RB', 'VBG') 
    totalTags <- length(tags) 
    searchLength <- length(matchSeq) 

# Loop through all subvectors and store starting points of possible matches 
    startPoints <- c() 
    for(i in 1:(totalTags-searchLength)){ 
    if(identical(tags[i:(i+searchLength-1)], matchSeq)) startPoints <- c(startPoints,i) 
    } 

# Print results, if there are any 
    if(!is.null(startPoints)) paste(dd1[startPoints:(startPoints+searchLength-1)], collapse=" ") 

Si vous trouvez plus de même emplacement, vous pouvez par exemple boucle sur le startPoints et imprime ensuite chaque séquence séparément.

+0

Merci Daniel. Votre code fonctionne bien pour moi. Mais si ma variable (posText) a des valeurs inférieures, elle ne correspond pas à la séquence. posText <- c ("VeriFone ne fonctionne pas", "scanner ne scanne pas", "imprimante hors ligne", "quand les clients glissent sur la carte rien ne se passe, l'écran est gelé, nous avons redémarré mais ça n'a pas aidé.") – Kiwi

+0

cas où 'posText' est un vecteur, à quoi ressemble votre objet' dd_V1'? Il semble que lorsque j'utilise votre code, il mélange déjà les phrases, de sorte que la structure de 'dd_V1' est tordue! –

+0

Oui @Daniel Fischer vous avez raison. Lorsque j'utilise 'posText' comme entrée pour votre code, j'obtiens la sortie désirée. Mais si j'utilise 'posText1' comme entrée pour votre code, la strcuture de 'dd_V1' est tordue. Il semble que la fente de chaîne dans 'dd1' ne soit pas de longueur égale. Ma sortie attendue en utilisant 'posText1' est: Extraire les mots dont le tag est 'NNP', 'VBZ', 'RB', 'VBG' dans la séquence de 4 phrases dans 'posText1'. – Kiwi