使用R查找数据集中的任何单词是否出现在其他数据集中的句子中

使用R查找数据集中的任何单词是否出现在其他数据集中的句子中,r,dplyr,text-mining,mutate,grepl,R,Dplyr,Text Mining,Mutate,Grepl,我有一个数据集,其中包含一个名为“句子”的变量,其中包含句子。 这是一个可复制的小版本 structure(list(section = c("id111", "id111", "id111", "id111", "id111", "id111", "id111", "id111", "id111", "

我有一个数据集,其中包含一个名为“句子”的变量,其中包含句子。 这是一个可复制的小版本


structure(list(section = c("id111", "id111", "id111", "id111", 
"id111", "id111", "id111", "id111", "id111", "id111", "id111", 
"id111", "id111", "id111", "id111"), sentence = c("Es wird Abschied genommen, aber auf Wiedersehen  Die Großmama hatte einen Tag vor ihrer Ankunft noch einen Brief nach der Alp hinauf geschrieben, damit sie oben bestimmt wüßten, daß sie komme.", 
"Diesen Brief brachte am andern Tage der Peter in der Frühe mit sich, als er auf die Weide zog.", 
"Schon war der Großvater mit den Kindern aus der Hütte getreten, und auch Schwänli und Bärli standen beide draußen und schüttelten lustig ihre Köpfe in der frischen Morgenluft, während die Kinder sie streichelten und ihnen glückliche Reise wünschten zu ihrer Bergfahrt.", 
"Behaglich stand der Öhi dabei und schaute bald auf die frischen Gesichter der Kinder, bald auf seine sauber glänzenden Geißen nieder.", 
"Beides mußte ihm gefallen, denn er lächelte vergnüglich.", 
"Jetzt kam der Peter heran.", "Als er die Gruppe gewahr wurde, näherte er sich langsam, streckte den Brief dem Öhi entgegen, und sobald dieser ihn erfaßt hatte, sprang er scheu zurück, so als ob ihn etwas erschreckt habe, und dann guckte er schnell hinter sich, gerade als ob von hinten ihn auch noch etwas hätte erschrecken wollen; dann machte er einen Sprung und lief davon, den Berg hinauf.", 
"»Großvater«, sagte das Heidi, das dem Vorgang verwundert zugeschaut hatte, »warum tut der Peter jetzt immer wie der große Türk, wenn der eine Rute hinter sich merkt; dann scheut er mit dem Kopf und schüttelt ihn nach allen Seiten und macht auf einmal Sprünge in die Luft hinauf.«", 
"»Vielleicht merkt der Peter auch eine Rute hinter sich, die er verdient«, antwortete der Großvater.", 
"Nur die erste Halde hinauf lief der Peter so in einem Zuge davon; sobald man ihn von unten nicht mehr sehen konnte, kam es anders.", 
"Da stand er still und drehte scheu den Kopf nach allen Seiten.", 
"Plötzlich tat er einen Sprung und schaute hinter sich, so erschreckt, als habe ihn eben einer im Genick gepackt.", 
"Hinter jedem Busch hervor, aus jeder Hecke heraus meinte jetzt der Peter den Polizeidiener aus Frankfurt auf sich losstürzen zu sehen.", 
"Je länger aber diese gespannte Erwartung dauerte, je schreckhafter wurde es dem Peter zumute, er hatte keinen ruhigen Augenblick mehr.", 
"Nun mußte das Heidi seine Hütte aufräumen, denn die Großmama sollte doch alles in guter Ordnung finden, wenn sie kam."
), type = c("chapter", "chapter", "chapter", "chapter", "chapter", 
"chapter", "chapter", "chapter", "chapter", "chapter", "chapter", 
"chapter", "chapter", "chapter", "chapter"), ch_n = c(1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), book = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("book1", 
"book2"), class = "factor"), sentence_id = 1:15, freq = c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L)), row.names = c(NA, 
-15L), groups = structure(list(sentence = c("»Großvater«, sagte das Heidi, das dem Vorgang verwundert zugeschaut hatte, »warum tut der Peter jetzt immer wie der große Türk, wenn der eine Rute hinter sich merkt; dann scheut er mit dem Kopf und schüttelt ihn nach allen Seiten und macht auf einmal Sprünge in die Luft hinauf.«", 
"»Vielleicht merkt der Peter auch eine Rute hinter sich, die er verdient«, antwortete der Großvater.", 
"Als er die Gruppe gewahr wurde, näherte er sich langsam, streckte den Brief dem Öhi entgegen, und sobald dieser ihn erfaßt hatte, sprang er scheu zurück, so als ob ihn etwas erschreckt habe, und dann guckte er schnell hinter sich, gerade als ob von hinten ihn auch noch etwas hätte erschrecken wollen; dann machte er einen Sprung und lief davon, den Berg hinauf.", 
"Behaglich stand der Öhi dabei und schaute bald auf die frischen Gesichter der Kinder, bald auf seine sauber glänzenden Geißen nieder.", 
"Beides mußte ihm gefallen, denn er lächelte vergnüglich.", 
"Da stand er still und drehte scheu den Kopf nach allen Seiten.", 
"Diesen Brief brachte am andern Tage der Peter in der Frühe mit sich, als er auf die Weide zog.", 
"Es wird Abschied genommen, aber auf Wiedersehen  Die Großmama hatte einen Tag vor ihrer Ankunft noch einen Brief nach der Alp hinauf geschrieben, damit sie oben bestimmt wüßten, daß sie komme.", 
"Hinter jedem Busch hervor, aus jeder Hecke heraus meinte jetzt der Peter den Polizeidiener aus Frankfurt auf sich losstürzen zu sehen.", 
"Je länger aber diese gespannte Erwartung dauerte, je schreckhafter wurde es dem Peter zumute, er hatte keinen ruhigen Augenblick mehr.", 
"Jetzt kam der Peter heran.", "Nun mußte das Heidi seine Hütte aufräumen, denn die Großmama sollte doch alles in guter Ordnung finden, wenn sie kam.", 
"Nur die erste Halde hinauf lief der Peter so in einem Zuge davon; sobald man ihn von unten nicht mehr sehen konnte, kam es anders.", 
"Plötzlich tat er einen Sprung und schaute hinter sich, so erschreckt, als habe ihn eben einer im Genick gepackt.", 
"Schon war der Großvater mit den Kindern aus der Hütte getreten, und auch Schwänli und Bärli standen beide draußen und schüttelten lustig ihre Köpfe in der frischen Morgenluft, während die Kinder sie streichelten und ihnen glückliche Reise wünschten zu ihrer Bergfahrt."
), .rows = structure(list(8L, 9L, 7L, 4L, 5L, 11L, 2L, 1L, 13L, 
    14L, 6L, 15L, 10L, 12L, 3L), ptype = integer(0), class = c("vctrs_list_of", 
"vctrs_vctr", "list"))), row.names = c(NA, 15L), class = c("tbl_df", 
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"))

然后我有一个单词列表,下面是一个简化版本:

structure(list(word = c("Ära", "Arsenfahlerz", "Arsenikbleispath", 
"Arsensaures", "Blei", "Aufschiebung", "Ausliegerberg", "Baltischer", 
"Schild", "Bänderton", "Bändertondatierung", "Bändertonkalender", 
"Beben", "Bebenherd", "Belgit", "Hüttenwesen", "Bergbau", "Bergkamm", 
"Bergmassiv", "Bergmehl", "Bergsporn", "Bergstock", "Binnit", 
"Biostratigrafie", "Biostratigraphie", "Blattsilikat", "Blattverschiebung", 
"Bleiapatit", "Block", "Blutjaspis", "Bodenerhebung", "Bodenkunde", 
"Bodenwissenschaft", "Böhmische", "Masse", "Böhmisches", "Hochland", 
"Massiv", "Bolus", "Alba", "Bongo", "Berge", "Braunauer", "Wände", 
"Braunbleierz", "Brauner", "Glaskopf", "Jura", "Braunjura", "Bruch", 
"Bruchflügel", "Bruchlinie", "Bruchschollentektonik", "Bruchtektonik", 
"Buckel", "Budweis", "Wittingauer", "Tiefplatte", "Bühel", "Bühl", 
"Buntbleierz", "Calciovolborthit", "Calciumcarbonat", "Calciumkarbonat", 
"Calciumsulfat", "Cassiterit", "Celit", "Cevennen", "Chalcedon", 
"Chalkosin", "Chalzedon", "Chilenische", "Schweiz", "Chronostratigrafie", 
"Chronostratigraphie", "Coltan", "Columbeisen", "Columbit", "Conichalcit", 
"Danakil", "Deflation", "Depression", "Desertation", "Desertifikation", 
"Diatomeenerde", "Diatomeenpelit", "Diatomit", "Diatrema", "Dislokation", 
"Dolomit", "Dolomitstein", "Donau", "Iller", "Lech", "dunkles", 
"Fahlerz", "Durchschlagsröhre", "Edaphologie", "Eem", "Interglazial", 
"Warmzeit", "Effusivgestein", "einfache", "Scherung", "Einzugsgebiet", 
"Eisenerz", "Eisenkies", "Eisensulfid", "Eisvulkan", "Eiszeit", 
"Eiszeitalter", "Endmoräne", "endogene", "Dynamik", "Prozesse", 
"Entwässerungsgebiet", "Epirogenese", "Epizentrum", "Erdbeben", 
"Erdbebenforscher", "Erdbebenschwarm", "Erdbebenwarte", "Erdbebenwelle", 
"Erdbebenzentrum", "Erdkruste", "Erdrinde", "Erdstoß", "Erdzeitalter", 
"Ergussgestein", "Erhebung", "Erhöhung", "Erosion", "Erratiker", 
"erratischer", "Eruptionsschlot", "Eruptivgestein", "Erz", "Expansionshypothese", 
"Extrusivgestein", "Falkengebirge", "Faulschlamm", "Fels", "Felsblock", 
"Felsburg", "Felsen", "Felsenkunde", "Felsmechanik", "Felsnadel", 
"Felsnase", "Felssporn", "Felsturm")), row.names = c(NA, -151L
), class = c("tbl_df", "tbl", "data.frame"))
如何向第一个数据集中添加列,例如,如果第二个数据集中的任何单词出现在句子中,它将被称为“geo”,并对每个句子说“yes”,如果没有,则说“no”?

Base R解决方案:

df$geo <- Vectorize(grepl)(paste0(" ", tolower(search_words), " "),
                        gsub("[[:punct:]]", " ", tolower(df$sentence)))
df$geoBase R解决方案:

df$geo <- Vectorize(grepl)(paste0(" ", tolower(search_words), " "),
                        gsub("[[:punct:]]", " ", tolower(df$sentence)))

df$geo如果您仍在寻找解决方案,您可以尝试使用基于tidyverse版本R的字符串功能的解决方案

对于原始数据框中的每个句子,您希望检查单词列表中的每个单词,以查看它们是否出现在句子中。请注意,我已将您的
df
名称更改为
word\u df

   library(stringr)

   for (i in 1:nrow(word_df)) {
   word_check <- function (x) {
   str_detect(word_df$sentence[i],x)
   }
   word_df$geo[i]<- any(sapply(word_list, word_check))
   }
   word_df
库(stringr)
for(i in 1:nrow(word_df)){

word_check如果您仍在寻找解决方案,您可以尝试使用基于tidyverse版本R的字符串功能的解决方案

对于原始数据框中的每个句子,您希望检查单词列表中的每个单词,以查看它们是否出现在句子中。请注意,我已将您的
df
的名称更改为
word\u df

   library(stringr)

   for (i in 1:nrow(word_df)) {
   word_check <- function (x) {
   str_detect(word_df$sentence[i],x)
   }
   word_df$geo[i]<- any(sapply(word_list, word_check))
   }
   word_df
库(stringr)
for(i in 1:nrow(word_df)){

word_check可能尝试
grepl(粘贴0(dfwords$word,collapse='|'),dfglobal$句子,ignore.case=T)
谢谢!我尝试了,但它给了我以下错误:
grepl中的错误(粘贴0(geo_all$word,collapse=“|”),heidi_句子$句子,:无效的正则表达式,原因是“内存不足”
两件事,检查您的变量是否为字符类型。还有您的数据帧有多长?好的,是的,它们都是字符变量,这个示例来自一个约有4000行2007672字节的数据集。请注意,整个数据集将为100字节mes biggerMaybe try
grepl(粘贴0(dfwords$word,collapse='|'),dfglobal$句子,ignore.case=T)
谢谢!我试过了,但它给了我以下错误:
grepl中的错误(粘贴0(geo_all$word,collapse=“|”),heidi_句子$句子,:无效的正则表达式,原因是“内存不足”
两件事,检查您的变量是否为字符类型。还有您的数据帧有多长?好的,是的,它们都是字符变量,这个示例来自一个约有4000行2007672字节的数据集。请注意,整个数据集将为100字节mes Bigger感谢!原则上它是有效的,但当我将它应用到更大的数据集时,它再次给我带来相同的错误:
grepl中的错误(search\u patterns,x):无效的正则表达式,原因是“内存不足”
Hi,再次感谢。仍然是一个错误:如果我的单词列表是字符元素,如
dput(geo\u all[1:10])c(“卡佩尔艺术”、“卡德雷特”、“比西格舞曲”、“弗朗克斯舞曲”、“艾普拉舞曲”、“奥切塔兹舞曲”、“奥梅舞曲”、“布利安茨舞曲”、“布利安萨尔达舞曲”)
我得到以下信息:
。较长的参数不是较短长度的倍数错误:分配的数据'value'必须与现有数据兼容。x现有数据有3983行。x分配的数据有112318行。ℹ 只有大小为1的向量被回收。
如果我将其转换为列表或数据框,请执行以下操作:
grepl中的错误(x,vec\u to\u搜索):正则表达式无效,原因是“内存不足”
@Grig抱歉,我本想使用的是语句向量,而不是以前创建的正则表达式字符串。请使用上面编辑的解决方案。谢谢!原则上它是有效的,但当我将其应用于更大的数据集时,它会再次给我相同的错误:
grepl中的错误(搜索模式,x):无效的正则表达式,原因是“内存不足”
Hi,再次感谢。仍然是一个错误:如果我的单词列表是字符元素,例如
dput(geo_all[1:10])c(“卡佩尔艺术”、“库德雷特”、“比西格”、“弗朗克斯”、“勒佩拉”、“勒帕拉”、“勒奥切塔兹”、“勒姆”、“勒布利安特”、“勒安萨达”)
我得到以下信息:
。较长的参数不是较短长度的倍数错误:分配的数据'value'必须与现有数据兼容。x现有数据有3983行。x分配的数据有112318行。ℹ 只有大小为1的向量可以循环使用。
如果我将其转换为列表或数据。框架如下:
grepl(x,vec_to_search)中的错误:正则表达式无效,原因是“内存不足”
@Grig抱歉,我想使用的是语句向量,而不是以前创建的正则表达式字符串。请使用上面编辑的解决方案。