php: скрипт приближения слов? - PullRequest
0 голосов
/ 03 апреля 2011

Хорошо. Итак, я потратил целые годы на поиск в Google, и даже прошел несколько конкретных поисков по горячим сценариям и т. д., несколько форумов php и это место ... ничего (бесполезно в любом случае).

я хочу иметь возможность взять блок текста (page / file / doc) и разделить его, чтобы найти «расстояние» между определенными терминами (найти расстояние / рациональное расстояние и т. Д.).

Я думал, что вокруг будет по крайней мере несколько таких трещин, но я их не нахожу. Так что - это может быть сложнее, чем я думал. Я понимаю, что это может быть несколько «голодным» трудом - поскольку он может быть довольно интенсивным для больших документов - но, конечно, это возможно?

Infact - хотя и оглядываясь вокруг - большинство ссылок, которые я нахожу (кроме lamo-repeat SEO сайтов), похоже, предлагают расширенные лингвистические исследования, странные / продвинутые пакеты для установки на сервер и т. Д.

Должен ли я считать, что "близость" на самом деле является очень сложной проблемой, и потребует серьезных ресурсов и очень много развития? (Честно говоря - на мой взгляд, это кажется несколько умеренным - поэтому мне интересно, что именно мне не хватает (Примечание: Простое в относительном смысле ... Я бы сравнил его с легким (плотность / количество) и трудным ( слово stemming / основа / тезаурусинг)).

Итак - ссылки / предложения / идеи / мысли ???

Ответы [ 3 ]

0 голосов
/ 03 апреля 2011

Если вы говорите о сравнении отдельных слов, вам нужно взглянуть на функцию SOUNDEX в MySQL.(Я предполагаю, что вы можете использовать mysql).Сравнивая два слова, вы можете получить ссылку на их звучание:

SELECT `word` FROM `list_of_words` WHERE SOUNDEX(`word`) = SOUNDEX('{TEST_WORD}');

Затем, когда вы получите свой список слов (как, скорее всего, вы получите довольно много), вы не можете проверить расстояние междуэти слова для слова CLOSEST (или группы слов в зависимости от того, как вы пишете свой код).

$word = '{WORD TO CHECK}';
$distance = 4; // the smalled the distance the closed the word
foreach($word_results as $comparison_word) {
   $distance = levenshtein($comparison_word, $word);
   if($distance < $threshold) {
      $threshold = $distance;
      $similar_word = $comparison_word;
   }
}
echo $similar_word;

Надеюсь, что это поможет вам найти нужное направление.Удачного кодирования!

0 голосов
/ 07 апреля 2011

Ваш пример искал Word1 ... Word2, должно ли совпадать Word2 ... Word1?Простое решение - использовать RegEx:

, т. Е.:

  1. , использовать regex: \ bWord1 \ b (. *) \ BWord2 \ b
  2. в первом совпадениигруппировать, использовать пробел (или любую другую границу), чтобы разделить его на массив, и считать

, это самый простой метод, но определенно не лучший (то есть с точки зрения производительности).Я думаю, что вам нужно уточнить свои потребности, если вы хотите получить более конкретный ответ.

Обновление:

После того, как два вопроса объединены, я вижу другие ответы, в которых упоминаются soundex, levinstein и расстояние Хэмминга и т. Д.Я бы предложил theclueless1 РАЗЪЯСНИТЬ требования, чтобы люди могли оказать полезную помощь.Если это приложение, связанное с поиском или кластеризацией документов, я также предлагаю вам взглянуть на зрелые решения для полнотекстового индексирования / поиска, такие как sphinx или lucene.Я думаю, что любой из них может быть использован с PHP.

0 голосов
/ 03 апреля 2011

Я также думал о расстоянии Хэмминга, как прокомментировал Феликс Клинг.Возможно, вы можете сделать какой-то вариант, когда вы кодируете свои слова в конкретные кодовые слова, а затем проверяете их расстояния через массив, содержащий ваши кодовые слова.

Так что, если у вас есть массив [11, 02, 85, 37, 11], вы можете легко найти, что 11 имеет максимальное расстояние 4 в этом массиве.

Не знаю, сработает ли это для вас, но я думаю, я бы сделал это аналогичным образом.

...