标记化时从法语冠词缩写中删除特殊撇号

标签 r character gsub topic-modeling quanteda

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

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

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

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

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

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

感谢所有愿意帮助我的人。

最佳答案

我将概述使用 quantedaquanteda 相关工具执行此操作的两种方法。首先,让我们定义一个稍长的文本,其中包含更多法语前缀。请注意包含 撇号以及 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。量化代币

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。使用 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"  

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

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 并拟合模型。

关于标记化时从法语冠词缩写中删除特殊撇号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49060366/

相关文章:

r - 基于元素序列的向量修改

javascript - 使用 PrototypeJS 将元素转换为数组

character-encoding - 人名的所有允许字符是什么?

utf-8 - Julia :我的字符串中有奇怪的字符

regex - 替换第一次出现的“:”,而不是第二个

ruby-on-rails - 用于俄罗斯符号的 Rails gsub

r - r中字符串的循环和条件

r - Shiny Plotly event_data 仅在 Shiny 服务器上出现错误

r - 如何根据列设置 alpha?

perl - 在 Perl 中访问字符串中的单个字符时,是 substr 还是拆分为数组更快?