timo-71

Рейтинг
63
Регистрация
19.09.2018
ArbNet #:
У вас я вижу просто поиск повторений слов

Не совсем.  Лень, ковырять скрипт, чтобы просто частотность биграмм показать. Но, почти всегда там другой порядок. Здесь же

('продвижение_сайт', 2687.3856000000164)

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

timo-71 #:
Ну и дальше к gensim lsi/lda и т.п.

Из темы про lsi ссылку на которую я неоднократно приводил. Попросили запрос "наполеон".  

<class 'gensim.models.lsimodel.LsiModel'>

0.715*"наполеон" + 0.426*"год" + 0.146*"армия" + 0.143*"франция" + 0.139*"французский" + 0.110*"бонапарт" + 0.086*"становиться" + 0.083*"войско" + 0.080*"военный" + 0.078*"император"
-0.525*"торт" + -0.286*"мука" + -0.269*"рецепт" + -0.239*"сахар" + -0.228*"наполеон" + -0.223*"масло" + -0.213*"молоко" + -0.211*"сливочный" + 0.193*"год" + -0.184*"крем"
0.360*"год" + -0.327*"бонапарт" + -0.299*"франция" + -0.219*"император" + -0.147*"французский" + 0.118*"тыс" + 0.115*"май" + -0.110*"фильм" + -0.106*"становиться" + -0.104*"генерал"
0.296*"наполеон" + 0.261*"фильм" + -0.241*"год" + -0.213*"франция" + 0.209*"конкурс" + 0.149*"человек" + 0.144*"клавье" + -0.144*"мука" + -0.121*"сахар" + -0.111*"молоко"
-0.657*"конкурс" + -0.233*"спецпроект" + -0.222*"блюдо" + -0.200*"рецепт" + 0.130*"наполеон" + -0.127*"мультиварка" + -0.126*"год" + 0.125*"мука" + -0.122*"торт" + 0.114*"сахар"
0.520*"бонапарт" + 0.252*"год" + 0.218*"император" + 0.136*"биография" + -0.115*"наполеон" + -0.115*"франция" + 0.113*"становиться" + -0.109*"фильм" + -0.103*"армия" + -0.087*"империя"
Нетрудно заметить, что gensim.models.lsimodel.LsiModel выделил в х-документов из топа Яндекса несколько тематических кластеров, касающихся как собственно Наполеона,  так и торта.
SmileP #:
А какое практическое применение?

Ну, например, чтобы:

ArbNet :
движок автоматически подбирал 

В качестве направления для ТС. В том смысле, что все реально и куда можно посмотреть для этого.

На основе собственных граблей, куда наступил в процессе.

Malinka25 :
this.pfx = `data-${options.prefix || 'ty'}`;         this.startDelay = options.startDelay             || parseFloat(this.container.getAttribute(`${this.pfx}-startDelay`)) || 600;         this.typeDelay = options.typeDelay             || parseFloat(this.container.getAttribute(`${this.pfx}-typeDelay`)) || 90;
this.pfx = `data-${options.prefix || 'ty'}`;
this.typeDelay = options.typeDelay
            || parseFloat(this.container.getAttribute(`${this.pfx}-typeDelay`)) || 90;
/*
оно надо найти где то в атрибутах data-ty-typeDelay, предварительно заценив console.log(this.pfx), может и не ty совсем


*/

А есть оно? 

data-ty-prompt

есть. Но ничего,  похожего на  typeDelay не видно.

Возможно, что то типа 

<span data-ty="progress" data-ty-typeDelay="146"></span>
богоносец #:
В нём вы имеете дело с избыточным 'шумом', относящимся совсем не к ранжированию...

Шума везде вагоны,  вагоны, еще  вагоны. И потом тележки... Вопрос в том, как отранжировать - ('месяц_рубль', 0.09)  вполне может стать самым частотным на корпусе документов из топа.


Как то так в монге 

1192 из Я-хмл (100, lr=225), кей на картинке.

