【问题标题】:Quanteda Corpus Segment DocumentationQuanteda 语料库分段文档
【发布时间】:2020-02-24 15:36:30
【问题描述】:

我目前正在使用 quanteda 包,我想根据连续至少有两个正则表达式空格字符的模式来分割我的语料库。但是,我不确定 corpus_segment() 函数是如何工作的。我构建了以下小示例来说明我的问题:

test <- "start  middle  end" 
test <- corpus(test)
test
Corpus consisting of 1 document and 0 docvars.
texts(test)
               text1 
"start  middle  end"

现在我想根据至少两个正则表达式空格字符的模式来分割文档:

texts(corpus_segment(test, pattern="\\s{2,}", valuetype = "regex"))
 text1.1  text1.2 
"middle"    "end"

现在第一个模式匹配前面的单词已被删除。在查看文档后,我看到 remove_pattern 默认等于 TRUE。但是,我不明白为什么它还会删除第一个模式匹配前面的单词。我最初的猜测是它与争论模式_位置有关,实际上,如果我将其设置为“之后”,则会发生以下情况:

texts(corpus_segment(test, pattern="\\s{2,}", valuetype = "regex", pattern_position="after"))
text1.1  text1.2 
"start" "middle"

所以最后一个模式之后的单词被删掉了。我发现将 remove_pattern 设置为“FALSE”会保留所有三个单词并按照我的意图执行:

texts(corpus_segment(test, pattern="\\s{2,}", valuetype = "regex",  extract_pattern=FALSE))
 text1.1  text1.2  text1.3 
 "start" "middle"    "end" 

函数的文档说明如下:

"extract_pattern: 从文本中提取匹配的模式,如果为真则保存在 docvars 中"

"pattern_position: "before" 或 "after",取决于模式是在文本之前(如用户提供的标签,如以下示例中的##INTRO)还是在文本之后(如标点符号)分隔符)"

我没有看到这个文档如何解释为什么“开始”或“结束”会根据 pattern_position 参数被剪掉。

【问题讨论】:

    标签: quanteda


    【解决方案1】:

    这是一个很好的问题,我正在提交issue 看看这是否是我们想要的行为。

    请注意,char_segment() 的工作方式相同。

    library("quanteda")
    ## Package version: 2.0.0
    
    txt <- "start middle end"
    corp <- corpus(txt)
    
    corpus_segment(corp, " ", extract_pattern = FALSE)
    ## Corpus consisting of 3 documents.
    ## text1.1 :
    ## "start"
    ## 
    ## text1.2 :
    ## "middle"
    ## 
    ## text1.3 :
    ## "end"
    corpus_segment(corp, " ", extract_pattern = TRUE)
    ## Corpus consisting of 2 documents and 1 docvar.
    ## text1.1 :
    ## "middle"
    ## 
    ## text1.2 :
    ## "end"
    
    char_segment(txt, " ", remove_pattern = FALSE)
    ## [1] "start"  "middle" "end"
    char_segment(txt, " ", remove_pattern = TRUE)
    ## [1] "middle" "end"
    

    在从您的字符向量构造 quanteda 语料库对象之前,当然还有其他方法可以做到这一点,如下所示。 (如果您想要返回矢量,请将它们包装在 unlist() 中。)

    test <- "start  middle  end"
    
    stringi::stri_split_regex(test, "\\p{Zs}{2}")
    ## [[1]]
    ## [1] "start"  "middle" "end"
    
    base::strsplit(test, "\\s{2}")
    ## [[1]]
    ## [1] "start"  "middle" "end"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-21
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多