मैं नीचे कोड करने के लिए कुशल तरीके की तलाश में हूं। मैं ऐसी किसी भी चीज़ की तलाश में हूँ जिसमें टेक्स्ट में ऐड और प्याज हो तो वह मिला और अगर नहीं है तो नहीं मिला। मैं इसे एक कुशल तरीके से प्राप्त करना चाहता हूं। मैं इसमें सभी संयोजनों को हार्ड कोड नहीं करना चाहता। मैं देख रहा हूं कि अगर टेक्स्ट में ऐड और प्याज हैं तो वह मिल जाता है।

word_check <- c("add get onion" ,
                 "add to onion",
                "add oil to onion",
                "add oils to onion" ,
                "add salt to onion" ,
                "add get onion" ,
                "add get onion", 
                "add get onion")

df <- as.data.frame(c("I can add get onion" ,
                      "we can add to onion",
                      "I love to add oil to onion",
                      "I may not add oils to onion" ,
                      "add salt to onion" ,
                      "add get onion" ,
                      "abc",
                      "def" ,
                      "ghi",
                      "jkl",
                      "add get onion", 
                      "add get onion","add oil to the vegetable", "add onion to the vegetable" ))
names(df)[1] <- "text"


pattern_word_check <- paste(word_check, collapse = "|")


