如何提取文本中每一段的前 N ​​个单词?

如何提取文本中每一段的前 N ​​个单词?

你能告诉我如何提取文本中每一段的前 N ​​个(例如 30 个)单词吗?也许使用正则表达式?

答案1

正如我在评论中所说,缺少了很多重要信息。以下内容将从一个简单的文本文件中提取每个段落的前 30 个单词,并且可以在任何 *nix(Linux、OSX、Unix etx)中正常工作。

作为示例,我将把此文本保存为file.txt

Lorem ipsum dolor sit amet,consectetur adipiscing elit。 Nulla at diam commodo turpis dictum porttitor。现在,他已经走了,港口停了下来,他不再航行,因为他已经死了。 Pellentesque 是一款优质无边框手机壳。 Sed sed felis quam。 Pellentesque pellentesque lorem non libero feugiat sollicitudin。在 ut consequat felis。 Phasellus sed arcu mi,vitae dictum arcu。 Quisque lectus massa,tempus vitae elementum nec,adipiscing ut risus。

在乌尔纳湖中,人们用格言引导自己。 Donec pharetra quam sed augue ornare aliquam。软体动物的翅膀就像坚硬的物体。 Aenean 在 lorem 处 elit vestibulum malesuada。 Aliquam sollicitudin volutpat massa et convallis。我将通过我的一生来承受痛苦。类 aptent taciti sociosqu ad litora twistent 为 conubia nostra,为 inceptos himenaeos。除非另有说明,否则我们不接受任何形式的歧视,因为这是他们的义务。阿里夸姆的 Morbi sagittis varius felis。时间不允许,lorem 和 bibendum 是无效的。 Cras lacinia rhoncus massa ac tempor。

Pellentesque fringilla,在 hendrerit iaculis 之前,mauris sem placerat felis,vitae ultrices nisl lorem ac ligula。 Sed viverra nunc quii dictum a porta tellus semper. Aenean felis sapien,dictum et luctus quis,mattis at massa。 Nam lacus magna,suscipit at consectetur ut,mollis at sem。 Nam euismod mi a nulla rutrum placerat。 Nulla dignissim facilisis turpis et faucibus。 Donec 自由爱神,venenatis congue volutpat id,fringilla in felis。 Ut vulputate,tellus sed malesuada varius,dolor ligula elementum leo,eu faucibus nulla erat at nisi。

Aliquam 已经康复了。 Nulla convallis,leo sit amet placerat lacinia,nisl lectus tempor mi,id pharetra ipsum sapien varius nulla。 Nam mollis,nulla at molestie gravida,neque libero consequat odio,nec aliquam tellus arcu ullamcorp per quam。埃蒂安·艾格尼丝(Etiam a ligula)没有元素的尊严。 Lorem ipsum dolor sit amet,consectetur adipiscing elit。慈善家协助亨德利特社会。 Sed lobortis tincidunt accumsan。在 nunc massa,varius in vehicula at,placerat sit amet elit。

Fusce sed dui ante。纯粹的毛茸茸,在赛道上咆哮,威风凛凛,魅力十足。 Sed dapibus,nisl in hendrerit hendrerit,purus libero accumsan lectus,at gravida erat sem a ligula。 Phasellus accumsan 不是大箭竹,而是细小的竹笋。 Vestibulum posuere massa quis neque pharetra at elementum justo condimentum。未经允许不得转载:新闻 » 特朗普:特朗普夫妇确诊,医生确诊身体僵硬,没有叶子,没有叶子,没有叶子,没有叶子,没有叶子,没有生命,没有爱。伟大的智者,善良的燕雀,充满灵性,充满生机。

运行这个小 Perl 脚本将打印每个段落的前 30 个单词(段落之间需要空行):

$ perl -e 'while(<>){
     chomp; $par.=$_; 
     if (/^\s*$/){
        @a=split(/\s/,join("",$par)); 
        print "@a[0..29]\n\n";
        $par="";
        next;
     }
   } 
 @a=split(/\s/,join("",$par)); 
 print "@a[0..29]\n";' file.txt | fold -s

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla at diam commodo 
turpis dictum porttitor. Nunc velit massa, porttitor sit amet rutrum vel, 
imperdiet eget sem. Pellentesque a neque porttitor

Donec in lacus urna, sed dictum lectus. Donec pharetra quam sed augue ornare 
aliquam. Aenean mollis velit eu justo scelerisque elementum. Aenean at lorem at 
elit vestibulum malesuada. Aliquam sollicitudin

Pellentesque fringilla, ante a hendrerit iaculis, mauris sem placerat felis, 
vitae ultrices nisl lorem ac ligula. Sed viverra nunc quis dui dictum a porta 
tellus semper. Aenean felis sapien, dictum

Aliquam erat volutpat. Nulla convallis, leo sit amet placerat lacinia, nisl 
lectus tempor mi, id pharetra ipsum sapien varius nulla. Nam mollis, nulla at 
molestie gravida, neque libero consequat odio,

Fusce sed dui ante. Mauris purus est, rhoncus in cursus sit amet, pretium 
porttitor magna. Sed dapibus, nisl in hendrerit hendrerit, purus libero 
accumsan lectus, at gravida erat sem a

有很多方法可以做到这一点,有些比较简单,有些比较复杂。如果你根据具体要求更新你的问题,我会更新我的答案。

答案2

在文本编辑器 Sublime Text 2 中,可以使用以下正则表达式匹配纯文本文件中每一段的前 30 个单词:

^((([^ \n]+) ?){1,30})

截屏

要删除其他所有内容,请搜索^((([^ \n]+) ?){1,30}).*并替换为$1。这将丢弃每段前 30 个单词之后的所有内容。

答案3

正如 terdon 指出的那样,您的问题非常模糊。如果我们假设“文本”包含由空行分隔的段落,并且“单词”是按照所使用的正则表达式风格定义的单词字符序列,则以下示例(在 Python 中)可能会帮助您入门(文本来自这里):

>>> import re
>>> pattern = r"(?:^|\n\n)((?:\W*\w+){,30})"
>>> for x in re.findall(pattern, text):
...     print(x)
...     print("---")
... 
Loop quantum gravity (LQG) is a theory that attempts to describe the
quantum properties of gravity. It is also a theory of quantum space
and quantum time, because, as discovered
---
More precisely, space can be viewed as an extremely fine fabric or
network "woven" of finite loops. These networks of loops are called
spin networks. The evolution of a spin
---
Today LQG is a vast area of research, developed in several directions,
which involves about 50 research groups world wide.[1] They all share
the basic physical assumptions and the
---
Several research directions study the physical consequences of the
theory. Among these, the most developed is the application of LQG to
cosmology, called Loop quantum cosmology (LQC). LQC applies LQG
---
>>> 

上面代码中使用的正则表达式:

(?:^|\n\n)((?:\W*\w+){,30})

... 有几个部分。首先,(?:^|\n\n)匹配文本的开头^,或一对换行符\n\n(换句话说,一个空白行)。然后,匹配零个或多个非单词字符序列\W*,后跟一个或多个单词字符,\w+匹配 0 到 30 次{,30}(?:...)括号将正则表达式的各个部分分组,而不允许它们被“捕获” re.findall(),而裸露的(...)括号表示正则表达式的一部分被捕获。

相关内容