Perl和NLP,解析传记中的名字

时间:2010-07-15 19:07:17

标签: perl module nlp

我对NLP一般都很陌生,但在Perl上非常擅长,我想知道那里有什么样的强大NLP模块。基本上,我有一个带有一堆段落的文件,其中一些是人们的传记。所以,首先我需要寻找一个人的名字,这有助于以后的其他过程。

所以我大概是从这样的事情开始的:

foreach $PPid (0 .. $PPscalar) {
$paragraph = @PP[$PPid];
if ($paragraph =~ /^(\w+ \w\. \w+|\w+ \w+)( also|)( has served| served| worked| joined| currently serves| has| was| is|, )/){
    $possibleName = $1;
    $badName = 0;
    foreach $piece (@pieces){
    if ($possibleName =~ /$piece/){
        $badName = 1;
    }
    }
    if ($badName == 0){
    push @namePile, $possibleName;
    }
}

}

因为大多数名字都是从段落的开头开始的。然后我正在寻找表示行动或拥有的关键词,但是现在,它会选择不是名字的额外垃圾。必须有一个模块才能做到这一点,对吧?

3 个答案:

答案 0 :(得分:4)

从数据中提取名称很难。有各种解决方案。对于命名实体提取,您有以下

  1. The naive approach。我记得看过这个并且对输出不感兴趣。
  2. The dictionary approach。我已经使用了这个,但是很多漏报,而且我不太喜欢它下面的代码。
  3. An open source binary with a perl interface(不推荐,我是这个cpan库的作者 - 而且设置也很繁琐)。
  4. 最佳解决方案是使用Net::Calais perl包装器
  5. 的专有Web服务

    Net :: Calais是速度和准确性的最佳选择。如果您需要将底层实现作为开源,请与斯坦福大学图书馆一起使用。

答案 1 :(得分:1)

您是否尝试过搜索CPAN?

http://search.cpan.org/search?query=NLP&mode=all

我也尝试搜索“自然语言”并找到您可能感兴趣的以下内容:

Lingua::EN::Tagger

此外,如果你必须自己推出,关于NLP,你想看看Regexp::Grammars。这是Parse :: RecDesent的继承者。

答案 2 :(得分:0)

我不知道任何处理英语的Perl模块,以便将其分解为词性。我希望有些库可以用C或C ++或其他东西来做,所以如果你找不到合适的答案,也许你可以扩大你的搜索范围。

一个简单的黑客就是检查两个都是大写的单词:

if (/[A-Z][a-z]+\s+[A-Z][a-z]/) { ...

或检查标题:

if (/(?:Mr|Mrs|Ms|Dr)\.?\s+[A-Z][a-z]+/) { ...