df$New <- ifelse(str_detect(df$text, regex(pattern_word_check)),"Found","Not Found")```

Regards, R
r
1
R Ban 2 अप्रैल 2020, 09:11
पिछले प्रश्न में, मैं अलग-अलग शब्दों की तलाश कर रहा था, यहाँ मैं दो शब्दों की तलाश कर रहा हूँ और बीच में कोई भी चीज़ आ सकती है।
 – 
R Ban
2 अप्रैल 2020, 09:25

3 जवाब

चूंकि आप केवल "onion" और "add" की जांच करना चाहते हैं, जो किसी भी क्रम में हो सकता है, आप ऐसा कर सकते हैं।

df$New <- ifelse(grepl('.*add.*onion.*|.*onion.*add.*',df$text), "found", "not found")
#Faster option without ifelse
#df$New <- c('Not found', 'found')[grepl('.*add.*onion.*|.*onion.*add.*', df$text) + 1]
df

#                          text       New
#1          I can add get onion     found
#2          we can add to onion     found
#3   I love to add oil to onion     found
#4  I may not add oils to onion     found
#5            add salt to onion     found
#6                add get onion     found
#7                          abc not found
#8                          def not found
#9                          ghi not found
#10                         jkl not found
#11               add get onion     found
#12               add get onion     found
0
Ronak Shah 2 अप्रैल 2020, 09:30
आपके सुझावों के लिए धन्यवाद रौनक, यह मेरे लिए काम नहीं कर सकता है जैसे कि पाठ में केवल प्याज या जोड़ है, फिर भी यह पाया जाता है। मैं देख रहा हूं कि स्ट्रिंग में जोड़ें और प्याज दोनों हैं या नहीं। अगर मैं str_detect के साथ ऐसा कर सकता हूं तो मैं सराहना करता हूं। सादर, रे
 – 
R Ban
2 अप्रैल 2020, 09:40
this might not work for me as if the text has only Onion or add और I am looking if the string has both add and onion ये दो वाक्य एक दूसरे के विपरीत हैं और इसका मतलब एक ही नहीं है। कृपया पुष्टि करें कि आप वास्तव में क्या करना चाहते हैं। शायद आपको df$New <- ifelse(str_detect(df$text, 'oil|onion'), "Found", "Not found") चाहिए
 – 
Ronak Shah
2 अप्रैल 2020, 09:43
मैं इस बात की तलाश कर रहा हूं कि टेक्स्ट में पहले ऐड हो और फिर कहीं पर प्याज आए तो मिल जाए। उदाहरण: मुझे कुछ खाना पसंद है, अच्छा है, सब्जियों में कुछ डालें, इसमें प्याज डालना न भूलें।
 – 
R Ban
2 अप्रैल 2020, 09:46
df$New <- ifelse(str_detect(df$text, 'oil|onion'), "Found", "Not found")
 – 
Ronak Shah
2 अप्रैल 2020, 10:04

यहाँ tidytext का उपयोग करके एक समाधान दिया गया है। आपके ठोस उदाहरण के लिए, यह कुछ हद तक ओवरकिल की तरह लग सकता है, लेकिन एक inner_join के साथ एक टोकननाइज़र जैसे अधिक उच्च-स्तरीय कार्यों का उपयोग करने से कोड अधिक स्पष्ट और निर्माण में आसान हो जाता है। (आईएमओ)

df <- as.data.frame(c("I can add get onion" ,
                      "we can add to onion",
                      "I love to add oil to onion",
                      "I may not add oils to onion" ,
                      "add salt to onion" ,
                      "add get onion" ,
                      "abc",
                      "def" ,
                      "ghi",
                      "jkl",
                      "add get onion", 
                      "add get onion","add oil to the vegetable", "add onion to the vegetable" ), stringsAsFactors = FALSE)
names(df)[1] <- "text"
library(dplyr)
library(tidytext)
df_words <- df %>% 
  unnest_tokens(output = word,
                input = text,
                 token = "words",
                drop = FALSE)
inner_join(
  df_words %>% filter(word == "add"),
  df_words %>% filter(word == "onion"),
  by = "text"
) %>% 
  select(text) %>% 
  distinct()
#>                          text
#> 1         I can add get onion
#> 2         we can add to onion
#> 3  I love to add oil to onion
#> 4 I may not add oils to onion
#> 5           add salt to onion
#> 6               add get onion
#> 7  add onion to the vegetable

2020-04-02 को reprex पैकेज द्वारा बनाया गया (v0.3.0)

0
Benjamin Schwetz 2 अप्रैल 2020, 10:03

हो सकता है कि मैंने गलत समझा हो, इसलिए मैं आपको प्रस्ताव देता हूं जब समाधान आपके pattern_word_check चर पर आधारित हो और दूसरा केवल प्याज का उपयोग कर रहा हो और रेगेक्स में जोड़ का उपयोग कर रहा हो।

वैसे भी, मुझे लगता है कि आप grepl ढूंढ रहे हैं। आपकी समस्या को हल करने के लिए आपके पास कई तरीके हैं।

विवरण सारणी

सशर्त प्रतिस्थापन का उपयोग करते हुए एक data.table समाधान होगा:

library(data.table)
setDT(df)
df[,'new' := "Not Found"]
df[grepl(pattern_word_check, text), new := "Found"]

यदि आप केवल "प्याज" या "जोड़ें" वाले शब्दों पर विचार करना चाहते हैं

df[,'new' := "Not Found"]
df[grepl("(onion|add)", text), new := "Found"]

डीप्लायर

एक dplyr समाधान होगा:

library(dplyr)
df %>% mutate(new = if_else(grepl(pattern_word_check, text), "Found", "Not Found"))

ध्यान दें कि यदि dplyr पैकेज से if_else का उपयोग करें, आधार ifelse का नहीं।

यदि आप केवल "प्याज" या "जोड़ें" वाले शब्दों पर विचार करना चाहते हैं

library(dplyr)
df %>% mutate(new = if_else(grepl("(onion|add)", text), "Found", "Not Found"))
1
linog 2 अप्रैल 2020, 09:25
आपके उत्तर के लिए धन्यवाद। मैं इस बात की तलाश कर रहा हूं कि टेक्स्ट में पहले ऐड हो और फिर कहीं पर प्याज आए तो मिल जाए। उदाहरण: मुझे कुछ खाना पसंद है, अच्छा है, सब्जियों में कुछ डालें, इसमें प्याज डालना न भूलें। मैं या का उपयोग करने की तलाश में नहीं हूं। कृपया मार्गदर्शन करें
 – 
R Ban
2 अप्रैल 2020, 10:09