代码之家  ›  专栏  ›  技术社区  ›  kouta

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

  •  3
  • kouta  · 技术社区  · 7 年前

    我目前正在运行一个由法国报纸的一系列文章组成的stm(结构主题模型) 《世界报》 . 该模型工作得很好,但我对文本的预处理有问题。 我目前正在使用quanteda软件包和tm软件包来做一些事情,比如删除单词、删除数字。。。等 不过,只有一件事似乎行不通。 正如你们中的一些人可能知道的,在法语中,男性限定冠词le在元音之前缩进了l。我试着用removeWords将-l'(和类似的东西,如-d'-)作为单词删除

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

    但它只适用于与文本其他部分分离的单词,而不适用于附加在单词上的文章,例如in-l'arbre-(the tree)。 很沮丧,我试着给它一个简单的gsub

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

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

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

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

    2 回复  |  直到 7 年前
        1
  •  1
  •   Ken Benoit    7 年前

    我将概述使用 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公司 尽最大努力在标记化阶段规范化引号-请参阅 例如,第二份文件中的“独立性”。

    下面的第二种方法使用了法语词性标记符,该标记符与 quanteda公司 允许类似的 识别和分离前缀后进行选择,然后去除行列式(除其他位置外)。

    1、quanteda代币

    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' 我是 ,在类型(唯一标记)上使用正则表达式替换:

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

        2
  •  1
  •   IRTFM    7 年前

    这是《世界报》网站当前页面的一个片段。请注意,它们使用的撇号与此处的单引号字符不同 "'" :

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