如何使用PHP或JavaScript从字符串中提取专有名词?

时间:2009-06-26 09:15:04

标签: parsing

如何使用PHP或JavaScript从字符串中提取专有的名词/数值? 例如,像

这样的字符串

Xyz 此页 53 访问此页面。

我希望能够将“Xyz”和“53”分别识别为专有名词和数字

5 个答案:

答案 0 :(得分:1)

一个显而易见的方法是使用正确的知识字典和一些好的索引来快速搜索,如果存在这样的话。

但我觉得你正在寻找一种方法来语法推断一个单词是一个专有名词。

我想不出任何完美的方法,但如果你创建了一系列规则,你可以使用它们来解析一段。

规则可能包括。 *以ly结尾的单词不是专有名词 *诸如和,等等的噪音词不是合适的名词 *带有大写字母但不开头的单词是专有名词

要改进它,您可以使用这些规则来创建专有名词的字典。每当一个单词遵循其中一个规则时,它就会被添加到专有名词词典中或从中删除。

这非常粗糙 - 如果这是在正确的轨道上,那么perhas我可以更具体。

答案 1 :(得分:0)

如果它在句子中总是一个专有名词,那么你可以通过查找以大写字母开头的单词来找到它。如果除了第一个单词之外没有其他内容那么它就是。如果Xyz被命名为Bim de Verdier或者它实际上没有被大写,则会出现问题。

// Get the number with JavaScript and RegExp
var regex = new RegExp("\d+");
var match = regex.exec("Xyz visisted this page this page 53 mins ago.");
if (match == null) {
  alert("No match");
} else {
  var s = "";
  for (i = 0; i < match.length; i++) {
    s = s + match[i] + "\n";
  }
  alert(s);
}

大写单词可与“[A-Z] [a-z] + []”匹配。

答案 2 :(得分:0)

PHP函数is_numericucfirst可能有助于识别单词:

function parse_name_and_number($sentence) {
    $words = explode(' ', $sentence);
    $name = array();
    foreach ($words as $word) {
        if (is_numeric($word))
            $number = $word;
        elseif ($word == ucfirst($word))
            $name[] = $word;
    }
    $name = implode(' ', $name);
    return array('name' => $name, 'number' => $number);
}

print_r(parse_name_and_number('Xyz visited this page 53 minutes ago'));
// output:  Array ( [name] => Xyz [number] => 53 )

print_r(parse_name_and_number('we thought Bim de Verdier visited the page 5 seconds ago'));
// output:  Array ( [name] => Bim Verdier [number] => 5 )

print_r(parse_name_and_number('Weirder input messes up the results'));
// output:  Array ( [name] => Weirder [number] => )

答案 3 :(得分:0)

最好的选择是使用链接语法。解析句子并提取专有名词。

www.link.cs.cmu.edu/link

答案 4 :(得分:0)

Xyz visisted this page this page 53 mins ago.

现在,只要获得“看过这个页面”或其他什么的位置,这就是你从发送开始的长度。例如,如果“Person”始终位于开头,则只需将起点设置为7并从第一个数字中减去7。这是一个简单的JS示例:

alert(str.substr(7, str.IndexOf("visited") - 7));

哪个应该返回“Xyz”。希望有所帮助。当然,这只有在你知道你的句子的结构时才有效。在给出的例子中就是这种情况。

P.S。我知道我迟到了两年,但这可能会对将来有所帮助。