gpt4 book ai didi

r - 在 R 中迭代以拼写检查单词向量

转载 作者:行者123 更新时间:2023-12-04 10:50:04 24 4
gpt4 key购买 nike

我有一个充满不适当间隔的句子的数据集。我试图想出一种方法来删除一些空格。

我从一个句子开始,我将其转换为单词数据框:

> word5 <- "hotter the doghou se would be bec ause the co lor was diffe rent"
> abc1 <- data.frame(filler1 = 1,words1=factor(unlist(strsplit(word5, split=" "))))
> abc1
filler1 words1
1 1 hotter
2 1 the
3 1 doghou
4 1 se
5 1 would
6 1 be
7 1 bec
8 1 ause
9 1 the
10 1 co
11 1 lor
12 1 was
13 1 diffe
14 1 rent

接下来,我使用以下代码尝试拼写检查并组合作为它们之前或之后的单词组合的单词:
abc2 <- abc1
i <- 1
while(i < nrow(abc1)){
print(abc2)
if(nrow(aspell(abc1$words1[i])) == 0){
print(paste(i,"Words OK",sep=" | "));flush.console()
i <- i + 1
}
else{
if(nrow(aspell(abc1$words1[i])) > 0 & i != 1){
preWord1 <- abc1$words1[i-1]
postWord1 <- abc1$words1[i+1]
badWord1 <- abc1$words1[i]
newWord1 <- factor(paste(preWord1,badWord1,sep=""))
newWord2 <- factor(paste(badWord1,postWord1,sep=""))

if(nrow(aspell(newWord1)) == 0 & nrow(aspell(newWord2)) != 0){
abc2[i,"words1"] <-as.character(newWord1)
abc2 <- abc2[-c(i+1),]
print(paste(i,"word1",sep=" | "));flush.console()
i <- i + 1
}

if(nrow(aspell(newWord1)) != 0 & nrow(aspell(newWord2)) == 0){
abc2[i ,"words1"] <-as.character(newWord2)
abc2 <- abc2[-c(i-1),]
print(paste(i,"word2",sep=" | "));flush.console()
i <- i + 1
}

}
}
}

在玩了一段时间之后,我得出的结论是我需要某种类型的迭代器,但不确定如何在 R 中实现它。有什么建议吗?

最佳答案

注:我想出了一个完全不同的、更好的解决方案,因为它规避了以前解决方案的所有缺点。但我仍然想保留旧的解决方案。因此,我将其添加为新答案,如果我这样做有误,请纠正我。

在这种方法中,我稍微重新格式化了数据集。基础就是我所说的词对对象。例如:

> word5
[1] "hotter the doghou se would be bec ause the col or was diffe rent"

看起来像:
> abc1_pairs
word1 word2
1 hotter the
2 the doghou
3 doghou se
4 se would
5 would be
6 be bec
7 bec ause
8 ause the
9 the col
10 col or
11 or was
12 was diffe
13 diffe rent

接下来,我们遍历词对并查看它们本身是否是有效词,递归地执行此操作直到找不到有效的新词(请注意,本文底部列出了一些其他功能):
# Recursively delete wordpairs which lead to a correct word
merge_wordpairs = function(wordpairs) {
require(plyr)
merged_pairs = as.character(mlply(wordpairs, merge_word))
correct_words_idxs = which(sapply(merged_pairs, word_correct))
if(length(correct_words_idxs) == 0) {
return(wordpairs)
} else {
message(sprintf("Number of words about to be merged in this pass: %s", length(correct_words_idxs)))
for(idx in correct_words_idxs) {
wordpairs = merge_specific_pair(wordpairs, idx, delete_pair = FALSE)
}
return(merge_wordpairs(wordpairs[-correct_words_idxs,])) # recursive call
}
}

应用于示例数据集,这将导致:
> word5 <- "hotter the doghou se would be bec ause the col or was diffe rent"
> abc1 = strsplit(word5, split = " ")[[1]]
> abc1_pairs = wordlist2wordpairs(abc1)
> abc1_pairs
word1 word2
1 hotter the
2 the doghou
3 doghou se
4 se would
5 would be
6 be bec
7 bec ause
8 ause the
9 the col
10 col or
11 or was
12 was diffe
13 diffe rent
> abc1_merged_pairs = merge_wordpairs(abc1_pairs)
Number of words about to be merged in this pass: 4
> merged_sentence = paste(wordpairs2wordlist(abc1_merged_pairs), collapse = " ")
> c(word5, merged_sentence)
[1] "hotter the doghou se would be bec ause the col or was diffe rent"
[2] "hotter the doghouse would be because the color was different"

需要的附加功能:
# A bunch of functions
# Data transformation
wordlist2wordpairs = function(word_list) {
require(plyr)
wordpairs = ldply(seq_len(length(word_list) - 1),
function(idx)
return(c(word_list[idx],
word_list[idx+1])))
names(wordpairs) = c("word1", "word2")
return(wordpairs)
}
wordpairs2wordlist = function(wordpairs) {
return(c(wordpairs[[1]], wordpairs[[2]][nrow(wordpairs)]))
}

# Some checking functions
# Is the word correct?
word_correct = function(word) return(nrow(aspell(factor(word))) == 0)
# Merge two words
merge_word = function(word1, word2) return(paste(word1, word2, sep = ""))

# Merge a specific pair, option to postpone deletion of pair
merge_specific_pair = function(wordpairs, idx, delete_pair = TRUE) {
# merge pair into word
merged_word = do.call("merge_word", wordpairs[idx,])
# assign the pair to the idx above
if(!(idx == 1)) wordpairs[idx - 1, "word2"] = merged_word
if(!(idx == nrow(wordpairs))) wordpairs[idx + 1, "word1"] = merged_word
# assign the pair to the index below (if not last one)
if(delete_pair) wordpairs = wordpairs[-idx,]
return(wordpairs)
}

关于r - 在 R 中迭代以拼写检查单词向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11929180/

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