2011-11-28 84 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