【问题标题】:Openrefine: Split multi-valued cells by token/word count?Openrefine:按令牌/字数拆分多值单元格?
【发布时间】:2018-09-14 17:58:51
【问题描述】:

我正在使用 openrefinedocument classification with MALLET 预处理大量文本数据。

有些单元格很长(>150,000 个字符),我正在尝试将它们拆分为

我可以使用“拆分多值单元格”按字段长度将长单元格拆分为 6,000 个字符块,这大致转换为 1,000 个单词/令牌块,但它会将单词拆分为行,所以我输了我的一些数据。

是否有一个函数可以让我在每 6,000 个字符后用第一个空格 (" ") 分割长单元格,或者更好的是,每 1,000 个单词分割一次?

【问题讨论】:

    标签: nlp openrefine


    【解决方案1】:

    这是我的简单解决方案:

    转到编辑单元格 -> 变换并输入

    value.replace(/((\s+\S+?){999})\s+/,"$1@@@")
    

    这将用@@@替换每1000个空格(连续的空格被计为一个,如果它们出现在分割边框处则被替换)(你可以选择任何你喜欢的标记,只要它没有出现在原始文本)。

    转到编辑单元格 -> 拆分多值单元格并使用标记@@@ 作为分隔符进行拆分。

    【讨论】:

    • 好主意。我想知道我们是否不能修改这个正则表达式只在一个点之后拆分,这将允许在每个块中获得完整的句子:value.replace(/((\s+\S+?){999,})\S+(\.)/,"$0@@@")
    • 谢谢。下面提供的 Python/Jython 更清楚地说明了它的工作原理,但这更容易实现。一段时间后分手也是一个聪明的主意。如何修改函数以在句号、问号或感叹号后拆分?
    • 就用这个吧:value.replace(/((\s+\S+?){999,})\S+[\.\?!]/,"$0@@@")。它现在分成至少 1000 个字符长的段,然后一直到下一个句号、问号或感叹号。
    • 嗯,看起来最后一个正则表达式有问题。可能是某个地方的无限循环。
    • 这很奇怪,因为它对我有用。您是否收到错误消息或什么也没发生。您的测试语料库是否足够容纳 1000 个单词?为了测试,我总是将 999 降低到 9。也许你可以试试这个。
    【解决方案2】:

    最简单的方法可能是用空格分割你的文本,在每组 1000 个元素之后插入一个非常罕见的字符(或一组字符),重新连接,然后对你的奇怪字符使用“分割多值单元格”( s)。

    您可以在 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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2015-10-09
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多