2017-08-24 4 views
0

J'utilise le paquet quanteda de Ken Benoit et Paul Nulty pour travailler avec des données textuelles.Identifier des noms en utilisant des corpus Quanteda

Mon corpus contient des textes avec des phrases complètes en allemand et je souhaite travailler uniquement avec les noms de tous les textes. Un truc en allemand est d'utiliser uniquement les mots en majuscules, mais cela échouerait au début d'une phrase.

Text1 <- c("Halle an der Saale ist die grünste Stadt Deutschlands") 
Text2 <- c("In Hamburg regnet es immer, das ist also so wie in London.") 
Text3 <- c("James Bond trinkt am liebsten Martini") 

myCorpus <- corpus(c(Text1, Text2, Text3)) 
metadoc(myCorpus, "language") <- "german" 
summary(myCorpus, showmeta = T) 

myDfm <- dfm(myCorpus, tolower = F, remove_numbers = T, 
       remove = stopwords("german"), remove_punct = TRUE, 
        remove_separators = T) 

topfeatures(myDfm, 20) 

De cet exemple minimal, je voudrais récupérer: "Halle", "Saale", "Stadt", "Deutschland", "Hamburg", "Londres", "Martini", "James" , "Bond". Je suppose que j'ai besoin d'un dictionnaire, qui définit les verbes/noms/etc. et les noms propres (James Bond, Hambourg etc.), ou y a-t-il une fonction de construction/dict?

Bonus Question: La solution fonctionne-t-elle aussi pour les textes en anglais?

Répondre

1

Vous avez besoin de l'aide d'un étiqueteur de parties du discours. Heureusement, il y en a un grand, avec un modèle en langue allemande, sous la forme de spaCy, et un paquet que nous avons écrit comme un emballage autour de lui, spacyr. Les instructions d'installation sont au spacyr page.

Ce code fera ce que vous voulez:

txt <- c("Halle an der Saale ist die grünste Stadt Deutschlands", 
     "In Hamburg regnet es immer, das ist also so wie in London.", 
     "James Bond trinkt am liebsten Martini") 

library("spacyr") 
spacy_initialize(model = "de") 
txtparsed <- spacy_parse(txt, tag = TRUE, pos = TRUE) 

head(txtparsed, 20) 
# doc_id sentence_id token_id  token  lemma pos tag entity 
# 1 text1   1  1  Halle  halle PROPN NE LOC_B 
# 2 text1   1  1   an   an ADP APPR LOC_I 
# 3 text1   1  1   der   der DET ART LOC_I 
# 4 text1   1  1  Saale  saale PROPN NE LOC_I 
# 5 text1   1  1   ist   ist AUX VAFIN  
# 6 text1   1  1   die   die DET ART  
# 7 text1   1  1  grünste  grünste ADJ ADJA  
# 8 text1   1  1  Stadt  stadt NOUN NN  
# 9 text1   1  1 Deutschlands deutschlands PROPN NE LOC_B 
# 10 text2   1  1   In   in ADP APPR  
# 11 text2   1  1  Hamburg  hamburg PROPN NE LOC_B 
# 12 text2   1  1  regnet  regnet VERB VVFIN  
# 13 text2   1  1   es   es PRON PPER  
# 14 text2   1  1  immer  immer ADV ADV  
# 15 text2   1  1   ,   , PUNCT $,  
# 16 text2   1  1   das   das PRON PDS  
# 17 text2   1  1   ist   ist AUX VAFIN  
# 18 text2   1  1   also   also ADV ADV  
# 19 text2   1  1   so   so ADV ADV  
# 20 text2   1  1   wie   wie CONJ KOKOM  

(nouns <- with(txtparsed, subset(token, pos == "NOUN"))) 
# [1] "Stadt" 
(propernouns <- with(txtparsed, subset(token, pos == "PROPN"))) 
# [1] "Halle"  "Saale"  "Deutschlands" "Hamburg"  "London"  
# [6] "James"  "Bond"   "Martini" 

Ici, vous pouvez voir que les noms que vous vouliez sont marqués dans le domaine pos plus simple comme « noms propres ». Le champ tag est un jeu de tags en langue allemande plus détaillé que vous pouvez également sélectionner.

Les listes de noms sélectionnés peuvent ensuite être utilisés dans quanteda:

library("quanteda") 
myDfm <- dfm(txt, tolower = FALSE, remove_numbers = TRUE, 
      remove = stopwords("german"), remove_punct = TRUE) 

head(myDfm) 
# Document-feature matrix of: 3 documents, 14 features (66.7% sparse). 
# (showing first 3 documents and first 6 features) 
#  features 
# docs Halle Saale grünste Stadt Deutschlands Hamburg 
# text1  1  1  1  1   1  0 
# text2  0  0  0  0   0  1 
# text3  0  0  0  0   0  0 

head(dfm_select(myDfm, pattern = propernouns)) 
# Document-feature matrix of: 3 documents, 8 features (66.7% sparse). 
# (showing first 3 documents and first 6 features) 
#  features 
# docs Halle Saale Deutschlands Hamburg London James 
# text1  1  1   1  0  0  0 
# text2  0  0   0  1  1  0 
# text3  0  0   0  0  0  1 
+1

incroyable, merci beaucoup Ken! – CFM