按照以下评论中Tyler的指示编辑问题。
作为更大的文本挖掘项目的一部分,我创建了一个.csv文件,其第一列 中包含书籍标题,第二列中的书籍全部内容为 我的目标是创建一个由前n个(n = 100或200或1000,取决于分数的偏差)组成的文字云,在删除英语中的常用停用词后,每个标题的文本中最频繁重复的单词( R-tm(文本挖掘)包具有漂亮的功能 - removeStopwords )。 希望这能更好地解释我的问题。
问题陈述:
我的输入在csv文件中采用以下格式:
title text
1 <huge amount of text1>
2 <huge amount of text2>
3 <huge amount of text3>
这是一个具有类似数据的MWE:
library(tm)
data(acq)
dat <- data.frame(title=names(acq[1:3]), text=unlist(acq[1:3]), row.names=NULL)
我想通过频率出现在每个标题的相应文本中,除了停用词之外的最高“n”条款。理想的输出是excel或csv中的表格,如下所示:
title term frequency
1 .. ..
1 .. ..
1
1
1
2
2
2
2
2
3
3
3 .. ..
如果可以完成R或Python,请指导。 有人请吗?
答案 0 :(得分:3)
在Python中,您可以使用集合模块中的Counter
和re
来分割每个单词的句子,为您提供:
>>> import re
>>> from collections import Counter
>>> t = "This is a sentence with many words. Some words are repeated"
>>> Counter(re.split(r'\W', t)).most_common()
[('words', 2), ('a', 1), ('', 1), ('sentence', 1), ('This', 1), ('many', 1), ('is', 1), ('Some', 1), ('repeated', 1), ('are', 1), ('with', 1)]
答案 1 :(得分:0)
在R中,您可以使用stringi
包和stri_extract_all_charclass
函数从文本中提取所有字母:
stri_extract_all_charclass(c("Ala ma; kota. Jaś nie ma go\n.To nic nie ma 123","abc dce"),"\\p{Lc}")
## [[1]]
## [1] "Ala" "ma" "kota" "Jaś" "nie" "ma" "go" "To" "nic" "nie" "ma"
##
## [[2]]
## [1] "abc" "dce"
然后使用表函数你可以数这个词。您可能还希望将每个单词转换为小写 - &gt; stri_trans_tolower
功能
stri_extract_all_charclass(c("Ala ma; kota. Jaś nie ma go\n.To nic nie ma 123","abc dce"),"\\p{Lc}") -> temp
lapply(temp, table)
## [[1]]
##
## Ala go Jaś kota ma nic nie To
## 1 1 1 1 3 1 2 1
## [[2]]
## abc dce
## 1 1
答案 2 :(得分:0)
在基地R:
## set up some data
words <- paste(LETTERS[1:3], letters[1:3], sep = "")
dat <- data.frame(title = 1:3, text = sapply(1:3, function(x){
paste(sample(unlist(strsplit(words, " ")), 15, TRUE), collapse = " ")
}))
dat$text <- as.character(dat$text)
## solve the problem
> tabs <- sapply(dat$text, function(x){
table(unlist(strsplit(x, " ")))
}, USE.NAMES = FALSE)
> data.frame(title = sort(rep(1:nrow(dat), 3)),
text = sort(rep(rownames(tabs))),
freq = c(tabs))
## title text freq
## 1 Aa 6
## 1 Bb 3
## 1 Cc 6
## 2 Aa 9
## 2 Bb 4
## 2 Cc 2
## 3 Aa 4
## 3 Bb 7
## 3 Cc 4
答案 3 :(得分:0)
在R:
dat <- read.csv("myFile")
splitPerRow <- strsplit(dat$text, "\\W")
tablePerRow <- lapply(splitPerRow, table)
tablePerRow <- lapply(tablePerRow, sort, TRUE)
tablePerRow <- lapply(tablePerRow, head, n) # set n to be the threshold on frequency rank
output <- data.frame(freq=unlist(tablePerRow),
title=rep(dat$title, times=sapply(tablePerRow, length))
term = unlist(lapply(tablePerRow, names))
)
根据文本的性质,您可能需要过滤掉非单词条目(就像文本是“term1 term2,term3”一样,您将获得由逗号和空格之间的空字符串引起的空条目在term2之后。
答案 4 :(得分:0)
这可以让你做你想做的事情:
library(qdap)
list_df2df(setNames(lapply(dat$text, freq_terms, top=10,
stopwords = Dolch), dat$title), "Title")
您可以删除停用词并使用freq_terms
获得前n个术语,但应用于每个文本。然后,您可以设置名称并将其与list_df2df
一起放在一起。
这里我使用qdapDictionaries:Dolch
列表作为停用词,但使用你想要的矢量。此外,如果这里的前十个单词有一个平局,则会包含该级别的所有单词。
## Title WORD FREQ
## 1 reut-00001.xml computer 6
## 2 reut-00001.xml company 4
## 3 reut-00001.xml dlrs 4
## .
## .
## .
## .
## 112 reut-00003.xml various 1
## 113 reut-00003.xml week 1
## 114 reut-00003.xml within 1