2012-07-11 62 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"; 

計數文件中的單詞嘗試文本的幾樣塊和看「字」的列表它發現。如果你對此感到滿意,那麼你的代碼就可以工作。

相關問題