【问题标题】:textstat_keyness for POS, not wordsPOS 的 textstat_keyness,而不是单词
【发布时间】:2019-10-07 17:41:28
【问题描述】:

Quanteda 中的 textstat_keyness 用于比较两个(子)语料库中 WORDS/LEMMAS 的相对频率。但我想比较词性而不是单词。然后我想绘制它。我已经能够使用 textstat_keyness 来表示单词,没问题,使用以下方法:

# compare subcorpusA v subcorpusB terms using grouping
genre <- ifelse(docvars(corpusAB, "genre") == "group", "group", "group2")
dfmat3 <- dfm(corpusAB, groups = genre)
head(tstat1 <- textstat_keyness(dfmat3, measure = "lr", sort = TRUE, correction =  "williams"), 20)
tail(tstat1, 20)
head(dfmat3)
textplot_keyness(tstat1, show_reference = TRUE, 
                 show_legend = TRUE, 
                 n = 40, 
                 min_count = 5, margin = 0.05,
                 color = c("darkblue", "gray")
                 , labelcolor = "gray30",
                 labelsize = 2,
                 font = NULL)

我还使用 tokens() 对语料库进行了标记,并使用 spacy_parse 进行了解析。但我无法弄清楚如何将两者联系起来。有没有办法告诉 Quanteda 在 POS 而不是 word 上运行 textstat_keyness?

【问题讨论】:

    标签: quanteda tagged-corpus


    【解决方案1】:

    为此,您需要标记 POS,然后将 POS 视为令牌。使用 spacyr 包很容易做到这一点,它与 quanteda 很好地集成。

    library("quanteda")
    ## Package version: 1.5.1
    ## Parallel computing: 2 of 12 threads used.
    
    library("spacyr")
    
    # parse just Obama 2013 and Trump 2017
    corp <- data_corpus_inaugural %>%
      corpus_subset(Year > 2012)
    stoks <- spacy_parse(corp)
    ## Found 'spacy_condaenv'. spacyr will use this environment
    ## successfully initialized (spaCy Version: 2.1.4, language model: en)
    ## (python options: type = "condaenv", value = "spacy_condaenv")
    head(stoks)
    ##       doc_id sentence_id token_id     token     lemma   pos   entity
    ## 1 2013-Obama           1        1      Vice      Vice PROPN         
    ## 2 2013-Obama           1        2 President President PROPN         
    ## 3 2013-Obama           1        3     Biden     Biden PROPN PERSON_B
    ## 4 2013-Obama           1        4         ,         , PUNCT         
    ## 5 2013-Obama           1        5       Mr.       Mr. PROPN         
    ## 6 2013-Obama           1        6     Chief     Chief PROPN
    

    这只是一个data.frame,所以我们可以用POS列替换token。

    # replace token with its POS tag
    stoks$token <- stoks$pos
    
    # convert to quanteda tokens and build dfm
    qtoks <- as.tokens(stoks)
    lapply(qtoks, head)
    ## $`2013-Obama`
    ## [1] "PROPN" "PROPN" "PROPN" "PUNCT" "PROPN" "PROPN"
    ## 
    ## $`2017-Trump`
    ## [1] "PROPN" "PROPN" "PROPN" "PUNCT" "PROPN" "PROPN"
    

    现在,在 POS 上计算键值很简单。

    # build dfm and test keyness
    dfm(qtoks, tolower = FALSE) %>%
      textstat_keyness()
    ##    feature          chi2            p n_target n_reference
    ## 1      ADP   6.387342458 1.149370e-02      283         164
    ## 2     NOUN   5.476967163 1.926866e-02      480         301
    ## 3      DET   2.817500159 9.324152e-02      325         207
    ## 4     PRON   1.892097227 1.689656e-01      144          88
    ## 5      AUX   1.816335501 1.777501e-01        7           1
    ## 6     PART   0.292103144 5.888759e-01       45          29
    ## 7     VERB   0.009290769 9.232119e-01      392         285
    ## 8      ADJ  -0.016739029 8.970574e-01      133          99
    ## 9    CCONJ  -0.565423892 4.520831e-01      116          94
    ## 10     ADV  -0.710485982 3.992825e-01      134         109
    ## 11    INTJ  -0.878721837 3.485520e-01        0           2
    ## 12     NUM  -1.367004189 2.423273e-01       10          12
    ## 13   PROPN  -7.214619688 7.231213e-03       56          66
    ## 14   PUNCT  -7.990735309 4.701732e-03      228         215
    ## 15   SPACE -36.058636043 1.914683e-09       28          71
    

    模式?奥巴马(目标)使用了更多的“介词”(介词和后置词),特朗普使用了更多的空格。 (太空部队 - 去看看。)

    【讨论】:

    • 感谢您的帮助。花了一段时间,但我现在看到你做了什么。就职演说数据包括每位总统的一份文本。我的数据集不同,这让我有些困惑。我必须使用语料库 A 和 B。每个语料库 (a) 代表一个特定的流派,并且 (b) 有 600 多个短文本。
    • 当我运行 space_parse 时,文档变量消失了。所以 quanteda 不知道要考虑什么目标或参考。 doc_id 结构是这样的:genreA.csv.1,genreA.csv.2 ...genreB.csv.1,genreB.csv.2,...我应该将每种类型合并成一个文本吗?或者有没有更好的方法来告诉 quanteda 如何区分目标语料库和参考语料库?再次感谢。
    • 这不是问题,也不是很清楚。我可以建议您使用可重现的、尽可能简单的问题表示法来打开一个新问题吗?
    猜你喜欢
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    相关资源
    最近更新 更多