【问题标题】:Split multi-paragraph documents into paragraph-numbered sentences将多段落文档拆分为段落编号的句子
【发布时间】:2013-08-13 00:51:42
【问题描述】:

我有一个解析良好的多段落文档列表(所有段落由 \n\n 分隔,句子由“.”分隔),我想将其拆分为句子,连同一个数字,该数字指示文档中的段落编号。例如(两段)输入为:

First sentence of the 1st paragraph. Second sentence of the 1st paragraph. \n\n 

First sentence of the 2nd paragraph. Second sentence of the 2nd paragraph. \n\n

理想的输出应该是:

1 First sentence of the 1st paragraph. 

1 Second sentence of the 1st paragraph. 

2 First sentence of the 2nd paragraph.

2 Second sentence of the 2nd paragraph.

我熟悉 Perl 中的 Lingua::Sentences 包,它可以将文档分成句子。但是它与段落编号不兼容。因此,我想知道是否有其他方法可以实现上述目标(文档不包含缩写)。任何帮助是极大的赞赏。谢谢!

【问题讨论】:

  • 一次分割一个段落,然后在每个句子前面加上当前段落编号。

标签: regex perl nlp text-segmentation


【解决方案1】:

正如你提到的Lingua::Sentences,我认为这是一个选项,可以稍微操纵这个模块的原始输出以获得你需要的东西

use Lingua::Sentence;

my @paragraphs = split /\n{2,}/, $splitter->split($text);

foreach my $index (0..$#paragraphs) {
    my $paragraph = join "\n\n", map { $index+1 . " $_" } 
        split /\n/, $paragraphs[$index];
    print "$paragraph\n\n";
}

【讨论】:

  • 谢谢!实际上文档中的每个段落都位于一行,那么有没有什么办法可以只输出行号呢?
  • 我不知道你的意思是什么行号。此代码 sn-p 为您提供与您描述的相同的输出。
  • 稍作调整即可正常工作。谢谢!
【解决方案2】:

如果您可以依靠句点 . 作为分隔符,您可以这样做:

perl -00 -nlwe 'print qq($. $_) for split /(?<=\.)/' yourfile.txt

解释:

  • -00 设置输入记录分隔符为空字符串,即段落模式。
  • -l 将输出记录分隔符设置为输入记录分隔符,在这种情况下转换为两个换行符。

然后我们简单地用一个lookbehind断言分割句点并打印句子,前面是行号。

【讨论】:

  • 非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 2020-09-21
  • 2014-06-01
  • 1970-01-01
相关资源
最近更新 更多