我对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;
}
}
}
因为大多数名字都是从段落的开头开始的。然后我正在寻找表示行动或拥有的关键词,但是现在,它会选择不是名字的额外垃圾。必须有一个模块才能做到这一点,对吧?
答案 0 :(得分:4)
从数据中提取名称很难。有各种解决方案。对于命名实体提取,您有以下
Net :: Calais是速度和准确性的最佳选择。如果您需要将底层实现作为开源,请与斯坦福大学图书馆一起使用。
答案 1 :(得分:1)
您是否尝试过搜索CPAN?
http://search.cpan.org/search?query=NLP&mode=all
我也尝试搜索“自然语言”并找到您可能感兴趣的以下内容:
此外,如果你必须自己推出,关于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]+/) { ...