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

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

Screen cap from sample output

Из результатов:У меня есть имя сущности, упоминания и 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,
    ),
  ),

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

<code><?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), '
', "\ n";echo '
';echo '
';// Метод 1 для ($ i = 0; $ i <$ ofsettListLenght; $ i ++) {$ temp1 = str_replace (substr ($ data, $ ofsettList [$ i], strlen ($ entityList [$ i])), $tempAededEntity [$ i], $ data);} echo 'Текст после метода 1: <br>';echo '
', var_export($temp1, true), '
', "\ n";echo '
';echo '
';// Метод 2 $ keyPairArray = [];for ($ i = 0; $ i <$ ofsettListLenght; $ i ++) {$ keyPairArray [$ entityList [$ i]] = $ tempAmendEntity [$ i];} echo 'Список ключей => строк значений';echo '
', var_export($keyPairArray, true), '
', "\ n";echo '
';echo '
';$ temp2 = strtr ($ data, $ keyPairArray);echo 'Текст после метода 2:
';echo '
', var_export($temp2, true), '
', "\ n";

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

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

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

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

1 Ответ

0 голосов
/ 04 августа 2018

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

$ originalString - значение сущности из массива сущностей ключ => значение, а $ 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;
}

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

enter image description here

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

...