2 votes

Recherche de motifs regex avancés avec kwic()

Je veux utiliser kwic() pour trouver des motifs dans du texte avec des phrases regex plus avancées, mais j'ai du mal avec la façon dont kwic() tokénise les phrases et deux problèmes sont apparus :

1) Comment utiliser le regroupement avec des phrases qui contiennent des espaces :

kwic(text, pattern = phrase("\\b(address|g[eo]t? into|gotten into)\\b \\bno\\b"), valuetype="regex")

Erreur dans stri_detect_regex(types_search, pattern, case_insensitive = case_insensitive) : Des parenthèses incorrectement imbriquées dans le motif de l'expression rationnelle. (U_REGEX_MISMATCHED_PAREN)

2) Comment rechercher une séquence de mots plus longue ? (similaire à la première question) :

kwic("this is a test", pattern= phrase("(\\w+\\s){1,3}"), valuetype="regex", remove_separator=FALSE)

objet kwic avec 0 ligne

kwic("this is a test", pattern= phrase("(\\w+ ){0,2}"), valuetype="regex", remove_separator=FALSE)

Erreur dans stri_detect_regex(types_search, pattern, case_insensitive = case_insensitive) : Parenthèses incorrectement imbriquées dans le modèle de regexp. (U_REGEX_MISMATCHED_PAREN)

Merci pour tous les conseils !

1voto

Ken Benoit Points 6753

Ce qu'il faut comprendre avec phrase() est qu'il permet de créer des séquences de motifs, délimitées par des espaces, comme une seule valeur de caractère. Il ne devrait pas, du moins pour une utilisation normale, inclure les délimiteurs d'espacement dans le motif.

J'ai choisi un exemple reproductible pour les première partie de votre question qui, je pense, illustre bien le propos et répond à votre question.

Ici, nous mettons simplement les différents modèles dans phrase() avec un espace entre eux. Cela équivaut à les envelopper dans un list() et de faire de la séquence de motifs séparés les éléments d'un vecteur de caractères.

library("quanteda")
#> Package version: 2.0.1

kwic("a b c a b d e", pattern = phrase("b c|d"), valuetype = "regex")
#>                                      
#>  [text1, 2:3]       a | b c | a b d e
#>  [text1, 5:6] a b c a | b d | e
kwic("a b c a b d e", pattern = list(c("b", "c|d")), valuetype = "regex")
#>                                      
#>  [text1, 2:3]       a | b c | a b d e
#>  [text1, 5:6] a b c a | b d | e

Nous pourrions également considérer un vecteur de correspondances de séquences, y compris avec des correspondances très inclusives, comme le ".+ ^a$" ci-dessous correspondant à toute séquence de 1 ou plusieurs caractères, suivie du jeton "a" . Remarquez comment le ^$ rend explicite le fait qu'il s'agit du début et de la fin de la regex (à un seul token).

kwic("a b c a b d e", pattern = phrase(c("b c|d", ".+ ^a$")), valuetype = "regex")
#>                                      
#>  [text1, 2:3]       a | b c | a b d e
#>  [text1, 3:4]     a b | c a | b d e  
#>  [text1, 5:6] a b c a | b d | e

Pour deuxième partie vous pouvez utiliser la correspondance par caractères génériques pour correspondre à n'importe quoi, ce qui est plus facile en utilisant la correspondance par défaut "glob" :

kwic("this is a test", pattern = phrase("* * *"))
#>                                      
#>  [text1, 1:3]      | this is a | test
#>  [text1, 2:4] this | is a test |

kwic("this is a test", pattern = phrase("* *"))
#>                                         
#>  [text1, 1:2]         | this is | a test
#>  [text1, 2:3]    this |  is a   | test  
#>  [text1, 3:4] this is | a test  |

Notez enfin qu'il est Il est possible d'inclure des espaces dans une correspondance de motifs, mais uniquement si les mots-clés incluent des espaces. Ce serait le cas si vous passiez par l'option remove_separators = FALSE à l'argument tokens() appeler via ... (voir ?kwic ), ou si vous avez créé les jetons d'une autre manière pour vous assurer qu'ils contiennent des espaces.

as.tokens(list(d1 = c("a b", " ", "c"))) %>%
  kwic(phrase("\\s"), valuetype = "regex")
#>                        
#>  [d1, 1]     | a b |  c
#>  [d1, 2] a b |     | c

Là, le "a b" qui est affiché est en fait le seul jeton "a b", et non la séquence de jetons "a", "b". Le blanc de la deuxième ligne est le jeton " ".

Créé le 2020-03-31 par le paquet reprex (v0.3.0)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X