R:如何使用RegEx使用析取词搜索多个单词

时间:2018-12-23 13:29:35

标签: r regex

让我解释一下我想做什么。我有一个关于政治辩论的语料库数据(1500万个单词),我想在1万个单词之内找到两个词的共现词。

我创建两个位置的向量,分别为“ false”和“ law”。

false.v <- c(133844, 133880, 145106, 150995, 152516, 152557, 153697, 155507)   
law.v <- c(48064, 155644, 251315, 297303, 323417, 349576, 368052, 543487)

然后,我想使用“外部”功能将它们收集在矩阵上以查看共现。这些位置来自同一语料库,所以我创建了一个差异矩阵:

distances <- outer(false.v, law.v, "-")

要使其易于阅读,请命名:

rownames(distances) <- paste0("False", false.v)  
colnames(distances) <- paste0("Law", law.v)

好的,所以我们准备好矩阵了。要查找哪些位置彼此之间的距离不超过10000个字,我只需运行:

abs(distances) <= 10000

因此,我必须在政治辩论中确定那些同时发生的频率更高的时刻。问题来了。我必须用多个词(实际上是5个左右的词)来做,所以如果我一次只能搜索多个词而不是两个对,那就太好了。因此,搜索“ false或lie或其他”和“ law或money或其他”而不是搜索“ false”和“ law”。我想我必须为此使用RegEx,不是吗?我只是尝试了一切,却无济于事。

我刚才给出的例子是一个简化。我用来搜索单词的命令是从语料库中创建一个向量:

positions.law.v <- which(C1.corpus.v == "law")

如果我可以使用

之类的东西,那就太好了
which(C1.corpus.v == "law OR money OR prison OR ...")

which(C1.corpus.v == "false OR lie OR country OR ...")

这就像告诉R“嘿,请给我第一行单词(法律,金钱或监狱...)和第二行单词(假,谎言或国家/地区之间)任何可能组合的同现位置。 )。希望我能以清楚的方式进行解释。对于语言错误,我们深表歉意。谢谢!

3 个答案:

答案 0 :(得分:1)

尝试:

library(quanteda)

我将使用2010年以来英国9个政党的选举宣言:

data_char_ukimmig2010

创建令牌对象(设置很多-检出https://quanteda.io/

mytoks <- data_char_ukimmig2010 %>%
  char_tolower() %>%
  tokens()

mywords = c("law", "money", "prison", "false", "lie", "country")

kwic“返回用户在其直接上下文中提供的关键字列表,以标识源文本和源文本中的单词索引号” source

mykwic <- kwic(mytoks, mywords)

kwic构建具有各种功能的数据框,其中之一是关键字的整数值起始位置(因为您可以使用它来查找短语):

mykwic$from

给我们:

> mykwic$from
 [1]  130  438  943 1259 1281 1305 1339 1356 1743 1836 1859 2126 2187 2443 2546 2640 2763 2952 3186 3270  179    8  201
[24]  343  354  391  498   16  131  552   14   29  388   80  306  487  507

答案 1 :(得分:1)

library(dplyr)

我在这里也有一个扩展的答案,但这可能很简单:

mywords = c("law", "money", "prison", "false", "lie", "country")

which(C1.corpus.v %in% mywords)

答案 2 :(得分:1)

我认为您的问题比使用正则表达式要复杂得多。例如,您可能愿意在一组中包括lawlegallegislation,但不包括lawless。像\blaw.*\b这样的正则表达式对您没有多大帮助。实际上,您对以下内容感兴趣:

  • 创建特征共现矩阵
  • 结合单词的语义接近度

特征同现矩阵

这是一项既定的任务,我鼓励您使用经过测试的解决方案,例如fcm函数。要介绍文档中的示例:

txt <- "A D A C E A D F E B A C E D"
fcm(txt, context = "window", window = 2)
fcm(txt, context = "window", count = "weighted", window = 3)
fcm(txt, context = "window", count = "weighted", window = 3, 
             weights = c(3, 2, 1), ordered = TRUE, tri = FALSE)

您的正则表达式

为您的特定问题提供解决方案。这个:

which(C1.corpus.v == "law OR money OR prison OR ...")

其中

C1.corpus.v <- c("law", "word", "something","legal", "stuff")

你可以做

grep(
    pattern = paste("legal", "law", "som.*", sep = "|"),
    x = C1.corpus.v,
    perl = TRUE,
    value = FALSE
)

其中sep = "|"用作您的...OR...。恕我直言,这不是您想要的,因为它没有解决语义相似性。我建议您看一下网上 1,2 上的一些很好的教程。


1 泰勒·阿诺德(Taylor Arnold)和劳伦·蒂尔顿(Lauren Tilton)Basic Text Processing in R 2 伊斯兰教,阿米努尔和墨彭,戴安娜。 (2008)。 Semantic Text Similarity Using Corpus-Based Word Similarity and String Similarity。 TKDD。 2. 10.1145 / 1376815.1376819。