【问题标题】:limit text files to a certain word length, but keep complete sentences将文本文件限制为一定的字长,但保留完整的句子
【发布时间】:2015-10-25 04:30:11
【问题描述】:

我有一个需要复制的文本文件语料库,但将每个文件限制为大致相同的字长,同时保持完整的句子。将{.?!} 中的任何标点符号视为句子边界是可以接受的。我可以用 python 做到这一点,但我正在尝试学习 bash,所以欢迎提出建议。我一直在考虑的方法是让我的目标词长超出几个词,然后将结果修剪到最后一个句子的边界。

我对@9​​87654322@ 和wc 很熟悉,但我想不出将两者结合起来的方法。 headman 文件未指明使用字数统计的方法,wcman 文件未指明拆分文件的方法。

上下文: 我正在使用机器学习进行文本分类任务(使用weka,作为记录)。我想确保文本长度(在我的数据中变化很大)不会对结果产生太大影响。为此,我尝试在执行特征提取之前标准化我的文本长度。

【问题讨论】:

  • 我不了解 bash,但这对我来说听起来不是一个好主意,因为这样可能会丢失重要信息。我将首先使用 TF-IDF 进行特征提取,然后进行卡方检验以保留更少的特征(仅重要的特征)。这将确保为每个文本保留重要特征,无论长度如何。你有这个问题吗?有更好的方法,但我不知道有什么会从原始文本中删除整个单词。
  • @IVlad 分类任务是基于文本复杂度(即可读性),所以缩短文本假定文本的所有部分具有大致相同的复杂度。丢失特定术语不是问题。

标签: bash machine-learning nlp feature-selection normalize


【解决方案1】:

让我们考虑一下这个测试文件:

$ cat file
Do I exist? I program. Therefore, I am!

假设我们要截断这个文件以完成不超过 20 个字符的句子:

$ awk -v n=20 -v RS='[.?!]' '{if (length(s $0 RT)>n) exit; else s=s $0 RT;} END{print s;}' file
Do I exist?

如果我们想要 30 个字符或更少:

$ awk -v n=30 -v RS='[.?!]' '{if (length(s $0 RT)>n) exit; else s=s $0 RT;} END{print s;}' file
Do I exist? I program.

工作原理

  • -v n=20

    这会将 awk 变量 n 设置为我们想要的最大长度(不包括文件的最终换行符)。

  • -v RS='[.?!]'

    这会将 awk 记录分隔符 RS 设置为您提到的三个字符中的任何一个。

  • if (length(s $0 RT)>n) exit; else s=s $0 RT

    对于文件中的每条记录(一条记录是一个句子),我们测试看看将它添加到s 是否会使输出过长。如果它使输出太长,那么我们退出。如果没有,我们将其添加到s

    在 awk 中,$0 代表完整的记录,RT 是 awk 在记录末尾找到的记录分隔符。

  • END{print s;}

    在我们退出之前,这会打印字符串s

备选方案 1:根据字数截断

假设我们想根据单词的数量进行截断。例如,如果我们想要 6 个单词:

$ awk -v n=6 -v RS='[[:space:]]+' 'NR>n{exit;} {printf "%s%s",$0,RT;} END{print"";}' file
Do I exist? I program. Therefore, 

不同之处在于我们知道使用空格作为记录分隔符。这样,每条记录就是一个单词,一直打印单词,直到达到极限。

备选方案 2:整个句子,但字数有限

$ awk -v n=6 -v RS='[.?!]' '{c+=NF; if (c>n) exit; else s=s $0 RT;} END{print s;}' file
Do I exist? I program.

Mac OSX

上面将记录分隔符RS 设置为正则表达式。这可能需要 GNU awk (gawk)。 OSX man page for awk 没有说明是否支持此功能。不过@bebop 报告说,从macports 安装gawk 后,上面的代码可以在OSX 上成功运行。

【讨论】:

  • 感谢您的详尽解答!我从未使用过awk,但我愿意尝试一下。有没有一种基于字数而不是字符数的简单方法?标记化不一定是完美的。只用空格分割就足够了。
  • awk 是完成这项工作的正确工具。我添加了一个示例,它不是根据句子或字符而是根据字数截断。
  • 是的,但这不会产生一个完整的句子。我想指定一个近似的字数,但要确保我在附近的句子边界处切入。
  • 好的。我为此添加了一个版本。
  • 再次感谢!你让我相信我需要花一些时间来学习awk。它似乎非常适合这种文本处理工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-18
  • 2020-05-26
  • 2012-03-29
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
相关资源
最近更新 更多