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

find if any word in a dataset appears in sentences in other dataset with R

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


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”并且对每个句子说“是” ,如果不是,则为“否”?

基础 R 解决方案:

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

数据:

df <- 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"))


search_words <- 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"))

如果您仍在寻找解决方案,可以试试这个基于 R 字符串功能的 tidyverse 版本的方法。

对于原始数据框中的每个句子,您要检查单词列表中的每个单词以查看它们是否出现在句子中。请注意,我将您的 df 的名称更改为 word_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

我创建了“word_check”函数,它使用 stringr 中的 str_detect 函数来检查单词列表中的单词是否出现在句子中。然后我使用 sapply 来对照句子检查单词列表中的每个单词。然后我使用 any 为句子分配 TRUE 的值,如果单词列表中的任何单词出现在其中。 for 循环然后对每个句子重复此过程(即更改用于检查单词列表的原始 df 的索引)。

我相信你的原始数据没有任何匹配项,这使得检查解决方案是否正确变得更加困难,但我改变了一些词,使列表中的词出现在句子中,看起来是正在工作。

如果您觉得 for 循环运行太慢,您也可以考虑嵌套 sapply 语句。