Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从文本中提取引用(PHP)?_Php_Regex_Quotations - Fatal编程技术网

如何从文本中提取引用(PHP)?

如何从文本中提取引用(PHP)?,php,regex,quotations,Php,Regex,Quotations,你好 我想从文本中提取所有引用。此外,应提取被引用人的姓名 示例: “他们认为‘游戏结束了’,”一位政府高级官员说 他们认为“游戏结束了”这句话以及引用的一位高级政府官员应该被摘录 你认为有可能吗?只有检查是否有被引用的人,才能区分引用和引用中的单词 示例: 马伦上将周日在美国有线电视新闻网的“国情咨文”节目中说:“我认为情况很严重,而且正在恶化。” 欧盟的通过国不是一个引文。但是你如何检测到这一点呢?a) 你检查是否有被引用的人。b)在假设的引文中计数空格。如果少于3个空格,就不会是报价,对吗

你好

我想从文本中提取所有引用。此外,应提取被引用人的姓名

示例:

“他们认为‘游戏结束了’,”一位政府高级官员说

他们认为“游戏结束了”这句话以及引用的一位高级政府官员应该被摘录

你认为有可能吗?只有检查是否有被引用的人,才能区分引用和引用中的单词

示例:

马伦上将周日在美国有线电视新闻网的“国情咨文”节目中说:“我认为情况很严重,而且正在恶化。”

欧盟的通过国不是一个引文。但是你如何检测到这一点呢?a) 你检查是否有被引用的人。b)在假设的引文中计数空格。如果少于3个空格,就不会是报价,对吗?我更喜欢b)因为不总是有一个被引用的人被命名为

如何开始?

我将首先用一个类型替换所有类型的引号,以便以后只需检查一个引号

<?php
$text = '';
$quote_marks = array('“', '”', '„', '»', '«');
$text = str_replace($quote_marks, '"', $text);
?>

你如何改进这一点

我希望你能帮助我。提前非常感谢

如果少于3个空格,就不会是报价,对吗

“不一定,”切亚约兹说

欧盟的通过国不是一个引文。但是你如何检测到这一点呢?a) 你检查是否有被引用的人。b)在假设的引文中计数空格。如果少于3个空格,就不会是报价,对吗?我更喜欢b)因为不总是有一个被引用的人被命名为


b) 在这个例子中甚至不起作用-在“国情咨文”中有3个空格。

引用语总是有标点符号——要么在末尾加逗号,表示要跟在说话人的名字或头衔后面,要么在句子的末尾(.!?)。

正如切耶约兹已经指出的,这不适合于单个函数。你在你的问题中所描述的(检测一句话中一段引语的语法功能——即“我认为它很严重,而且正在恶化”,vs“国情咨文”)最好通过一个能将自然语言分解成标记的库来解决。我不知道PHP中有任何这样的库,但您可以看看python中使用的项目大小:

我认为最好的方法是定义一组语法规则,然后手动进行验证。像这样的东西怎么样:

abstract class QuotationExtractor {

    protected static $instances;

    public static function getAllPossibleQuotations($string) {
        $possibleQuotations = array();
        foreach (self::$instances as $instance) {
            $possibleQuotations = array_merge(
                $possibleQuotations,
                $instance->extractQuotations($string)
            );
        }
        return $possibleQuotations;
    }

    public function __construct() {
        self::$instances[] = $this;
    }

    public abstract function extractQuotations($string);

}

class RegexExtractor extends QuotationExtractor {

    protected $rules;

    public function extractQuotations($string) {
        $quotes = array();
        foreach ($this->rules as $rule) {
            preg_match_all($rule[0], $string, $matches, PREG_SET_ORDER);
            foreach ($matches as $match) {
                $quotes[] = array(
                    'quote' => trim($match[$rule[1]]),
                    'cited' => trim($match[$rule[2]])
                );
            }
        }
        return $quotes;
    }

    public function addRule($regex, $quoteIndex, $authorIndex) {
        $this->rules[] = array($regex, $quoteIndex, $authorIndex);
    }

}

