如何使用Perl计算文本中的“真实”单词?

时间:2012-07-11 20:25:36

标签: perl text text-processing

我遇到了文字处理问题。我有一篇文章,我想知道有多少“真实”的单词。

这就是我所说的“真实”。文章通常包含各种标点符号,如破折号,逗号,圆点等。我想知道的是有多少单词,跳过“-”破折号和“,”带空格的逗号等。

我试过这样做:

my @words = split ' ', $article;
print scalar @words, "\n";

但这包括各种标点符号,其中有空格作为单词。

所以我想用这个:

my @words = grep { /[a-z0-9]/i } split ' ', $article;
print scalar @words, "\n";

这将匹配所有包含字符或数字的单词。您怎么看?这是否足够好地计算文章中的单词?

有没有人知道CPAN上的模块可能会这样做?

2 个答案:

答案 0 :(得分:2)

尝试使用:\W - 任何非单词字符,并删除_

<强>解决方案

use strict;

my $article = 'abdc,  dd_ff,  11i-11,  ff44';

# case David's, but it didn't work with I'm or There's
$article         =~ s/\'//g; 
my $number_words = scalar (split /[\W_]+/, $article);

print $number_words;

答案 1 :(得分:1)

我认为你的解决方案与你不会诉诸精巧的东西一样好。

你也可以把它写成

my @words = $article =~ /\S*\w\S*/

或通过编写

来计算文件中的单词
my $n = 0;
while (<>) {
  my @words = /\S*\w\S*/g;
  $n += @words;
}

say "$n words found";

尝试几个示例文本块,然后查看它找到的“单词”列表。如果您对此感到满意,那么您的代码就可以运行。