логика. Математические ожидание или что-то другое, из области статистики

zaartix

Новичок
логика. Математические ожидание или что-то другое, из области статистики

вот 2 примера массива:
[0] => 1 [1] => 2 [2] => 73 [3] => 78 [4] => 122 [5] => 138 [6] => 168 [7] => 184 [8] => 280 [9] => 302 [10] => 319 [11] => 343

[0] => 1 [1] => 2 [2] => 57 [3] => 78 [4] => 93 [5] => 120 [6] => 122 [7] => 138 [8] => 160 [9] => 302 [10] => 319 [11] => 343 [12] => 415

массивы резиновые, ключи не нужны, все касается значений

задача:
выявить группы элементов, близких друг к другу.

кто помнит статистику? вроде там что-то было подобное

-~{}~ 11.01.07 11:48:

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

Dovg

Продвинутый новичок
Кластерный анализ
там разные методики и разные формулы
 

denver

?>Скриптер
1, 10, 19, 28, 37, 46, 55 -- отличаются на 9 от соседей, значит они в одной группе? А если после "55" будет "40" то это уже новая группа?

Раскажи лучше что будет решать твоя задача, так легче будет статистические методы подобрать.
 

zaartix

Новичок
хорошо, задача из области SEO (поисковой оптимизации)

берем фразу:
"я в статистике как свинья в апельсинах"
разбиваем ее на слова (выкидываем короткие)
получаем все словоформы каждого слова

берем любую страницу сайта, выдираем все теги, запихиваем все слова в массив

пробегаемся по первому массиву (все словоформы всех слов в фразе) и делаем поиск по второму массиву. Забираем найденные ключи и получаем массив, примеры которых в первом посте
При нормальных условиях любые близкие значения полученного массива - это неповторяющиеся слова из требуемой фразы. Т.е. нечто вроде контекстности. Чем больше будет групп и чем более ёмкие группы будут - тем эффективнее подобранная им фраза

В конечном счете я юзеру должен дать ответ стоит-ли употреблять такие ключевые слова (ссылка в виде той фразы) к выбранной им странице.
 

zaartix

Новичок
Dovg

спасибо, очень похоже как раз, что это будет кластерный анализ, жаль только вот, что по ссылке на основе софта описывается
 

avenger_msoft

Новичок
А если попробовать так.

Есть нормализованный текст, нормализованные ключевые поисковые слова.
Разбираем нормализованные слова в массив. Ищем позиции вхождения слов массива в нормализованном тексте. Получаем два массива.

Например:
Массив ключевых слов:
PHP:
Array
(
    [U215] => Array
        (
            [0] => учебном
            [1] => учебн
        )

    [F650] => Array
        (
            [0] => формы
        )

    [R130] => Array
        (
            [0] => работа
        )

)
Массив позиции вхождений ключевых слов:
PHP:
Array
(
    [F650] => Array
        (
            [форма] => Array
                (
                    [0] => 9
                )

            [формы] => Array
                (
                    [0] => 330
                )

            [форме] => Array
                (
                    [0] => 739
                )

        )

    [U215] => Array
        (
            [учебной] => Array
                (
                    [0] => 81
                    [1] => 569
                )

            [учебном] => Array
                (
                    [0] => 355
                )

            [учебного] => Array
                (
                    [0] => 704
                )

        )

    [R130] => Array
        (
            [работа] => Array
                (
                    [0] => 127
                )

            [работы] => Array
                (
                    [0] => 577
                )

        )

)
Нормализуем 2-й массив для дальнейшего анализа, получаем:
PHP:
Array
(
    [0] => Array
        (
            [0] => 9
            [1] => 330
            [2] => 739
        )

    [1] => Array
        (
            [0] => 81
            [1] => 569
            [2] => 355
            [3] => 704
        )

    [2] => Array
        (
            [0] => 127
            [1] => 577
        )

)
Теперь сам анализ:
Задача сводится к нахождению длин отрезков по следующему правилу:
max(Массив значение) - min(Массив значений)
где Массив значений - это всевозможные комбинации значений по первому уровню НОРМАЛИЗОВАННОГО 2-го МАССИВА.

