有什么办法可以将 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"
我正在使用 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"