Как создать копию исходного текста, включая выделенные объекты с помощью PHP, используя результаты из Google Natural Language API

Я обрабатываю некоторый текст с помощью API Google Natural Language и клиентских библиотек PHP, и я хотел бы создать копию исходного текста, который повторяет формат, который вы можете увидеть на скриншоте экрана из Страница пробного использования Google Natural Language где объекты выделены и имеют индекс, который связывает их с их родительским термином:

Крышка экрана из образца вывода

Из результатов у меня есть имя сущности, упоминания и beginOffset. Например:

array (
'name' => 'Google Cloud Natural Language API',
'type' => 'OTHER',
'metadata' =>
array (
'mid' => '/g/11bc5pm43l',
'wikipedia_url' => 'https://pl.wikipedia.org/wiki/NAPI_(API)',
),
'salience' => 0.045935749999999997417177155512035824358463287353515625,
'mentions' =>
array (
0 =>
array (
'text' =>
array (
'content' => 'Google Cloud Natural Language API',
'beginOffset' => 90,
),
'type' => 'PROPER',
'sentiment' =>
array (
'magnitude' => 0.90000000000000002220446049250313080847263336181640625,
'score' => 0.90000000000000002220446049250313080847263336181640625,
),
), //and so on

Я извлекаю основные переменные из результатов, чтобы изменить исходный текст, чтобы включить соответствующую информацию из результатов:

  array (
0 => 'Google Cloud Natural Language API', //The parent term
1 => 'OTHER',
2 => 0.045935749999999997417177155512035824358463287353515625,
3 => 1.600000000000000088817841970012523233890533447265625,
4 => 0,
5 => 16, //This term has 16 associated mentions
6 =>
array ( //Array containing all of the associated mentions
0 => 'Google Cloud Natural Language API',
1 => 'Natural Language API',
2 => 'Natural Language API',
3 => 'Natural Language API',
4 => 'Natural Language API',
5 => 'REST API',
6 => 'Natural Language API',
7 => 'Natural Language API',
8 => 'Natural Language API',
9 => 'Natural Language API',
10 => 'Natural Language API',
11 => 'Natural Language API',
12 => 'Natural Language API',
13 => 'Natural Language API',
14 => 'Natural Language API',
15 => 'Natural Language API',
),
7 =>
array ( //Array containing the beginOffset of each associated mention
0 => 90,
1 => 196,
2 => 321,
3 => 463,
4 => 2421,
5 => 2447,
6 => 2946,
7 => 6167,
8 => 6414,
9 => 8958,
10 => 12039,
11 => 12168,
12 => 12256,
13 => 13179,
14 => 13294,
15 => 13802,
),
),

До сих пор я пробовал это:

<?php

# Open file
$myfile = fopen("sampleText.txt", "r") or die("Unable to open file!");
$data = fread($myfile, filesize("sampleText.txt"));
fclose($myfile);

echo 'Original Text: <br>';
echo $data;
echo '<br>';
echo '<br>';

# Entities occurrence List
$entitiesList = array (
0 => 'Google Cloud Natural Language API',
1 => 'Natural Language API',
2 => 'Natural Language API',
3 => 'Natural Language API',
4 => 'Natural Language API',
5 => 'REST API',
6 => 'Natural Language API',
7 => 'Natural Language API',
8 => 'Natural Language API',
9 => 'Natural Language API',
10 => 'Natural Language API',
11 => 'Natural Language API',
12 => 'Natural Language API',
13 => 'Natural Language API',
14 => 'Natural Language API',
15 => 'Natural Language API',
);

# Samples of ofsetts
$ofsettList = array (
0 => 90,
1 => 196,
2 => 321,
3 => 463,
4 => 2421,
5 => 2447,
6 => 2946,
7 => 6167,
8 => 6414,
9 => 8958,
10 => 12039,
11 => 12168,
12 => 12256,
13 => 13179,
14 => 13294,
15 => 13802,
);

# Size of ofsetts List
$ofsettListLenght = sizeof($ofsettList);

# Index of the entity in the returned results
$index = 1;

# Temporal values array with new formatted string
$tempAmendedEntity = [];

for($i = 0; $i < $ofsettListLenght; $i++) {
$tempAmendedEntity[] = '('. $entitiesList[$i] . ')' . $index;
}

echo 'List of new amended  Strings';
echo '<pre>', var_export($tempAmendedEntity, true), '</pre>', "\n";
echo '<br>';
echo '<br>';

// Method 1
for($i = 0; $i < $ofsettListLenght; $i++) {
$temp1 = str_replace(substr($data, $ofsettList[$i], strlen($entitiesList[$i])), $tempAmendedEntity[$i] , $data);
}

echo 'Text after method 1: <br>';
echo '<pre>', var_export($temp1, true), '</pre>', "\n";
echo '<br>';
echo '<br>';


// Method 2
$keyPairArray = [];

for($i = 0; $i < $ofsettListLenght; $i++) {

$keyPairArray[$entitiesList[$i]] = $tempAmendedEntity[$i];
}

echo 'List of key => value strings';
echo '<pre>', var_export($keyPairArray, true), '</pre>', "\n";
echo '<br>';
echo '<br>';

$temp2 = strtr($data, $keyPairArray);

echo 'Text after method 2: <br>';
echo '<pre>', var_export($temp2, true), '</pre>', "\n";

С помощью метода 1: не все новые строковые значения заменяются, например (API Google Cloud Natural Language) 1 и (REST API) 1 отсутствуют в результате.

С помощью метода 2: заменяет все совпадающие с исходной строкой на новую, но она включает в себя вхождения совпадающей строки, которые не связаны с родительским термином.

Было бы замечательно иметь возможность заменить только строку, которая начинается с определенного ‘beginOffset’ для новой измененной строки.

Текст, который я использую для тестирования, можно скачать здесь: sampleText.txt

0

Решение

Я нашел это полезным для проекта, над которым я работал, потому что когда вы получаете ответ от Google Natural Language, ответ JSON содержит все упоминания об объекте и смещение в исходном тексте, но довольно трудно представить, где в Текст это конкретное упоминание. Таким образом, я получил все упоминания, возвращенные и отсортированные в массиве пары ключ => значение, а затем использовал эти две функции для восстановления исходного текста, включая смещение каждого слова в качестве уникального идентификатора, чтобы легко найти, где находится это слово в тексте.

$ originalString — это значение сущности из массива сущностей key => value, а $ originalOfsett — это ключ. Затем я сформировал новую строку, включающую тег HTML span для стиля:

function stringReplacementInfo($originalString, $originalOfsett) {

$modifiedString = " <span id=\"entity\">(" . $originalString . ")</span><span id=\"index\">" . $originalOfsett . "</span> ";
replaceString($originalString, $originalOfsett, $modifiedString);
}

затем я заменяю измененную строку в исходном тексте одну за другой:

function replaceString($originalString, $originalOfsett, $modifiedString) {

global $data;

$originalStringLenght = mb_strlen($originalString, '8bit');

$preChunk = '';
$postChunk = '';
$chunk = '';

$preChunk = substr($data, 0, $originalOfsett);
$chunk = substr($data, $originalOfsett, $originalStringLenght);
$postChunk = substr($data, $originalOfsett + $originalStringLenght);
$data = $preChunk . $modifiedString . $postChunk;
}

и затем я использовал немного CSS, чтобы он выглядел немного больше как результаты веб-тестовой версии API Natural Language:

#index{
font-size: 0.7em;
color: #3d1766;
}

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

введите описание изображения здесь

Надеюсь, это поможет кому-то еще.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]