【问题标题】:Problem with multiword dictionaries in quanteda using dfm_lookup使用 dfm_lookup 的 quanteda 中的多字词典问题
【发布时间】:2020-03-12 20:39:22
【问题描述】:

我是使用 R 和 quanteda 的初学者,即使阅读过类似的帖子,我也无法解决以下问题。

我有一个从 Stata 导入的数据集,其中“文本”列包含来自变量“组”标识的不同人群的推文。我想通过以下方式计算我的字典在组级别识别的单词的出现次数:

这是一个可重现的例子:

dput(tweets[1:4, ])
structure(list(tweet_id = c("174457180812_10156824364270813", 
"174457180812_10156824136360813", "174457180812_10156823535820813", 
"174457180812_10156823868565813"), tweet_message = c("Climate change is a big issue", 
"We should care about the environment", "Let's rethink environmental policies", 
"#Davos WEF"
), date = c("2019-03-25T23:03:56+0000", "2019-03-25T21:10:36+0000", 
"2019-03-25T21:00:03+0000", "2019-03-25T20:00:03+0000"), group = c("1", 
"2", "3", "4")), row.names = c(NA, -4L), class = c("tbl_df", 
"tbl", "data.frame"))

首先我创建我的字典:

    climatechange_dict <- dictionary(list(
  climate = c(
    "environment*",
    "climate change")))

然后我指定语料库

climate_corpus <- corpus(tweets$tweet_message)

我为每个组创建一个 dfm:

group1_dfm <- dfm(corpus_subset(climate_corpus, tweets$group == "1"))

然后我尝试计算每个组的字典中单词的频率:

group1_climate <- dfm_lookup(group1_dfm, dictionary = climatechange_dict)
group1 <- subset(tweets, tweets$group == "1")
group1$climatescore <- as.numeric(group1_climate[,1])

group1$climate <- "normal"
group1$climate[group1$climatescore > 0] <- "climate"
table(group1$climate)

我的问题是这样多词词典条目,如“气候变化”不计算在内。我已经在线阅读我需要将 tokens_lookup() 应用于令牌然后构造 dfm,但在这种情况下我不知道该怎么做。如果您能在这方面帮助我,我将不胜感激。 非常感谢!

【问题讨论】:

  • 您能否编辑您的帖子以添加一些示例或模拟语料库文本数据供我们用于解决此问题?这会让别人更容易帮助你。
  • 抱歉,我已经编辑了我的帖子。

标签: r dictionary quanteda


【解决方案1】:

由于您没有提供可重现的示例,因此很难确保这会起作用,但试试这个:

climate_corpus <- corpus(tweets, text_field = "tweet_message")

climatechange_dict <- 
    dictionary(list(climate = c("environment*", "climate change")))

groupeddfm <- tokens(climate_corpus) %>%
    tokens_lookup(dictionary = climatechange_dict) %>%
    dfm(groups = "group")

执行以下操作:

  • 从您的tweets data.frame 创建一个语料库,并将其他变量添加为 docvars。 (如果您知道哪个是唯一的文档标识符,您也可以使用 docid_field = "&lt;yourdocidentifier&gt;" 指定该列。)

  • 对令牌进行字典“查找”操作,这意味着您将选择“气候变化”等短语。 dfm_lookup() 不会发生这种情况,因为 dfm() 将标记转换为不再有顺序记录的“特征”,因此无法恢复短语。

  • 根据tweetsgroup 列将文档合并到组中。这消除了使用子集进行任何手动分组的需要。 (我想这就是你想要的,对吧?)

生成的 dfm 将为 ngroups x 1,其中 1 是字典的单个键。您可以使用 convert() 轻松地将其强制转换为 data.frame 或其他格式。

【讨论】:

  • 非常感谢,这很有帮助!我编辑了我的帖子,添加了一个可重现的示例。我有一个问题:使用上面的字典计算的总频率高于产生的总和 length(grep('climate change', tweets$tweet_message)) 和 length(grep('environment?', tweets$tweet_message)) 的计数。正常吗?再次感谢!
  • 可能是因为默认grep 区分大小写,而dictionary 将所有内容都转换为小写?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多