我一直在使用tm包来运行一些文本分析.我的问题是创建一个包含单词及其相关频率的列表
library(tm)
library(RWeka)
txt <- read.csv("HW.csv",header=T)
df <- do.call("rbind", lapply(txt, as.data.frame))
names(df) <- "text"
myCorpus <- Corpus(VectorSource(df$text))
myStopwords <- c(stopwords('english'),"originally", "posted")
myCorpus <- tm_map(myCorpus, removeWords, myStopwords)
#building the TDM
btm <- function(x) NGramTokenizer(x, Weka_control(min = 3, max = 3))
myTdm <- TermDocumentMatrix(myCorpus, control = list(tokenize = btm))
Run Code Online (Sandbox Code Playgroud)
我通常使用以下代码生成频率范围内的单词列表
frq1 <- findFreqTerms(myTdm, lowfreq=50)
Run Code Online (Sandbox Code Playgroud)
有没有办法自动化这个,以便我们得到一个包含所有单词及其频率的数据帧?
我面临的另一个问题是将术语文档矩阵转换为数据框.当我处理大量数据时,我遇到了内存错误.有一个简单的解决方案吗?
如何处理/删除表情符号以便我可以对推文进行情感分析?
获取:sort.list(y)中的错误:输入无效
谢谢
这就是表情符号从twitter发送到r中的方式:
\xed??\xed?\u0083\xed??\xed??
\xed??\xed?\u008d\xed??\xed?\u0089
Run Code Online (Sandbox Code Playgroud) 我在一个文件夹中有近千篇pdf期刊文章.我需要在整个文件夹中对所有文章的摘要进行文本处理.现在我正在做以下事情:
dest <- "~/A1.pdf"
# set path to pdftotxt.exe and convert pdf to text
exe <- "C:/Program Files (x86)/xpdfbin-win-3.03/bin32/pdftotext.exe"
system(paste("\"", exe, "\" \"", dest, "\"", sep = ""), wait = F)
# get txt-file name and open it
filetxt <- sub(".pdf", ".txt", dest)
shell.exec(filetxt)
Run Code Online (Sandbox Code Playgroud)
通过这个,我将一个pdf文件转换为一个.txt文件,然后将该摘要复制到另一个.txt文件中并手动编译.这项工作很麻烦.
如何从文件夹中读取所有单篇文章并将其转换为仅包含每篇文章摘要的.txt文件.可以通过限制每篇文章中的摘要和引言之间的内容来完成; 但我无法这样做.任何帮助表示赞赏.
所以我有一个非常大的术语文档矩阵:
> class(ph.DTM)
[1] "TermDocumentMatrix" "simple_triplet_matrix"
> ph.DTM
A term-document matrix (109996 terms, 262811 documents)
Non-/sparse entries: 3705693/28904453063
Sparsity : 100%
Maximal term length: 191
Weighting : term frequency (tf)
Run Code Online (Sandbox Code Playgroud)
如何获得每个术语的rowSum(频率)?我试过了:
> apply(ph.DTM, 1, sum)
Error in vector(typeof(x$v), nr * nc) : vector size cannot be NA
In addition: Warning message:
In nr * nc : NAs produced by integer overflow
Run Code Online (Sandbox Code Playgroud)
显然,我知道removeSparseTerms:
ph.DTM2 <- removeSparseTerms(ph.DTM, 0.99999)
Run Code Online (Sandbox Code Playgroud)
这减少了一点:
> ph.DTM2
A term-document matrix (28842 terms, 262811 documents)
Non-/sparse entries: …Run Code Online (Sandbox Code Playgroud) 我正在使用R包tm,我想做一些文本挖掘.这是一份文件,被视为一袋文字.
我不明白如何加载文本文件和创建必要的对象以开始使用诸如....的功能的文档.
stemDocument(x, language = map_IETF(Language(x)))
Run Code Online (Sandbox Code Playgroud)
所以假设这是我的文档"这是对R load的测试"
如何加载数据进行文本处理并创建对象x?
我找到了一种在术语 - 文档矩阵中使用bigrams而不是单个令牌的方法.解决方案已在stackoverflow上提出: findAssocs用于R中的多个术语
这个想法是这样的:
library(tm)
library(RWeka)
data(crude)
#Tokenizer for n-grams and passed on to the term-document matrix constructor
BigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 2, max = 2))
txtTdmBi <- TermDocumentMatrix(crude, control = list(tokenize = BigramTokenizer))
Run Code Online (Sandbox Code Playgroud)
但最后一行给出了错误:
Error in rep(seq_along(x), sapply(tflist, length)) :
invalid 'times' argument
In addition: Warning message:
In is.na(x) : is.na() applied to non-(list or vector) of type 'NULL'
Run Code Online (Sandbox Code Playgroud)
如果我从最后一行删除了tokenizer它会创建一个常规的tdm,所以我猜问题是在BigramTokenizer函数中的某个地方,尽管这是Weka网站在这里给出的相同例子:http://tm.r-forge.r -project.org/faq.html#Bigrams.
我的目标是[半]自动将文本分配到不同的类别.每个类别都有一组用户定义的类别和一组文本.理想的算法应该能够从人类定义的分类中学习,然后自动对新文本进行分类.任何人都可以建议这样的算法,也许是实现ше的.NET库吗?
我希望为R中的文本分配一些不同的可读性分数,例如Flesh Kincaid.
有没有人知道使用R将单词分成音节的方法?我不一定需要音节片段本身但需要计数.
例如:
x <- c('dog', 'cat', 'pony', 'cracker', 'shoe', 'Popsicle')
Run Code Online (Sandbox Code Playgroud)
会产生:1,1,2,2,1,3
每个数字对应于单词中的音节数.
我TermDocumentMatrix用tmR中的包创建了几个.
我想在每组文档中找到10个最常用的术语,最终得到一个输出表,如:
corpus1 corpus2
"beach" "city"
"sand" "sidewalk"
... ...
[10th most frequent word]
Run Code Online (Sandbox Code Playgroud)
根据定义,findFreqTerms(corpus1,N)返回出现N次或更多次的所有术语.要手动执行此操作,我可以更改N,直到我返回10个左右的术语,但输出为findFreqTerms按字母顺序排列,因此除非我选择正确的N,否则我实际上不知道哪个是前10个.我怀疑这个涉及操纵您可以看到的TDM的内部结构,str(corpus1)如在R tm包中创建最常用术语的矩阵,但这里的答案对我来说非常不透明所以我想重新解释这个问题.
谢谢!
编辑:新包text2vec非常好,并且很好地解决了这个问题(和许多其他问题).
关于github 插图的CRAN text2vec上的text2vec,用于说明ngram标记化
我在R中有一个非常大的文本数据集,我已将其作为字符向量导入:
#Takes about 15 seconds
system.time({
set.seed(1)
samplefun <- function(n, x, collapse){
paste(sample(x, n, replace=TRUE), collapse=collapse)
}
words <- sapply(rpois(10000, 3) + 1, samplefun, letters, '')
sents1 <- sapply(rpois(1000000, 5) + 1, samplefun, words, ' ')
})
Run Code Online (Sandbox Code Playgroud)
我可以将此字符数据转换为词袋表示,如下所示:
library(stringi)
library(Matrix)
tokens <- stri_split_fixed(sents1, ' ')
token_vector <- unlist(tokens)
bagofwords <- unique(token_vector)
n.ids <- sapply(tokens, length)
i <- rep(seq_along(n.ids), n.ids)
j <- match(token_vector, bagofwords)
M <- sparseMatrix(i=i, j=j, x=1L)
colnames(M) <- bagofwords
Run Code Online (Sandbox Code Playgroud)
所以R可以在大约3秒钟内将1,000,000,000个短句矢量化为一个单词表示形式(不错!):
> M[1:3, …Run Code Online (Sandbox Code Playgroud)