2012-07-11 43 views
3

我遇到了文本处理问题。我有一篇文章,我想知道有多少“真实”的单词。如何用Perl计算文本中的“真实”单词?

这是我的意思是“真实的”。文章通常包含各种标点符号,如短划线,逗号,点等。我想知道的是有多少个单词,像“-”短划线和“,”逗号跳过空格等。

我试着这样做:

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

但包括有空格的话作为各种标点符号。

所以我想用这个的:

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

这将匹配任何字符或数字在他们的所有单词。你怎么看,这是否足够好的方式来计算文章中的词汇?

有没有人知道这可能是CPAN上的一个模块吗?

+1

你做过任何测试吗? – TheZ 2012-07-11 20:27:00

+0

1)在一小段具有已知字数的示例文本上运行代码。 2)调整你的代码,直到它同意。 – Flimzy 2012-07-11 20:27:53

+1

你的单词是否包含任何非ascii字符? – TLP 2012-07-11 21:33:14

回答

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; 
+0

+1我正在研究类似的解决方案,比如'$ words + = scalar split /(?:\ s | \ W)+ /' – Birei 2012-07-11 20:55:34

+1

将“David's”这样的单词计为两个单词。 – Borodin 2012-07-11 22:25:26

+1

我也不知道'11i-11'可能是什么类型的东西,但最好把它看作一个单词,再加上'short-term'和类似的带连字符的形容词。 – Borodin 2012-07-11 22:38:12

1

我认为您的解决方案是,你会得到不一样好诉诸于某些细节。

你也可以把它写成

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

或通过写

my $n = 0; 
while (<>) { 
    my @words = /\S*\w\S*/g; 
    $n += @words; 
} 

say "$n words found"; 

计数文件中的单词尝试文本的几样块和看“字”的列表它发现。如果你对此感到满意,那么你的代码就可以工作。

相关问题