home

Исследование: что мы теряем при поиске только по метаданным

words_count_in_titles_and_texts.png

Раньше я уже делал доклад по поисковой оптимизации электронных библиотек и звучали слова, что тот факт, что поисковики не будут отправлять пользователей в полугиговые PDF существенно уменьшает число поисковых запросов, на которые электронная библиотека попадёт в выдачу.

Но как оценить, насколько существенно это может повредить?

А можно измерить сколько уникальных слов встречается в заглавии ресурса и сколько в тексте.

Для этого написан небольшой скрипт, который извлекает текст из заглавий и из содержимого и можно сравнить сколько уникальных слов находится в заглавиях и сколько в тексте.

Для очистки от мусора, оставлялись только латинские и русские буквы, a-zA-Zа-яА-Я, а всё остальное вырезалось. Другой обработки слов не осуществлялось, в том числе слова не приводились к нормальной форме.

Анализ показал на примере https://elis.psu.ru, что на 9550 проанализированных документов (PDF, EPUB и т.п.) в заглавиях содержится 17292 разных слов, а в тексте 1914810 разных слов.

Т.о. в текстах в библиотеке содержится в 110 раз больше слов, чем в заглавиях.

Код[править]

Пример кода для подсчета слов:

<?php

require_once('drupal.bootstrap.php');

ini_set('memory_limit','10G');
module_load_all();

$words_title = array(); // only title words
$words_text = array();  // all text words

gc_enable();

$nodes = db_select('node','n')->fields('n')->condition('n.status','1')->condition('n.type','ebookpage','<>')->execute();

$i = 0;
foreach ($nodes as $res) {
  $node = node_load($res->nid);
  if ($node != false) {
    addWordsToArray($node->title, $words_title);
    $i++;
    $elisSearch = new ElisSphinxSearch();
    $textFragments = $elisSearch->getTextFragmentsForEntity($node,'node');
    if ($textFragments != false) {
      foreach ($textFragments as $fragment=>$text) {
        if ($text != null && is_string($text)) {
          addWordsToArray($text, $words_text);
        }
      }
    }
    if ($i % 10 == 0) {
      drupal_static_reset();
      print "$i titles: " . count($words_title) . ' texts: ' . count($words_text) . "\n";
    }
  }
}

print "title word count: " . count($words_title) . "\n";
print "text word count: " . count($words_text) . "\n";

function addWordsToArray($str, &$arr) {
  $words = preg_split("/\s|\n/", $str);
  foreach ($words as $word) {
    $word = preg_replace("#[^A-Za-zЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮёйцукенгшщзхъфывапролджэячсмитьбю]#","",$word);
    if (is_string($word) && strlen($word)) {
      if (!isset($arr[$word])) {
        $arr[$word] = 1;
      } else {
        $arr[$word]++;
      }
    }
  }
}