用Python或R计算单词频率

时间:2014-03-21 09:19:34

标签: python r text-mining

按照以下评论中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,请指导。 有人请吗?

5 个答案:

答案 0 :(得分:3)

在Python中,您可以使用集合模块中的Counterre来分割每个单词的句子,为您提供:

>>> 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