gpt4 book ai didi

r - 从 R 中文本字符串的第一个近似匹配中提取信息(并对匹配总数求和)

转载 作者:行者123 更新时间:2023-12-01 10:59:05 25 4
gpt4 key购买 nike

我无法对文本字符串的近似匹配求和,也无法从匹配的字符串中提取信息第一时间。

我有这样的数据:

text<-c("THEN it goes West","AT it falls East","it goes West", "it falls East", "AT it goes West")
date<-c(2008,2009,2003,2006,2011)
ID<-c(1,2,3,4,5)
data<-cbind(text,date,ID)
data<-as.data.frame(data)

请注意,最新的文本字符串在较早的文本字符串中添加了全大写的“THEN”和“AT”。

我想要一个看起来像这样的表格:

     ID  Sum Originaltext     Originaldate
[1,] "4" "3" "it goes West" "2003"
[2,] "2" "2" "it falls East" "2006"

这包括:

与最早日期的文本对应的ID 编号(其他文本源自的“原始”文本)。每个的所有近似匹配的总和。与最早日期对应的文本。以及与最早日期对应的文本的日期

我有数千万个案例,所以我在自动化流程方面遇到了麻烦。

我运行 Windows 7,可以访问快速计算服务器。

想法

#order them backwards in time
data<-data[order(data$date, decreasing = TRUE),]

#find the strings with the latest date

pattern<-"AT|THEN"

k <- vector("list", length(data$text))

for (j in 1:length(data$text)){
k[[j]]<- grep(pattern,data$text[[j]], ignore.case=FALSE)
}

k<-subset(data$text, k==1)

k<-unique(k)

#this is a problem, because case nos. 1 and 5 are still in the dataset, but they derive from the same tweet.

从这里开始,我可以使用“agrep”,但我不确定在什么情况下。任何帮助将不胜感激!

注意:虽然下面的三个答案确实按照我最初提出的方式回答了我的问题,但我没有提到即使没有“AT”和“THEN”这两个词,我的文本案例也会有所不同。事实上,它们中的大多数并不完全匹配。我应该把这个放在原来的问题中。但是,我仍然喜欢一个答案。

谢谢!

最佳答案

一种避免stringrdata.table 解决方案。我相信这可以改进

处理文本数据

# make the factor columns character
.data <- lapply(data, function(x) if(is.factor(x)) {as.character(x)} else { x})
library(data.table)
DT <- as.data.table(.data)


DT[, original_text := text]
# using `%like% which is an easy data.table wrapper for grepl
DT[text %like% "^THEN", text := substr(text, 6, nchar(text))]
DT[text %like% "^AT", text := substr(text, 4, nchar(text))]

# or avoiding the two vector scans and replacing in one fell swoop
DT[,text := gsub('(^THEN )|(^AT )', '', text)]

DT[, c(sum=.N, .SD[which.min(date)]) ,by=text]

使用因子水平(可能更快)

# assuming that text is a factor
DTF <- as.data.table(data)
DTF[, original_text := text]
levels_text <- DTF[, levels(text)]
new_levels <- gsub('(^THEN )|(^AT )', x= levels_text ,'')
# reset the levels
setattr(DTF[['text']], 'levels', new_levels)
# coerce to character and do the same count / min date
DTF[, c(sum=.N, .SD[which.min(date)]) ,by=list(text = as.character(text))]

关于r - 从 R 中文本字符串的第一个近似匹配中提取信息(并对匹配总数求和),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12903368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com