('продвижение_сайт', 1401.7535999999996)
('раскрутка_сайт', 290.3039999999999)
('seo_продвижение', 216.576)
('поисковый_сайт', 124.5312)
('раскрутить_сайт', 92.0448)
('поисковый_система', 84.8256)
('сайт_яндекс', 75.8016)
('продвижение_раскрутка', 66.35519999999998)
('поисковый_продвижение', 59.5584)
('оптимизация_продвижение', 59.5584)
('seo_сайт', 54.144)
('оптимизация_поисковый', 45.94719999999998)
('сайт_топ', 43.3152)
('интернет_сайт', 43.3152)
('сайт_самостоятельно', 37.9008)
('продвижение_создание', 37.9008)
('оптимизация_сайт', 37.9008)
('google_яндекс', 35.34399999999999)
('продвижение_самостоятельный', 32.486399999999996)
('интернет_продвижение', 32.486399999999996)
('продвижение_услуга', 32.486399999999996)
.....Последние в футере
('733_объявление', 0.09)
('обеспечивать_рубль', 0.09)
('рубль_тысяча', 0.09)
('месяц_рубль', 0.09)

13496 биграмм из контента 12 документов (урлы на картинке, регион=225)

('продвижение_сайт', 2687.3856000000164)
('оптимизация_сайт', 449.3952)
('поисковый_система', 441.80000000000047)
('раскрутка_сайт', 364.9535999999999)
('seo_продвижение', 303.2064)
('аудит_сайт', 232.8192)
('seo_сайт', 200.3328)
('контекстный_реклама', 197.92640000000014)
('позиция_сайт', 178.6752)
('поисковый_сайт', 162.432)
('интернет_продвижение', 151.6032)
('сайт_трафик', 151.6032)
('комплексный_продвижение', 146.1888)
('сеть_социальный', 130.77280000000005)
('контент_сайт', 129.94559999999998)
('сайт_самостоятельно', 124.5312)
('google_яндекс', 116.63520000000004)
('интернет_магазин', 116.63520000000004)
('добавить_сайт', 102.8736)
('интернет_маркетинг', 98.96320000000001)
....где то посередине
('google_поведенческий', 1.88)
('оптимизация_ядро', 1.88)
('бюджет_ссылочный', 1.88)
('бюджет_вирусный', 1.88)
('позиция_проверка', 1.88)
('создание_ядро', 1.88)
('создание_структура', 1.88)
('запрос_низкочастотный', 1.88)
....Футер
('зарплата_рубль', 0.09)
('копейка_рубль', 0.09)
('00_рубль', 0.09)
('очередной_рубль', 0.09)

Это только промежуточный вариант. Но, как минимум, биграммы "аудит_сайт" для запроса продвижение сайта в сниппетах нет. Я проверил. Ну и дальше к gensim lsi/lda и т.п.

А потом, важно, чтобы быстро.

Скорость и еще раз скорость, должно стать девизом каждого разработчика

Ну и технические нюансы для  ArbNet, где я много времени потерял.

1) Леммы: "поисковый_продвижение" должно включать  "поисковое продвижение, продвижения в поисковой". Минус стоп слова, приведение в нормальную форму и сортировка.  Грабли: php +  внешняя программа (mystem, python pymorphy2, сервисы) нестабильно и долго.

2) Операции со строками/массивами(объектами): н-граммы, сортировка и т.д. 

3) Время. Желательно, чтобы для получения, например, 12 урлов из интернета, каждый из которых отдается в среднем за 1-1,5 сек  (в сумме 12 сек как минимум), потратить минимум сек. В данном случае 5.5:

/var/pyweb/env/bin/python /var/pyweb/env/pya/scripts/htmlparser.py --id a6f33ec747175f3ec5f036e366871190
{'coll': 'Ups to htmldocs', 'cnt': 12, 'up_cnt': 12, 'ins_cnt': 0, 'matched': 10, 'errors': []}
{'coll': 'Ups to seokey', 'cnt': 1, 'up_cnt': 1, 'ins_cnt': 0, 'matched': 1, 'errors': []}

----5.53990912437439-sec--

Парсинг 12 документов + запись в базу заняла 5,5 сек. Параллельно сделать aiohttp помогла. На php тоже можно, но ...

SeVlad #:
наименования единиц измерений пишутся без точек

Согласен. И 20 мм меньше 1 тонны🙄  Странно все это. 

Буквоед😊

Гипер утрированный намек на точки внутри предложения. Только и всего 

silicoid #:
Ловите
#смотрим на последующие символы, в зависимости от (. А) или (. а)

