Type-Token Google 工作表中的比率:如何处理长文本字符串(数百万个字符)
Type-Token Ratio in Google Sheets: How to manipulate long strings of text (millions of characters)
这是挑战。在 Google Sheets 电子表格中,我有一列可以在其中找到一系列单元格,其中包含用逗号分隔的单词列表,每行一个,最多一千行。每个列表显示从文本中提取的单词,按 alpha-numeral 顺序,从几百到几千个单词。我需要计算所有行中的单词总数,以及唯一单词形式的数量。换句话说,从自然语言处理的词汇表中,我想知道我的语料库中 tokens 的数量和 types 的数量,在为了计算type-token比率或词汇密度。
尤其是,在整个专栏中找到独特单词形式的数量已被证明是一项挑战。在一个 ARRAY FORMULA 中,使用相应的函数,我连接了字符串,拆分了单词,将它们换位,然后使用 UNIQUE 函数删除了重复项,然后计算了剩余的单词形式。这适用于由十多个单词列表组成的样本语料库,但是当我达到十五个左右的单词列表时失败了,这与我需要加入我的公式以获得结果的数千个列表相去甚远寻找。
据我所知,问题在于我打算处理的结果字符串超过 50,000 个字符。对于特定情况,我到处都发现了类似的问题和解决方法的建议,主要是通过自定义函数,但我无法复制结果。不用说,自己编写自定义函数超出了我的能力范围。有人建议使用 QUERY headers,但我也没想到这对我的情况是否有帮助。
我得出的公式如下:
通过所有列表获取单词(token)的总数:
=COUNTA(ARRAYFORMULA(SPLIT(JOIN(",";1;B2:B);",")))
通过所有列表获取唯一词形(类型)的数量:
=COUNTA(ARRAYFORMULA(UNIQUE(TRANSPOSE(SPLIT(JOIN(",";1;B2:B);",")))))
A sample in a spreadsheet can be found here.
编辑 1:
我已经包括了去除标点符号的文本列,从中生成单词列表,以及用于生成它们的公式。
编辑 2:
更改了标题以更好地反映总体意图。
对于项目总数,尝试:
=arrayformula(query(flatten(iferror(split(B2:B;",";1);));"select count(Col1) where Col1 !='' label count(Col1) '' ";0))
独特项目总数:
=arrayformula(query(unique(flatten(iferror(split(B2:B;",";1);)));"select count(Col1) where Col1 !='' label count(Col1) '' ";0))
如果 sheet 中的行太多,您可能会遇到问题。如果是这样,请将范围限制设置为 B2:B1000
将此添加到单元格 C1 以获得 'Comma separated items':
的列表
=arrayformula({"Comma separated items";if(B2:B<>"";len(regexreplace(B2:B;"[^\,]";))+1;)})
解释:
arrayformula()
允许计算从一个单元格向下级联 sheet。
所以在 arrayformula()
中,起点是 split(B2:B;",")
为每个逗号分隔的项目创建列。
iferror(split(B2:B;",");"")
在单元格没有逗号的地方留下空白(就像第 32 行的单元格一样)。我通常只使用 ;)
而不是上面显示的 ;"")
,删除 ""
所以 iferror 没有任何结果。
然后 flatten()
获取所有列并将它们展平为一个列。
需要 query()
来计算结果列 count(Col1)
,其中没有单元格为空 where Col1 !=''
,并且 label count(Col1) ''
删除一个标签 'count'通常会显示。
对于唯一值列表,unique()
放在[=21=之前],flatten()
之后。
这是挑战。在 Google Sheets 电子表格中,我有一列可以在其中找到一系列单元格,其中包含用逗号分隔的单词列表,每行一个,最多一千行。每个列表显示从文本中提取的单词,按 alpha-numeral 顺序,从几百到几千个单词。我需要计算所有行中的单词总数,以及唯一单词形式的数量。换句话说,从自然语言处理的词汇表中,我想知道我的语料库中 tokens 的数量和 types 的数量,在为了计算type-token比率或词汇密度。
尤其是,在整个专栏中找到独特单词形式的数量已被证明是一项挑战。在一个 ARRAY FORMULA 中,使用相应的函数,我连接了字符串,拆分了单词,将它们换位,然后使用 UNIQUE 函数删除了重复项,然后计算了剩余的单词形式。这适用于由十多个单词列表组成的样本语料库,但是当我达到十五个左右的单词列表时失败了,这与我需要加入我的公式以获得结果的数千个列表相去甚远寻找。
据我所知,问题在于我打算处理的结果字符串超过 50,000 个字符。对于特定情况,我到处都发现了类似的问题和解决方法的建议,主要是通过自定义函数,但我无法复制结果。不用说,自己编写自定义函数超出了我的能力范围。有人建议使用 QUERY headers,但我也没想到这对我的情况是否有帮助。
我得出的公式如下:
通过所有列表获取单词(token)的总数:
=COUNTA(ARRAYFORMULA(SPLIT(JOIN(",";1;B2:B);",")))
通过所有列表获取唯一词形(类型)的数量:
=COUNTA(ARRAYFORMULA(UNIQUE(TRANSPOSE(SPLIT(JOIN(",";1;B2:B);",")))))
A sample in a spreadsheet can be found here.
编辑 1:
我已经包括了去除标点符号的文本列,从中生成单词列表,以及用于生成它们的公式。
编辑 2:
更改了标题以更好地反映总体意图。
对于项目总数,尝试:
=arrayformula(query(flatten(iferror(split(B2:B;",";1);));"select count(Col1) where Col1 !='' label count(Col1) '' ";0))
独特项目总数:
=arrayformula(query(unique(flatten(iferror(split(B2:B;",";1);)));"select count(Col1) where Col1 !='' label count(Col1) '' ";0))
如果 sheet 中的行太多,您可能会遇到问题。如果是这样,请将范围限制设置为 B2:B1000
将此添加到单元格 C1 以获得 'Comma separated items':
的列表=arrayformula({"Comma separated items";if(B2:B<>"";len(regexreplace(B2:B;"[^\,]";))+1;)})
解释:
arrayformula()
允许计算从一个单元格向下级联 sheet。
所以在 arrayformula()
中,起点是 split(B2:B;",")
为每个逗号分隔的项目创建列。
iferror(split(B2:B;",");"")
在单元格没有逗号的地方留下空白(就像第 32 行的单元格一样)。我通常只使用 ;)
而不是上面显示的 ;"")
,删除 ""
所以 iferror 没有任何结果。
然后 flatten()
获取所有列并将它们展平为一个列。
query()
来计算结果列 count(Col1)
,其中没有单元格为空 where Col1 !=''
,并且 label count(Col1) ''
删除一个标签 'count'通常会显示。
对于唯一值列表,unique()
放在[=21=之前],flatten()
之后。