在标记化时从法国文章收缩中删除特殊撇号

问题描述 投票:2回答:2

我目前正在运行法国报纸Le Monde的一系列文章的stm(结构主题模型)。该模型工作得很好,但我对文本的预处理有问题。我目前正在使用quanteda软件包和tm软件包来做一些事情,比如删除单词,删除数字......等等......但是,只有一件事似乎不起作用。正如你们中的一些人可能知道的那样,在法语中,男性的决定性文章-le-在元音之前收缩。我试图删除-l' - (和类似的东西,如-d'-)作为带有removeWords的单词

lmt67 <- removeWords(lmt67, c( "l'","d'","qu'il", "n'", "a", "dans"))

但它只适用于与文本其余部分分开的单词,而不适用于附加到单词的文章,例如-l'arbre-(树)。沮丧,我试着给它一个简单的gsub

lmt67 <- gsub("l'","",lmt67)

但这似乎也没有奏效。现在,有什么更好的方法来做到这一点,并可能通过c(...)向量,以便我可以一起给它一系列的表达式?

就像上下文一样,lmt67是一个“大字符”,包含30,000个元素/文章,通过对从txt文件导入的数据使用“文本”函数获得。

感谢任何想要帮助我的人。

r character gsub topic-modeling quanteda
2个回答
1
投票

我将使用quanteda和quanteda相关工具概述两种方法。首先,让我们定义一个略长的文本,为法语添加更多的前缀。请注意包含撇号以及ASCII 39简单撇号。