"Масса может быть в кг. -  20 мм. меньше 1 т. и больше  22 км. в час! Нет проверки уппер_кейс после т.н. пробела"

Drinktea #:
а как же знаки в конце предложения?

покрутить назад, до первого символа !разделитель_пассажа, перед отгрузкой в массив, что то типа:

$s='';
while(true){
    $j--;
    if(in_array($a[$j], $passage_separator)){
      $s.=$a[$j];
    } else break;
}
$res[] = $str . $s;

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

SeVlad #:

А если есть, то 4 раза (с каждым возможным разделителем ;))

Ида. Надо искать не точку, а точку с пробелом.

Но ещё вспомнилась засада - если в тексте есть сокращения, то всё намного хуже.

Так уж и 4 раза? 15 мин на коленке:

<?php
$a = 'А если есть, то 4 раза!!! С каждым возможным разделителем; Ида... Т..н. (так называемые) нюансы. Надо искать не точку, а точку с пробелом! Но ещё вспомнилась засада! Если в тексте есть т.н. сокращения, то всё намного хуже.
вопроса с восклицанием?! Правила русского языка допускают также три восклицательных знака!!!
а вот... Тут или регэексп находит всего два предложения или ...  одно из двух';
echo "\nOriginal: ", $a, "\n";
$a =  preg_split("//u", $a, -1, PREG_SPLIT_NO_EMPTY);
$l = count($a);
$passage_separator = ['.', '!', '?'];
$res = [];
$str = '';

for($i=0;$i<$l;$i++){
  if(in_array($a[$i], $passage_separator)) {
    $j = $i+1;
    while($j<$l){
      #смотрим на последующие символы, в зависимости от (. А) или (. а)
      if(!in_array($a[$j], $passage_separator)){
        #для упрощения, считаем, что разделитель всегда пробел.
        if(
          $a[$j]==' '
          &&  preg_match('~\p{Lu}~u', $a[$j+1])
        ) {
          #как только пробел и следующий символ уппер_кейс, собранную строку в массив и обнуляем
          if($str) $res[] = $str;
          $str = '';
        } else {
          $str.=$a[$j-1];
        }        
        break;
      }
      $j++;      
    }
  }
  else {
    $str.=$a[$i];
  }
}
if ($str) $res[] = $str; #если что то осталось
print_r($res);
#trim? Обработку, чтобы не попадали пустые строки, оставляю другим
?>

Результат:

php -f /var/web/php_temp/tt.php

Original: А если есть, то 4 раза!!! С каждым возможным разделителем; Ида... Т..н. (так называемые) нюансы. Надо искать не точку, а точку с пробелом! Но ещё вспомнилась засада! Если в тексте есть т.н. сокращения, то всё намного хуже.
вопроса с восклицанием?! Правила русского языка допускают также три восклицательных знака!!!
а вот... Тут или регэексп находит всего два предложения или ...  одно из двух
Array
(
    [0] => А если есть, то 4 раза
    [1] =>  С каждым возможным разделителем; Ида
    [2] =>  Т..н. (так называемые) нюансы
    [3] =>  Надо искать не точку, а точку с пробелом
    [4] =>  Но ещё вспомнилась засада
    [5] =>  Если в тексте есть т.н. сокращения, то всё намного хуже.
вопроса с восклицанием
    [6] =>  Правила русского языка допускают также три восклицательных знака!!!
а вот
    [7] =>  Тут или регэексп находит всего два предложения или ...  одно из двух
)
Anamnado #:
но нужно отобразить не более 30 позиций от каждой..

Кому нужно?

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

Ну вот например, конструкция начинающаяся с:

async def beside_geo(coord, limit=10):

    filter = {
        'COSLAT' : math.cos(coord[0] * math.pi / 180),
        'SINLAT' : math.sin(coord[0] * math.pi / 180),
        'COSLNG' : math.cos(coord[1] * math.pi / 180),
        'SINLNG' : math.sin(coord[1] * math.pi / 180),
    }
    .....

позволяет выбрать limit предложений расположенных ближе всего к coord пользователя. 

В общем, зависит...

Anamnado #:
легко  решаемо

Легко было на бумаге, да забыли про овраги..

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

Всего: 541