【问题标题】:Compute ngrams for each row of text data in R计算 R 中每一行文本数据的 ngram
【发布时间】:2013-07-07 12:34:01
【问题描述】:

我有一个如下格式的数据列:

文字

Hello world  
Hello  
How are you today  
I love stackoverflow  
blah blah blahdy  

我想通过可能使用tau 包的textcnt() 函数来计算此数据集中每一行的3-gram。但是,当我尝试它时,它给了我一个带有整个列的 ngram 的数字向量。如何将此函数分别应用于数据中的每个观察值?

【问题讨论】:

  • @TylerRinker 谢谢泰勒。但是,sapply 没有工作。我这样使用它: > trigram_title
  • 最好展示你的所作所为而不是提及它。
  • 这篇文章可能对你有帮助...stackoverflow.com/questions/37291984/…

标签: r text text-parsing n-gram tm


【解决方案1】:

这是使用 qdap package 的 ngram 方法

## Text <- readLines(n=5)
## Hello world
## Hello
## How are you today
## I love stackoverflow
## blah blah blahdy

library(qdap)
ngrams(Text, seq_along(Text), 3)

这是一个列表,您可以使用典型的列表索引访问组件。

编辑:

就您的第一种方法而言,尝试如下:

library(tau)
sapply(Text, textcnt, method = "ngram")

## sapply(eta_dedup$title, textcnt, method = "ngram")

【讨论】:

  • 谢谢泰勒!我将探索你的 qdap 包。我认为现在我将使用 Ben 的 RWeka/tm 解决方案,因为它以一种我可以轻松计算相似度的方式呈现数据。
【解决方案2】:

这就是你所追求的吗?

library("RWeka")
library("tm")

TrigramTokenizer <- function(x) NGramTokenizer(x, 
                                Weka_control(min = 3, max = 3))
# Using Tyler's method of making the 'Text' object here
tdm <- TermDocumentMatrix(Corpus(VectorSource(Text)), 
                          control = list(tokenize = TrigramTokenizer))

inspect(tdm)

A term-document matrix (4 terms, 5 documents)

Non-/sparse entries: 4/16
Sparsity           : 80%
Maximal term length: 20 
Weighting          : term frequency (tf)

                      Docs
Terms                  1 2 3 4 5
  are you today        0 0 1 0 0
  blah blah blahdy     0 0 0 0 1
  how are you          0 0 1 0 0
  i love stackoverflow 0 0 0 1 0

【讨论】:

  • 谢谢本。这让我可以轻松计算字符串之间的标记相似度
  • 尝试“tdm
  • 听起来是您安装Java的问题,可能路径设置不正确。
【解决方案3】:

以下是使用 quanteda 包的方法:

txt <- c("Hello world", "Hello", "How are you today", "I love stackoverflow", "blah blah blahdy")

require(quanteda)
dfm(txt, ngrams = 3, concatenator = " ", verbose = FALSE)
## Document-feature matrix of: 5 documents, 4 features.
## 5 x 4 sparse Matrix of class "dfmSparse"
##   features
## docs    how are you are you today i love stackoverflow blah blah blahdy
##  text1           0             0                    0                0
##  text2           0             0                    0                0
##  text3           1             1                    0                0
##  text4           0             0                    1                0
##  text5           0             0                    0                1

【讨论】:

    【解决方案4】:

    我猜 OP 想使用 tau,但其他人没有使用该软件包。以下是您在 tau 中的操作方式:

    data = "Hello world\nHello\nHow are you today\nI love stackoverflow\n  
    blah blah blahdy"
    
    bigram_tau <- textcnt(data, n = 2L, method = "string", recursive = TRUE)
    

    这将是一个 trie,但您可以将其格式化为带有标记和大小的更经典的数据帧类型:

    data.frame(counts = unclass(bigram_tau), size = nchar(names(bigram_tau)))
    format(r)
    

    我强烈建议使用tau,因为它在处理大数据时表现得非常好。我用它来创建 1 GB 的二元组,它既快速又流畅。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多