首页 > 解决方案 > 如何使用 quanteda 查找句子中某些单词出现在某些其他单词之前的实例

问题描述

作为一个 R 新手,通过使用 quanteda,我试图找到某个单词在句子中的另一个特定单词之前顺序出现在某处的实例。更具体地说,我正在寻找在语料库中的句子中“投资者”一词位于“应”一词之前某处的情况,该句子由摩洛哥和尼日利亚之间缔结的国际条约组成(文本可在此处找到:https ://edit.wti.org/app.php/document/show/bde2bcf4-e20b-4d05-a3f1-5b9eb86d3b3b)。

问题是有时这两个词之间有多个词。例如,有时会写成“投资人投资应”。我尝试应用此网站上提供的类似解决方案。当我在 ( Keyword in context (kwic) for skipgrams? ) 上尝试解决方案并运行以下代码时:

 kwic(corpus_mar_nga, phrase("investors * shall"))

我得到 0 个观察结果,因为这仅计算“投资者”和“应”之间只有一个词的情况。

当我遵循提供的另一个解决方案时(是否可以使用 `kwic` 函数来查找彼此靠近的单词?)并运行以下代码:

toks <- tokens(corpus_mar_nga)
toks_investors <- tokens_select(toks, "investors", window = 10)
kwic(toks_investors, "shall")

我遇到了“投资者”也出现在“应该”之后的情况,这从根本上改变了上下文,因为在这种情况下,句子的主语是不同的。

最后,除了“投资者应”的实例外,我还应该得到例如“投资者,他们的投资和东道国当局应”的实例,但我不能用上面的代码。

任何人都可以为我提供有关此问题的解决方案吗?

非常感谢提前!

标签: rnlptext-miningquanteda

解决方案


好问题。这里有两种方法,一种依赖于语料库文本上的正则表达式,第二种使用(正如@Kohei_Watanabe 在评论中建议的那样)使用 window for tokens_select()

首先,创建一些示例文本。

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

# sample text
txt <- c("The investors and their supporters shall do something.
          Shall we tell the investors?  Investors shall invest.
          Shall someone else do something?")

现在将其重塑为句子,因为您的搜索发生在句子中。

# reshape to sentences
corp <- txt %>%
  corpus() %>%
  corpus_reshape(to = "sentences")

方法 1 使用正则表达式。我们在“investors”之前添加一个边界(\\b),.+表示“investors”和“shall”之间的一个或多个任意字符。(这不会捕获换行符,但corpus_reshape(x, to = "sentences")会删除它们。)

# method 1: regular expressions
corp$flag <- stringi::stri_detect_regex(corp, "\\binvestors.+shall",
  case_insensitive = TRUE
)
print(corpus_subset(corp, flag == TRUE), -1, -1)
## Corpus consisting of 2 documents and 1 docvar.
## text1.1 :
## "The investors and their supporters shall do something."
## 
## text1.2 :
## "Investors shall invest."

第二种方法适用tokens_select()于不对称窗口,其中kwic(). 首先,我们选择所有包含“投资者”的文档(即句子),但之前丢弃代币,之后保留所有代币。之后的 1000 个令牌应该足够了。然后,应用kwic()我们保留所有上下文词的地方,但关注之后的词,根据定义,它必须在之后,因为第一个词是“投资者”。

# method 2: tokens_select()
toks <- tokens(corp)
tokens_select(toks, "investors", window = c(0, 1000)) %>%
  kwic("shall", window = 1000)
##                                                                     
##  [text1.1, 5] investors and their supporters | shall | do something.
##  [text1.3, 2]                      Investors | shall | invest.

选择取决于最适合您的需求。


推荐阅读