Для данной задачи:
PHP:
9-81-127-> MIN=9 MAX=127 DIFF=118
9-81-577-> MIN=9 MAX=577 DIFF=568
9-569-127-> MIN=9 MAX=569 DIFF=560
9-569-577-> MIN=9 MAX=577 DIFF=568
9-355-127-> MIN=9 MAX=355 DIFF=346
9-355-577-> MIN=9 MAX=577 DIFF=568
9-704-127-> MIN=9 MAX=704 DIFF=695
9-704-577-> MIN=9 MAX=704 DIFF=695
330-81-127-> MIN=81 MAX=330 DIFF=249
330-81-577-> MIN=81 MAX=577 DIFF=496
330-569-127-> MIN=127 MAX=569 DIFF=442
330-569-577-> MIN=330 MAX=577 DIFF=247
330-355-127-> MIN=127 MAX=355 DIFF=228
330-355-577-> MIN=330 MAX=577 DIFF=247
330-704-127-> MIN=127 MAX=704 DIFF=577
330-704-577-> MIN=330 MAX=704 DIFF=374
739-81-127-> MIN=81 MAX=739 DIFF=658
739-81-577-> MIN=81 MAX=739 DIFF=658
739-569-127-> MIN=127 MAX=739 DIFF=612
739-569-577-> MIN=569 MAX=739 DIFF=170
739-355-127-> MIN=127 MAX=739 DIFF=612
739-355-577-> MIN=355 MAX=739 DIFF=384
739-704-127-> MIN=127 MAX=739 DIFF=612
739-704-577-> MIN=577 MAX=739 DIFF=162
Чем меньше DIFF, тем ближе к друг другу располагаются слова =>"эффективнее подобранная им фраза".
Здесь же можно рассчитать расстояние на котором ПОИСКОВЫЕ слова отстоят друг от друга.
 

zaartix

Новичок
А что вы называете нормализованным словом? исходную форму слова?
 

avenger_msoft

Новичок
Нормализованное слово - например,
preg_replace( "/[^A-ZА-Я\s.,?!\-]+/i", "", $str );
preg_replace( "/\s+/", " ", $str );
strtolower()

Нормализованный текст - например:
preg_replace( "/[^A-ZА-Я\s.,?!\-]+/i", "", $str );
preg_replace( "/\s+/", " ", $str );
strtolower()
strip_tags()

-~{}~ 11.01.07 14:41:

Т.е. чистый текст
 

zaartix

Новичок
имхо достаточно:
PHP:
preg_match_all('/([a-zA-Zа-яА-Я]+)/',$str,$ok); // слова, которые пишутся через дефис только ломаются, но они не так часто встречаются
иначе если на сайте есть нечто вроде "слово,!" оно будет в статусе "нормализовано"



подход вроде тоже рабочий, спасибо, обдумаем эффективность.
 

avenger_msoft

Новичок
Далее, то все равно придется с нормализованным текстом делать что-то такое
preg_split('/(\s|\.|,|\?|\!|-)+/', $text, -1, PREG_SPLIT_OFFSET_CAPTURE | PREG_SPLIT_NO_EMPTY);
Отсюда "слово,!" будет "слово"

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

zaartix

Новичок
в среднем ключевики 2-3 слова, берем по-максимуму - 3.
В среднем у слова 9 словоформ.
На типичной странице 500-700 слов, отметаем короче 4-х символов, остается где-нить 400.

итого у нас:
3*9=27

пройтись 27 раз по массиву из 400 элементов ...

впринципе терпимно для разовых операций.

-~{}~ 11.01.07 17:10:

интересно, получатся теперь надо выстроить законы, которые будут определять по diff'ам эффективность.

Ну что, есть те, кто хорошо разбирается в SEO? какие должны быть идеальные расстояния? и где пороги спама?

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

-~{}~ 11.01.07 17:14:

Автор оригинала: avenger_msoft
Нормализованный текст - например:
preg_replace( "/[^A-ZА-Я\s.,?!\-]+/i", "", $str );
preg_replace( "/\s+/", " ", $str );
strtolower()
strip_tags()
Т.е. чистый текст
strip_tags не отработает, рег порежет "<", ">"

и кстати говоря strip_tags кривовато работает, многие слова "склеивает", в общем у меня нормализация нормальная только вот таким методом получилась:
PHP:
$f=html_entity_decode(preg_replace("/<(.*?)>/",' ',$f));
$f=preg_replace( "/[^A-ZА-Я\s]+/i", " ",$f);
$f=preg_replace( "/\s+/", " ", $f );
$f=strtolower($f);
$words = explode(' ',$f);
foreach ($words as $word) {
	if (strlen($word)>4) {
		$all_words[] = $word;
	}
}
 
Сверху