【问题标题】:Quanteda: How to look up patterns of two or more words in a phrase, when there can be any number of words in between?Quanteda:当一个短语之间可以有任意数量的单词时,如何查找短语中两个或多个单词的模式?
【发布时间】:2020-05-28 18:55:35
【问题描述】:

我想使用包{quanteda} 和默认valuetype="glob"tokens_lookup() 函数来匹配R 中文本中的一些模式。该模式将是一个单词与位于同一短语中任意位置的第二个单词相关联。

library(quanteda)

text <- c(d1 = "apples word word word oranges", 
          d2 = "apples oranges", 
          d3 = "oranges and apples")

dict <- dictionary(list(fruits = c("apple* orange*")))

tokens(text) %>% 
  tokens_lookup(dict, valuetype = "glob") %>% 
  dfm()

将此字典应用到上面的标记化文本会产生 0-1-0 的结果,而我希望得到 1-1-0。

所以我的问题是,glob 模式匹配中的空格是什么,星号不应该匹配包括空格在内的所有内容?更一般地,如何将 d1、d2 和可能的 d3 与一个相同的模式匹配?

编辑:

在正则表达式模式匹配中,这不是什么大问题。示例:

text <- c(d1 = "apples word word word oranges", 
          d2 = "apples oranges")

dict <- dictionary(list(fruits = c("apples.*oranges")))

tokens(text, what="sentence") %>%
  tokens_lookup(dict, valuetype = "regex") %>%
  dfm()

【问题讨论】:

  • 使用 dictionary(list(fruits = c("apple*", "orange*"))) 将得到 2-2-2,而不是 0-1-0
  • 哦,对了,但我想使用您指定单词组合的 ngram。想象一下像“我讨厌苹果”、“苹果是我讨厌的东西”、“我喜欢苹果”之类的事情,然后您想要过滤出针对苹果的陈述。
  • 你想看到什么结果?你期待 d3 的比赛吗? (因为顺序不同)
  • 不,实际上我只是希望前两个匹配,然后我认为我可以切换顺序以处理橙色优先的实例。
  • 感谢大家回答我的问题,顺便说一句! Quanteda 是一个非常酷的软件包!

标签: r dictionary glob quanteda


【解决方案1】:

tokens() 在空格上分段,tokens_lookup() 在标记中查找模式 - 如果模式在您的字典值中包含空格,则在标记序列中查找模式。要使用 glob 匹配来获取两个更具体模式之间的任何标记,您可以指定 * 作为该模式的一部分。 (从技术上讲,带有空格的模式被解析为在 quanteda-speak 中称为“短语”的序列。参见 ?phrase。)

所以稍微修改你的例子:

library("quanteda")
## Package version: 2.0.1

text <- c(
  d1 = "apples word word oranges",
  d2 = "apples and oranges",
  d3 = "oranges and apples"
)

dict <- dictionary(list(fruits = c(
  "apple* * orange*",
  "apple* * * orange*"
)))

tokens(text) %>%
  tokens_lookup(dict, valuetype = "glob", exclusive = FALSE)
## Tokens consisting of 3 documents.
## d1 :
## [1] "FRUITS"
## 
## d2 :
## [1] "FRUITS"
## 
## d3 :
## [1] "oranges" "and"     "apples"

在这里,我们得到apple* 后跟任何令牌之一或两个任何令牌,然后是orange* 的模式。

这将不会拾取“橙色”后跟“苹果”,但是因为这是相反的序列,并且不会只拾取“苹果橙”,因为它们之间没有任何标记。 (但您可以通过向您的 fruits 键添加第三个值来添加这种情况,就像 `"apple* orange*"。)

【讨论】:

  • 再次感谢您,这真的很有帮助。但是,如果我想匹配一个可以是 任意长度 并且包含两个单词的短语(无论是双拼还是两个单词在短语中以特定顺序同时出现)怎么办? )?在正则表达式模式匹配中,这不是问题(参见我的编辑,上面)。
  • 虽然这不会跨越标记,所以不会像我们实现解析标记+解析模式然后将标记序列匹配到短语的方法那样工作。您必须在原始文本上使用逻辑正则表达式匹配来实现匹配。
  • 嗯,你确定不行吗?在上面的示例中,至少对于正则表达式匹配,它似乎工作得很好(参见“编辑”)。 what="sentence" 应该基本上保留句子结构,不是吗?
猜你喜欢
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-11
  • 1970-01-01
  • 1970-01-01
  • 2019-06-12
相关资源
最近更新 更多