我遇到了以下问题:
我有一组需要标准频率的单词。这份清单统计了350个单词。我还有另一个列表,让我们称之为频率列表,有超过550万个不同的单词和它们相应的标准绝对频率。
现在,我需要这350个单词的频率。我想在R中使用这段代码,但仅加载频率列表就需要我的MacBook大约7分钟。
#Read data
decow <- read.table("decow14ax.freq10.w.tsv", header = TRUE, fill = TRUE)
#Converting wordlist in lower case
decow$token_lowercase <- tolower(as.character(decow$token...))
#Read word list
wordlist <- read.csv("wordlist.csv")
#Set frequency counter to 0
wordlist$norm_frequency = 0
#Obtaining frequencies for word list from norm database
for (i in 1:nrow(wordlist))
{
for (j in 1:nrow(decow_small)) {
if (wordlist$word[i]==decow$token_lowercase[j]) {
wordlist$norm_frequency[i] <- decow_small$f_raw[j]}
}
}我注意到这段代码效率不是很高。相反,我希望使用向量,因为我猜这将使我不必实现这个循环350次,从而使我的笔记本电脑在几个小时内都很忙。
提前谢谢你。
发布于 2018-02-23 08:08:18
library(tm)
library(janeaustenr)
wordlist<-janeaustenr::emma
wordlist<-sample(wordlist,50)
wordlist<-tokenizers::tokenize_words(wordlist)
wordlist<-unlist(wordlist)
wordlist<-removeWords(wordlist,stopwords('english'))
wordlist<-table(wordlist)[-1]
wordlist这是一个向你展示table()函数提供频率的示例。
库(Tm)将使用removeWords(),而[-1]将从表中删除""计数。
希望这能有所帮助
发布于 2018-02-23 10:43:55
我已经找到了一个解决方案,它很可能比我之前的方法更快:
#Create word vector containing all entries from word list
wordvec1 <- unname(unlist(sapply(wordlist$word, function(z) str_split(tolower(z), " "))))
#Create empty word vector with length of word vector 1
wordvec2 <- rep(0,length(wordvec1))
#Iteration
for (i in 1:length(wordvec1)) {
wordvec2[i] <- wordvec2[i]+sum(decow$f_raw[decow$token_lowercase==wordvec1[i]])
}任何改进的想法都会被欣然接受。
https://stackoverflow.com/questions/48939050
复制相似问题