Выражение Xpath для первого предложения в абзаце - PullRequest
1 голос
/ 13 июня 2019

Я ищу выражение Xpath для первого предложения в абзаце.

<p>
A federal agency is recommending that White House adviser Kellyanne Conway be 
removed from federal service saying she violated the Hatch Act on numerous 
occasions. The office is unrelated to Robert Mueller and his investigation.
</p>

Результат должен быть:

A federal agency is recommending that White House adviser Kellyanne Conway be 
removed from federal service saying she violated the Hatch Act on numerous 
occasions.

Я попробовал несколько вещей безрезультатно.

$expression = '/html/body/div/div/div/div/p//text()';

Нужно ли мне использовать: //p[ends-with или, может быть, substring-before?

Ответы [ 2 ]

2 голосов
/ 13 июня 2019

Вы не сможете анализировать естественный язык через XPath, но вы можете получить подстроку вплоть до первого периода включительно следующим образом:

substring(/p,1,string-length(substring-before(/p,"."))+1)

Обратите внимание, что это не может быть "первое предложение", если существуют сокращения или другие лексические вхождения периода до окончания первого предложения, если первое предложение заканчивается другой формой пунктуации и т. Д.


Альтернативно и более кратко:

concat(substring-before(/p, "."), ".")

Кредит: Умная идея в комментариях.

1 голос
/ 14 июня 2019

Здесь нет действительно хорошего способа сделать это на уровне Xpath.PHP имеет только Xpath 1.0 и поддерживает только основные строковые операции.Ничто, что может принять во внимание язык / язык.Однако в самом PHP есть что-то для этого в ext/intl.

. Так что извлекайте текстовое содержимое узла элемента абзаца, используя DOM + Xpath в качестве строки, и извлекайте из него первое предложение.

IntlBreakIterator может разбить строку в соответствии с правилами, определенными для локали / языка.

$html = <<<'HTML'
<p>
A federal agency is recommending that White House adviser Kellyanne Conway be 
removed from federal service saying she violated the Hatch Act on numerous 
occasions. The office is unrelated to Robert Mueller and his investigation.
</p>
HTML;

$document = new DOMDocument();
$document->loadXML($html);
$xpath = new DOMXpath($document);

// fetch the first paragraph in the document as string
$summary = $xpath->evaluate('string((//p)[1])');
// create a break iterator for en_US sentences.
$breaker = IntlBreakIterator::createSentenceInstance('en_US');
// replace line breaks with spaces before feeding it to the breaker
$breaker->setText(str_replace(["\r\n", "\n"], '', $summary));

$firstSentence = '';
// iterate the sentences
foreach ($breaker->getPartsIterator() as $sentence) {
  $firstSentence = $sentence;
  // break after the first sentence
  break;
}

var_dump($firstSentence);

Вывод:

string(164) "A federal agency is recommending that White House adviser Kellyanne Conway be removed from federal service saying she violated the Hatch Act on numerous occasions. "

Дополнительно DOMXpath позволяет регистрировать функции PHP и вызывать их изВыражение Xpath.Если вам нужна эта логика на уровне Xpath (чтобы использовать их в условиях), это возможно.

...