【发布时间】:2018-05-22 01:04:13
【问题描述】:
我已经非常满意 quanteda 的 textstat_collocation() 用于提取 MWE。现在我正在尝试提取与特定模式匹配的所有匹配项,而不管它们的频率如何。
我的目标是通过从使用正则表达式模式构建的 dfm() 中提取专长名称来创建字符向量。然后,我将在“select”参数中使用此字符向量来构建 dfm。我可能还想使用这个字符向量添加到字典中,用作在管道后期构建 dfms 的本体。
模式是:“aged xx-xx”,其中 x 是一个数字。
我使用了正则表达式模式 "aged\s([0-9]{2}-[0-9]{2})" here 并获得了所需的匹配项。但是当我在 R 中尝试时(在“\s”之前添加一个额外的“\”),我没有得到任何匹配。
当我这样做时:
txt <- c("In India, male smokers aged 20-45 perceive brandX positively.",
"In Spain, female buyers aged 30-39 don't purchase brandY.")
ageGroups <- dfm(txt, select = "aged\\s([0-9]{2}-[0-9]{2})", valuetype = "regex")
featnames(ageGroups)
我明白了:
character(0)
但是,当我尝试时:
ageGroups <- dfm(txt, select = "([0-9]{2}-[0-9]{2})", valuetype = "regex")
featnames(ageGroups)
我明白了:
[1] "20-45" "30-39"
似乎我无法捕获正则表达式中的空白。我在 SO 中遇到了许多类似的问题,也许 this 是最相关的,但仍然无法实现我的具体目标。
我也试过了:
tokens <- tokens(txt, remove_punct = FALSE, remove_numbers = FALSE, remove_symbols = FALSE)
tokensCompunded <- tokens_compound(tokens, pattern = "aged\\s([0-9]{2}-[0-9]{2})", valuetype = "regex")
attr(tokensCompunded, "types")
但我拿回了所有代币:
[1] "In" " " "India" "," "male" "smokers" "aged" "20-45" "perceive"
[10] "brandX" "positively" "." "Spain" "female" "buyers" "30-39" "don't" "purchase"
[19] "brandY"
我认为可能还有其他几种更有效的方法可以使用带有 quanteda 的正则表达式(或 glob)来提取字符向量,我很高兴学习如何使用这个令人惊叹的 R 包的新方法。
感谢您的帮助!
修改原始问题:
ThisSO 中的其他问题也有类似的要求,即使用 kwic 对象检测多词短语,并且可以通过以下添加进一步扩展以实现上述目标: p>
kwicObject <- kwic(corpus, pattern = phrase("aged ([0-9]{2}-[0-9]{2})"), valuetype = "regex")
unique(kwicObject$keyword)
【问题讨论】:
-
感谢维克托!当我使用 'pattern = phrase("aged\\s+([0-9]{2}-[0-9]{2})")' 创建 kwic 对象时,我得到 "kwic object with 0 rows" .我还尝试使用 tokens_select() 和 tokens_compound() 并在 attr(x, "type") 时得到 "character(0)"。但是,Ken 的“年龄 [0-9]{2}-[0-9]{2}”对于创建具有多词短语的 kwic 对象也确实有效。
-
我认为这个问题应该重新打开,因为它不是一个 exact 副本。关闭可能与关闭者的其他答案竞争的问题似乎也有点不礼貌。