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

时间:2018-03-01 23:25:13

标签: r character gsub topic-modeling quanteda

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

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

但它仅适用于与文本其余部分分开的单词,而不适用于附加到单词的文章,例如-l&#ar;中的文章(树)。 沮丧,我试图给它一个简单的gsub

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

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

就像上下文一样,lmt67是一个&#34;大字符&#34;通过使用&#34;文本&#34;获得30,000个元素/文章。对从txt文件导入的数据执行函数。

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

2 个答案:

答案 0 :(得分: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."

答案 1 :(得分:1)

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

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

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

1。 quanteda令牌

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.")

然后,我们应用模式匹配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" 对象中,您可以形成一个dfm,然后继续适应STM。

2。使用spacyr

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

toks

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

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"  

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

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" 

从那里,你可以使用## 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" 对象来形成你的dfm并适合模型。