gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 00:38:42 24 4
gpt4 key购买 nike

您好!

我想从文本中提取所有引文。此外,应提取被引用人的姓名。 DayLife does this very well.

示例:

“They think it’s ‘game over,’ ” one senior administration official said.

They think it's 'game over' 和被引用的人 one senior administration official 应该被提取。

你认为这可能吗?如果您检查是否提到了被引用的人,您只能区分引文和引号中的单词。

示例:

“I think it is serious and it is deteriorating,” Admiral Mullen said Sunday on CNN’s “State of the Union” program.

State of the Union 不是引文。但是你如何检测到这一点? a) 你检查是否提到了被引用的人。 b) 你计算假定引文中的空格。如果少于 3 个空格就不是引号,对吧?我更喜欢 b) 因为并不总是有被引用的人的名字。

如何开始?

我会先用一种类型替换所有类型的引号,这样您以后只需检查一个引号。

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

然后我会提取引号之间包含超过 3 个空格的所有短语:

<?php
function extract_quotations($text) {
$result = preg_match_all('/"([^"]+)"/', $text, $found_quotations);
if ($result == TRUE) {
return $found_quotations;
// check for count of blank spaces
}
return array();
}
?>

你如何改进它?

我希望你能帮助我。非常感谢您!

最佳答案

正如 ceejayoz 已经指出的,这不适合单个函数。您在问题中描述的内容(检测句子中引号转义部分的语法功能 - 即“我认为这很严重并且正在恶化”与“国情咨文”相比)最好用图书馆来解决可以将自然语言分解为标记。我不知道 PHP 中有任何此类库,但您可以查看您将在 python 中使用的项目大小:http://www.nltk.org/

我认为您能做的最好的事情就是定义一组您手动验证的语法规则。像这样的事情怎么样:

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) ""
}
}

关于php - 如何从文本(PHP)中提取引文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1323516/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com