$regexExtractor = new RegexExtractor();
$regexExtractor->addRule('/"(.*?)[,.]?\h*"\h*said\h*(.*?)\./', 1, 2);
$regexExtractor->addRule('/"(.*?)\h*"(.*)said/', 1, 2);
$regexExtractor->addRule('/\.\h*(.*)(once)?\h*said[\-]*"(.*?)"/', 3, 1);

class AnotherExtractor extends Quot...
如果你有一个类似于上面的结构,你可以在其中任何一个/所有的地方运行相同的文本,并列出可能的引用以选择正确的引用。我使用此线程作为测试输入运行了代码,结果是:

array(4) {
  [0]=>
  array(2) {
    ["quote"]=>
    string(15) "Not necessarily"
    ["cited"]=>
    string(8) "ceejayoz"
  }
  [1]=>
  array(2) {
    ["quote"]=>
    string(28) "They think it's `game over,'"
    ["cited"]=>
    string(34) "one senior administration official"
  }
  [2]=>
  array(2) {
    ["quote"]=>
    string(46) "I think it is serious and it is deteriorating,"
    ["cited"]=>
    string(14) "Admiral Mullen"
  }
  [3]=>
  array(2) {
    ["quote"]=>
    string(16) "Not necessarily,"
    ["cited"]=>
    string(0) ""
  }
}

也许$text=preg\u replace('/([“”“\”»«])(.+?)\1/',““\2”,$text);给我们一个输入和所需输出的示例。这种自然语言解析不太可能适合一个简洁的小函数。如果你想得到好的结果,它可能会很快变得异常复杂。@Havenard:这个例子还在讨论中。;)请参阅段落“示例“.你的代码应该做什么?我不明白。”不一定“哦,是的,当然,你是对的。:)但通常不会是一个。如果是一个,通常不会很重要,是吗?b)可以增加到4!?@marco92w和“#LK”$#@^“通常不会在内存中找到,所以我们为什么不使用它来分隔缓存中的块呢?我知道会有一些例外。但我不需要找到所有的报价。如果我能找到90%的报价单,我会很高兴。很多非报价单也是如此
总统向国会发表的年度讲话被称为“国情咨文”。
@ceejayoz:你引用的字符串没有以标点符号结尾。包含它的句子确实如此。引文中会有标点符号。是的,我想这会有助于找到引文。@Lucas Oman-在美国,是的。在女王英语中,只有在合乎逻辑的情况下,puncutation才会出现在引号内——如果标点符号不适用于引号,它就会出现在引号外。这很遗憾。它也不适用于其他语言。但标点符号只是其中的一部分。您可以轻松地为每种语言实现标点分析。不,它是用PHP编写的。我添加了对nltk的引用,以演示正确操作的复杂性。完美!)所以我可以用它。如何为函数提供输入?我如何调用这个函数?并且:我可以简单地在addRule部分添加用于查找引用的正则表达式吗?您可以复制粘贴代码并使用addRule()添加自己的正则表达式。但是,如果您不想添加比正则表达式更复杂的提取算法,您可以在代码中使用
preg\u match\u all()
中的3个正则表达式。剩下的是一个很好的OO-API,它允许您创建其他提取器——比如说,可以进行一些解析的提取器。非常感谢!现在我明白了。我将在这里的另一个问题中询问“完美正则表达式”:
array(4) {
  [0]=>
  array(2) {
    ["quote"]=>
    string(15) "Not necessarily"
    ["cited"]=>
    string(8) "ceejayoz"
  }
  [1]=>
  array(2) {
    ["quote"]=>
    string(28) "They think it's `game over,'"
    ["cited"]=>
    string(34) "one senior administration official"
  }
  [2]=>
  array(2) {
    ["quote"]=>
    string(46) "I think it is serious and it is deteriorating,"
    ["cited"]=>
    string(14) "Admiral Mullen"
  }
  [3]=>
  array(2) {
    ["quote"]=>
    string(16) "Not necessarily,"
    ["cited"]=>
    string(0) ""
  }
}