用R中的一个唯一单词替换单词列表

用R中的一个唯一单词替换单词列表,r,regex,nlp,data-cleaning,topic-modeling,R,Regex,Nlp,Data Cleaning,Topic Modeling,我正在使用R进行文本分析,并拥有一个数据集(文本语料库),其中包含关于不同水果的各种句子。例如:“苹果”、“香蕉”、“橙子”、“梨””等 因为它与分析是否有人写“苹果”或“香蕉”无关,所以我想用一个特定的词来替换所有不同的水果,例如“allfruits” 我曾想过使用正则表达式,但我面临两个问题 1) 我希望避免对每种水果使用单独的代码行。因此,有没有一种方法可以定义我可以使用的列表或向量,以便函数用一个特定的单词“allfruits”替换该列表中的所有单词(苹果、香蕉、梨等) 2) 我希望避免

我正在使用R进行文本分析,并拥有一个数据集(文本语料库),其中包含关于不同水果的各种句子。例如:“苹果”、“香蕉”、“橙子”、“梨””等

因为它与分析是否有人写“苹果”或“香蕉”无关,所以我想用一个特定的词来替换所有不同的水果,例如“allfruits

我曾想过使用正则表达式,但我面临两个问题

1) 我希望避免对每种水果使用单独的代码行。因此,有没有一种方法可以定义我可以使用的列表或向量,以便函数用一个特定的单词“allfruits”替换该列表中的所有单词(苹果、香蕉、梨等)

2) 我希望避免将不是水果但包含与水果相同字符串的单词(例如单词“appletii”)替换为函数

例如: 如果我有句话说:“苹果是我最喜欢的水果,苹果酱是我最喜欢的饮料。我也喜欢香蕉!" 我希望发生以下事情:所有水果是我最喜欢的水果,苹果酱是我最喜欢的饮料。我也喜欢所有水果

我不确定是否可以用gsub函数来写这个。因此,非常感谢所有的帮助


谢谢!

str
allfruits
可以扩展为包含任何要替换的单词:

str <- "Apple is my favourite fruit, appletini is my favourite drink. I also like bananas!"
gsub("(\\bapples?\\b)|(\\bbananas?\\b)", "allfruits", str, ignore.case = T)
allfruits = c("apple", "banana" , "orange", "pear")
replacement = "allfruits"
text = "Apple is my favourite fruit, appletini is my favourite drink. I also like bananas!"

gsub(paste0("\\b(", paste0(allfruits, collapse="|"), ")[s]?\\b"), replacement, text, ignore.case = TRUE)
返回

[1] "allfruits is my favourite fruit, appletini is my favourite drink. I also like allfruits!"
正则表达式:

  • \\b
    -wordboundary
  • (“,paste0(allfruits,collapse=“|”)
    -所有水果名称以
    |
    分隔(或)
  • s?
    -可选字母's'
  • \\b
    -wordboundary
  • ignore.case=TRUE
    -忽略大小写

非常感谢!这确实帮助解决了这个问题。我对gsub和regex函数的整个主题还不熟悉,所以它仍然有点混乱,特别是关于“单词边界”的部分。如果我想替换单词中的特定字符串,例如替换“apple”,你有没有一个例子说明我将如何编写regex在“appletin”这个词里,用“allfruitstini”来表达?。如果单词apple位于两个字符串之间(例如:“stringapplestring”变为“stringallfruitsstring”),则删除上述示例中的单词边界部分将按照您在注释中的要求执行。在
?gsub
模式
参数的描述中,我们找到了指向R的正则表达式文档的链接。在那里我们可以找到不同的表达方式。然后,您可以从一个teststring开始并尝试不同的模式。