如何在字符串中找到合适的名词?

时间:2010-09-22 14:03:47

标签: php

我正在尝试在用户提交的3-4句段中识别专有名词。我有一个有缺陷的功能,因为我有一个主持人团队验证几乎所有东西。

下面是传入段落的示例。

  尼克·斯威舍斯在詹姆斯·希尔兹的主场迎战,在第一局中以5分为主,纽约洋基队在周二晚上以8-3击败坦帕湾,在AL的比赛中以2比1的比分领先东。

我希望该功能可以使用以下关键字/专有名词。

  

Nick Swisher,James Shields,纽约洋基队,坦帕湾,Rays,AL East

我想我可以爆炸字符串并用空格分隔单词。然后我会检查每个单词,看看第一个字母是否大写。如果是,请退货。如果没有,请转到下一个单词。

但多字关键词/专有名词怎么样?如何在已找到的第一个字母加盖字后检查单词的功能?

所以这个函数会找到Nick但我怎么告诉它检查下一个字呢?因此,检查下一个是否有上限,如果是,请返回Nick Swisher。如果没有,就回到尼克身边。

进一步说,如果这是一个3个字的短语怎么办?找到新的,约克被发现,我如何才能找到洋基队呢?

8 个答案:

答案 0 :(得分:6)

试试这样的正则表达式:

[A-Z]{1,1}[a-z]*([\s][A-Z]{1,1}[a-z]*)*

但请务必检查区分大小写

答案 1 :(得分:2)

我认为你不能依赖大写。即使您不需要使用除英语之外的其他语言(例如德语大写所有名词),相当大比例的用户根本不会大写,或者不一致。

我怀疑任何基于语法规则的尝试都会失败 - 你的3个单词组合的问题指向那个。真正的问题是你可能找不到一个有用的,非模糊的句法定义,究竟什么是“专有名词”。

接近它的另一种方法是使用已知专有名词列表(城市名称,给定名称,姓氏),并假设如果您发现其中两个或多个仅用空格分隔,则它是复合名词

答案 2 :(得分:1)

我之前使用过这项服务Open Calais来完成一个项目。可能会为你工作。您必须编写一个简单的脚本来将文本上载到服务器。检查他们的API以了解如何配置等

答案 3 :(得分:1)

你通常不能做这样的事情,不容易。

如果他忘了利用专有名词怎么办? “星期四”怎么样?句子怎么样:“只有我。这个人。”?

最简单的方法可能是通过检测大写字母,一系列大写字母将被视为专有名词。最难的方法是对英语句子进行(语言)语法分析,这很难做到。

答案 4 :(得分:1)

这将匹配以大写字母开头的单词,甚至是多个后续单词:

$text = 'Nick Swisher homered off James Shields to key a five-run burst in the first inning and the New York Yankees beat Tampa Bay 8-3 on Tuesday night, opening a 2 1/2-game lead over the Rays in the AL East.';

$matches= array();
preg_match_all('/([[:upper:]]+[[:lower:]]*(\W|$))+/', $text, $matches);
print_r($matches);

请注意,$matches[0]中的字符串都以$matches[2]中找到的字符结尾。这可以通过foreach清理语句轻松解决,也可以通过修改正则表达式来解决。

答案 5 :(得分:1)

这是一个脚本,在你的段落上运行时会生成一个包含以下值的数组:

数组([0] => Nick Swisher [1] => James Shields [2] => New York Yankees [3] => Tampa Bay [4] =>星期二[5] => ;光线[6] => AL East。)

这有用吗?

$proper_nouns = Array();
$words = explode(' ', $paragraph);
for ($i = 0; $i < count($words); $i++) {
    if (preg_match('/[A-Z]/', $words[$i]) > 0) {
        $proper_noun = $words[$i];
        $index = 1;
        while (true) {
            if ($i + $index < count($words)) {
                if (preg_match('/[A-Z]/', $words[$i + $index]) > 0) {
                    $proper_noun = $proper_noun." ".$words[$i + $index];
                    $index++;
                }
                else {
                    $i = $i + $index - 1;
                    break;
                }
            }
            else {
                break;
            }
        }
        array_push($proper_nouns, $proper_noun);
    }
}

答案 6 :(得分:1)

不确定您正在使用哪种语言,但是php class找到合适的名词。它使用的不仅仅是大写字母。即使您没有使用php,也可以将其用作您正在使用的语言的模型。以下是描述:

专有名词类可以使用基于句法线索的启发式方法从给定文本中查找和提取专有名词,如首字母大写,句子中的单词位置等。它可以尝试使用连词组合专有名词来查找多个专有名词。此类提供自定义,以便它可以应用于其他语言,语法使用相同的启发式。

答案 7 :(得分:0)

如果您需要的不仅仅是正则表达式,最好的方法是使用自然语言处理器,例如构建在Solr之上的openNLP。 http://opennlp.apache.org/

您的第一步是安装Apache Solr / Lucene。 https://lucene.apache.org/solr/

您可以在几分钟内下载Solr并启动并运行。然后安装/构建openNLP。

这听起来令人生畏,但它会给你很多力量和一个真正可扩展的解决方案,如专有名词提取等等。