txt <- c(doc1 = "M. Trump, lors d’une réunion convoquée d’urgence à la Maison Blanche, 
                 n’en a pas dit mot devant la presse. En réalité, il s’agit d’une 
                 mesure essentiellement commerciale de ce pays qui l'importe.", 
         doc2 = "Réfugié à Bruxelles, l’indépendantiste catalan a désigné comme 
                 successeur Jordi Sanchez, partisan de l’indépendance catalane, 
                 actuellement en prison pour sédition.")

第一种方法将使用简单ASCII 39(撇号)的模式匹配以及一组Unicode变体,通过类别“Pf”匹配"Punctuation: Final Quote"类别。但是,quanteda尽力在标记化阶段规范化引号 - 例如,请参阅第二个文档中的“l'indépendance”。

下面的第二种方法使用与quanteda集成的法语词性标记器,在识别和分离前缀之后允许类似的选择,然后删除决定因素(在其他POS中)。

1. quanteda tokens

toks <- tokens(txt, remove_punct = TRUE)
# remove stopwords
toks <- tokens_remove(toks, stopwords("french"))
toks
# tokens from 2 documents.
# doc1 :
# [1] "M"               "Trump"           "lors"            "d'une"           "réunion"        
# [6] "convoquée"       "d'urgence"       "à"               "la"              "Maison"         
# [11] "Blanche"         "n'en"            "a"               "pas"             "dit"            
# [16] "mot"             "devant"          "la"              "presse"          "En"             
# [21] "réalité"         "il"              "s'agit"          "d'une"           "mesure"         
# [26] "essentiellement" "commerciale"     "de"              "ce"              "pays"           
# [31] "qui"             "l'importe"      
# 
# doc2 :
# [1] "Réfugié"           "à"                 "Bruxelles"         "l'indépendantiste"
# [5] "catalan"           "a"                 "désigné"           "comme"            
# [9] "successeur"        "Jordi"             "Sanchez"           "partisan"         
# [13] "de"                "l'indépendance"    "catalane"          "actuellement"     
# [17] "en"                "prison"            "pour"              "sédition"   

然后,我们应用模式匹配l'd'l',在类型(唯一标记)上使用正则表达式替换:

toks <- tokens_replace(
    toks, 
    types(toks), 
    stringi::stri_replace_all_regex(types(toks), "[lsd]['\\p{Pf}]", "")
)
# tokens from 2 documents.
# doc1 :
# [1] "M"               "Trump"           "lors"            "une"             "réunion"        
# [6] "convoquée"       "urgence"         "à"               "la"              "Maison"         
# [11] "Blanche"         "n'en"            "a"               "pas"             "dit"            
# [16] "mot"             "devant"          "la"              "presse"          "En"             
# [21] "réalité"         "il"              "agit"            "une"             "mesure"         
# [26] "essentiellement" "commerciale"     "de"              "ce"              "pays"           
# [31] "qui"             "importe"        
# 
# doc2 :
# [1] "Réfugié"         "à"               "Bruxelles"       "indépendantiste" "catalan"        
# [6] "a"               "désigné"         "comme"           "successeur"      "Jordi"          
# [11] "Sanchez"         "partisan"        "de"              "indépendance"    "catalane"       
# [16] "actuellement"    "En"              "prison"          "pour"            "sédition" 

从生成的toks对象,您可以形成一个dfm,然后继续适合STM。

2. using spacyr

这将涉及更复杂的词性标注,然后将标记对象转换为quanteda标记。首先,您需要安装Python,spacy和法语模型。 (见https://spacy.io/usage/models。)

library(spacyr)
spacy_initialize(model = "fr", python_executable = "/anaconda/bin/python")
# successfully initialized (spaCy Version: 2.0.1, language model: fr)

toks <- spacy_parse(txt, lemma = FALSE) %>%
    as.tokens(include_pos = "pos") 
toks
# tokens from 2 documents.
# doc1 :
# [1] "M./NOUN"                   "Trump/PROPN"               ",/PUNCT"                  
# [4] "lors/ADV"                  "d’/PUNCT"                  "une/DET"                  
# [7] "réunion/NOUN"              "convoquée/VERB"            "d’/ADP"                   
# [10] "urgence/NOUN"              "à/ADP"                     "la/DET"                   
# [13] "Maison/PROPN"              "Blanche/PROPN"             ",/PUNCT"                  
# [16] "\n                 /SPACE" "n’/VERB"                   "en/PRON"                  
# [19] "a/AUX"                     "pas/ADV"                   "dit/VERB"                 
# [22] "mot/ADV"                   "devant/ADP"                "la/DET"                   
# [25] "presse/NOUN"               "./PUNCT"                   "En/ADP"                   
# [28] "réalité/NOUN"              ",/PUNCT"                   "il/PRON"                  
# [31] "s’/AUX"                    "agit/VERB"                 "d’/ADP"                   
# [34] "une/DET"                   "\n                 /SPACE" "mesure/NOUN"              
# [37] "essentiellement/ADV"       "commerciale/ADJ"           "de/ADP"                   
# [40] "ce/DET"                    "pays/NOUN"                 "qui/PRON"                 
# [43] "l'/DET"                    "importe/NOUN"              "./PUNCT"                  
# 
# doc2 :
# [1] "Réfugié/VERB"              "à/ADP"                     "Bruxelles/PROPN"          
# [4] ",/PUNCT"                   "l’/PRON"                   "indépendantiste/ADJ"      
# [7] "catalan/VERB"              "a/AUX"                     "désigné/VERB"             
# [10] "comme/ADP"                 "\n                 /SPACE" "successeur/NOUN"          
# [13] "Jordi/PROPN"               "Sanchez/PROPN"             ",/PUNCT"                  
# [16] "partisan/VERB"             "de/ADP"                    "l’/DET"                   
# [19] "indépendance/ADJ"          "catalane/ADJ"              ",/PUNCT"                  
# [22] "\n                 /SPACE" "actuellement/ADV"          "en/ADP"                   
# [25] "prison/NOUN"               "pour/ADP"                  "sédition/NOUN"            
# [28] "./PUNCT"  

然后我们可以使用默认的glob-matching来删除我们可能不感兴趣的词性,包括换行符:

toks <- tokens_remove(toks, c("*/DET", "*/PUNCT", "\n*", "*/ADP", "*/AUX", "*/PRON"))
toks
# doc1 :
# [1] "M./NOUN"             "Trump/PROPN"         "lors/ADV"            "réunion/NOUN"        "convoquée/VERB"     
# [6] "urgence/NOUN"        "Maison/PROPN"        "Blanche/PROPN"       "n’/VERB"             "pas/ADV"            
# [11] "dit/VERB"            "mot/ADV"             "presse/NOUN"         "réalité/NOUN"        "agit/VERB"          
# [16] "mesure/NOUN"         "essentiellement/ADV" "commerciale/ADJ"     "pays/NOUN"           "importe/NOUN"       
# 
# doc2 :
# [1] "Réfugié/VERB"        "Bruxelles/PROPN"     "indépendantiste/ADJ" "catalan/VERB"        "désigné/VERB"       
# [6] "successeur/NOUN"     "Jordi/PROPN"         "Sanchez/PROPN"       "partisan/VERB"       "indépendance/ADJ"   
# [11] "catalane/ADJ"        "actuellement/ADV"    "prison/NOUN"         "sédition/NOUN" 

然后我们可以删除您在STM中可能不想要的标签 - 但如果您愿意,可以将它们留下。

## remove the tags
toks <- tokens_replace(toks, types(toks), 
                       stringi::stri_replace_all_regex(types(toks), "/[A-Z]+$", ""))
toks
# tokens from 2 documents.
# doc1 :
# [1] "M."              "Trump"           "lors"            "réunion"         "convoquée"      
# [6] "urgence"         "Maison"          "Blanche"         "n’"              "pas"            
# [11] "dit"             "mot"             "presse"          "réalité"         "agit"           
# [16] "mesure"          "essentiellement" "commerciale"     "pays"            "importe"        
# 
# doc2 :
# [1] "Réfugié"         "Bruxelles"       "indépendantiste" "catalan"         "désigné"        
# [6] "successeur"      "Jordi"           "Sanchez"         "partisan"        "indépendance"   
# [11] "catalane"        "actuellement"    "prison"          "sédition"  

从那里,您可以使用toks对象来形成您的dfm并适合模型。


1
投票

这是Le Monde网站当前页面上的一篇文章。请注意,他们使用的撇号与"'"中的单引号不同:

text <- "Réfugié à Bruxelles, l’indépendantiste catalan a désigné comme successeur Jordi Sanchez, partisan de l’indépendance catalane, actuellement en prison pour sédition."

它有一个小角度,当我查看它时实际上并不是“直线向下”。您需要将该字符复制到gsub命令中:

sub("l’", "", text)
[#1] "Réfugié à Bruxelles, indépendantiste catalan a désigné comme successeur Jordi Sanchez, partisan de l’indépendance catalane, actuellement en prison pour sédition."
© www.soinside.com 2019 - 2024. All rights reserved.