如何将字符向量列表转换为 quanteda 标记对象?

问题描述

我有一个包含文档标记的字符向量列表。

list(doc1 = c("I","like","apples"),doc2 = c("You","apples","too"))

我想将此向量转换为 quanteda tokens(或 dfm)对象,以便利用一些 quantedas 功能

这样做的最佳方法是什么?

我意识到我可以对每个文档执行以下操作:

tokens(paste0(c("I",collapse = " "),what = "fastestword")

给出:

Tokens consisting of 1 document.
text1 :
[1] "I"      "like"   "apples"

但这感觉就像一个黑客,也不可靠,因为我的一些令牌对象中有空格。有没有什么方法可以更顺畅的传输这些数据结构?

解决方法

您可以从以下位置构造令牌对象:

  • 一个字符向量,在这种情况下,对象被标记为每个字符元素成为一个“文档”
  • 一个语料库,它是一个特殊分类的字符向量,并以相同的方式被标记化并转换为标记对象中的文档
  • 一个字符元素列表,在这种情况下,每个列表元素成为一个标记化的文档,并且该列表的每个元素成为一个标记(但不会进一步标记化)
  • tokens 对象,它被视为与字符元素列表相同。

还可以使用 as.tokens(mylist) 将字符元素列表转换为标记对象。不同之处在于,使用 tokens(),您可以访问所有选项,例如 remove_punct。使用 as.tokens(),转换是直接的,没有选项,所以如果您不需要选项,速度会快一些。

lis <- list(
  doc1 = c("I","like","apples"),doc2 = c("One two","99","three",".")
)

library("quanteda")
## Package version: 3.0.9000
## Unicode version: 13.0
## ICU version: 69.1
## Parallel computing: 8 of 8 threads used.
## See https://quanteda.io for tutorials and examples.

tokens(lis)
## Tokens consisting of 2 documents.
## doc1 :
## [1] "I"      "like"   "apples"
## 
## doc2 :
## [1] "One two" "99"      "three"   "."
tokens(lis,remove_punct = TRUE,remove_numbers = TRUE)
## Tokens consisting of 2 documents.
## doc1 :
## [1] "I"      "like"   "apples"
## 
## doc2 :
## [1] "One two" "three"

强制替代,没有选项:

as.tokens(lis)
## Tokens consisting of 2 documents.
## doc1 :
## [1] "I"      "like"   "apples"
## 
## doc2 :
## [1] "One two" "99"      "three"   "."
,

根据?tokensx 可以是list

x - 标记构造函数的输入对象,其中之一:(唯一)命名的字符列表;令牌对象;或将被标记化的语料库或字符对象

所以我们只需要

library(quanteda)
tokens(lst1,what = 'fastestword')

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...