让我解释一下我想做什么。我有一个关于政治辩论的语料库数据(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“嘿,请给我第一行单词(法律,金钱或监狱...)和第二行单词(假,谎言或国家/地区之间)任何可能组合的同现位置。 )。希望我能以清楚的方式进行解释。对于语言错误,我们深表歉意。谢谢!
答案 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)
我认为您的问题比使用正则表达式要复杂得多。例如,您可能愿意在一组中包括law
,legal
和legislation
,但不包括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。