2011-11-28 81 views
1

我喜歡從文本中提取單詞。我寫了簡單的正則表達式。使用Perl提取單詞

my $regex = qr[\W]; 
while(<DATA>){ 
    push @words, split $regex; 
} 

我喜歡修改它以包含專有名稱。適當的名字可以組合多個「單詞」。例如..

@names = ('John Smith', 'Joe Smith'); 
+1

你的輸入數據是怎樣的? – Toto

+1

您是否存儲了「允許的」專有名稱的確切列表?如果不是,「專名」的確切規則是什麼 – DVK

+0

M42:通常它是書籍章節或網頁。 DVK:存儲是我唯一的選擇,因爲我不知道規則。經過進一步的思考,我可以構建像\ b [A-Z] [a-z] + [\ s] [A-Z] [a-z] + \ b這樣的開始。 – aartist

回答

2

我不認爲這是一個明確的解決方案。正則表達式在諸如網頁或具有許多異常的書籍的複雜文本空間中是有限的,例如,關於書名呢?看看使用1)自然語言處理還是2)一種索引方法,您可以識別兩個單詞,以大寫字母開頭,分隔一個空格,並查看它們中的一個是否包含已知姓或名的索引。祝你好運。

+0

取決於你對解決這個問題的興趣和其他問題,我可以建議斯坦福在線課程,http://www.nlp-class.org/ – wespiserA

1

也許:

!/usr/bin/env perl 
use strict; 
use warnings; 
use Data::Dumper; 
my @words; 
while(<DATA>){ 
    push @words, $1 if m{([A-Z]\w*\s+[A-Z]\w*)}; 
} 
for my $name (@words) { 
    print "$name\n"; 
} 
print Dumper \@words; 
__DATA__ 
John Smith I am 
He is Joe Smith 
John Doe 
Sam 
Sally 
Sally Girl 
+0

這種方法是一個正則表達式,但它可能不適用於所有情況。我寧願採用列表方法。 – aartist

+0

「列表方法」建議您要用「有效」名稱填充散列;解析你的輸入,如果名字有效,就做任何事情。 – JRFerguson