我有一大堆文本数据,我正在使用document classification with MALLET对openrefine进行预处理。
有些单元格很长(> 150,000个字符),我正在尝试将它们拆分为< 1,000个字/令牌段。
我可以使用字段长度的“拆分多值单元格”将长单元格拆分为6,000个字符块,这大致可以转换为1,000个单词/标记块,但是它会跨行分割单词,所以我输了我的一些数据。
是否有一个函数可以用来在每第6,000个字符后用第一个空格(“”)分割长单元格,甚至更好,每1,000个单词分割一次?
答案 0 :(得分:2)
这是我的简单解决方案:
转到修改单元格 - > 转换并输入
value.replace(/((\s+\S+?){999})\s+/,"$1@@@")
这将替换每个第1000个空格(连续的空格被计为一个,如果它们出现在分割边界,则替换为@@@)(您可以选择任何您喜欢的标记,只要它不会出现在原文)。
转到修改单元格 - > 拆分多值单元格并使用令牌@@@作为分隔符进行拆分。
答案 1 :(得分:1)
最简单的方法可能是用空格分割你的文字,在每组1000个元素之后插入一个非常罕见的字符(或一组字符),以便进行协调,然后用你的怪异角色使用“拆分多值单元格”(或多个)。
你可以在GREL中做到这一点,但选择“Python / Jython”作为脚本语言会更清楚。
所以:编辑单元格 - >变换 - >的Python / Jython的:
my_list = value.split(' ')
n = 1000
i = n
while i < len(my_list):
my_list.insert(i, '|||')
i+= (n+1)
return " ".join(my_list)
(有关此脚本的说明,请参阅here)
这是一个更紧凑的版本:
text = value.split(' ')
n = 1000
return "|||".join([' '.join(text[i:i+n]) for i in range(0,len(text),n)])
然后您可以使用|||进行拆分作为分隔符。
如果您希望按字符而不是字词进行拆分,看起来您可以使用textwrap
分为两行:
import textwrap
return "|||".join(textwrap.wrap(value, 6000))