有什么办法可以将 quanteda 代币分成 n 等份吗?

Is there any way to split quanteda tokens into n equal parts?

我正在使用 R 中的 quanteda 包执行文本分析。

我有一组我已经标记化的文本文档。每个都包含不同数量的令牌。我想将标记分成 N 个相等的标记块(例如 10 或 20 个块,每个文本由等量的标记组成)。

假设我的数据名为 text_docs 并且如下所示:

Text  | Tokens
Text1 | "this" "is" "an" "example" "this" "is" "an" "example"
Text2 | "this" "is" "an" "example"
Text3 | "this" "is" "an" "example" "this" "is" "an" "example" "this" "is" "an" "example"

我想要得到的结果应该是这样的(有两个块而不是二十个):

Text  | Chunk1                                 | Chunk2
Text1 | "this" "is" "an" "example"             | "this" "is" "an" "example"
Text2 | "this" "is"                            | "an" "example"
Text3 | "this" "is" "an" "example" "this" "is" | "an" "example" "this" "is" "an" "example"

我知道 quanteda 中的 tokens_chunk 函数。然而,这个函数只能让我创建一组大小相等的块(例如,每个块由两个标记组成),这给我留下了不同数量的块。此外,tokens_chunk 函数中的命令 size 必须是单个整数,这就是为什么我不能简单地这样做 chunks <- tokens_chunk(text_docs, size = ntokens(text_docs)/20).

有什么想法吗?

提前致谢。

library("quanteda")
## Package version: 2.1.2

toks <- c(
  Text1 = "this is an example this is an example",
  Text2 = "this is an example",
  Text3 = "this is an example this is an example this is an example"
) %>%
  tokens()

toks
## Tokens consisting of 3 documents.
## Text1 :
## [1] "this"    "is"      "an"      "example" "this"    "is"      "an"     
## [8] "example"
## 
## Text2 :
## [1] "this"    "is"      "an"      "example"
## 
## Text3 :
##  [1] "this"    "is"      "an"      "example" "this"    "is"      "an"     
##  [8] "example" "this"    "is"      "an"      "example"

这里有一种方法可以满足您的需求。我们将 lapply 遍历文档名以切出每个文档,然后使用 tokens_chunk() 拆分它,大小等于其长度的一半。在这里,我还使用 ceiling 这样如果文档的标记长度为奇数,它在第一次拆分中将比在第二次拆分中多一个标记。 (您的示例全部针对偶数标记的文档,但这也处理奇数标记的情况。)

lis <- lapply(
  docnames(toks),
  function(x) tokens_chunk(toks[x], size = ceiling(ntoken(toks[x]) / 2))
)

这会生成一个拆分标记列表,您可以使用连接标记的 c() 函数重新组合它们。您使用 do.call().

将其应用于列表
do.call("c", lis)
## Tokens consisting of 6 documents.
## Text1.1 :
## [1] "this"    "is"      "an"      "example"
## 
## Text1.2 :
## [1] "this"    "is"      "an"      "example"
## 
## Text2.1 :
## [1] "this" "is"  
## 
## Text2.2 :
## [1] "an"      "example"
## 
## Text3.1 :
## [1] "this"    "is"      "an"      "example" "this"    "is"     
## 
## Text3.2 :
## [1] "an"      "example" "this"    "is"      "an"      "example"