Не совсем. Лень, ковырять скрипт, чтобы просто частотность биграмм показать. Но, почти всегда там другой порядок. Здесь же
('продвижение_сайт', 2687.3856000000164)
2687.3856000000164 без сомненья зависит от частоты, но и скорректировано функцией учитывающей частоту и вхождение в слов из ключей по буквариксу, вхождение слов из подсветок, заголовка, сниппета и еще кое какими данными (все с разным весом). Но и это промежуточный вариант.
Из темы про 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*"империя"
Ну, например, чтобы:
В качестве направления для ТС. В том смысле, что все реально и куда можно посмотреть для этого.
На основе собственных граблей, куда наступил в процессе.
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 тоже можно, но ...
Согласен. И 20 мм меньше 1 тонны🙄 Странно все это.
Буквоед😊
Гипер утрированный намек на точки внутри предложения. Только и всего
#смотрим на последующие символы, в зависимости от (. А) или (. а)
"Масса может быть в кг. - 20 мм. меньше 1 т. и больше 22 км. в час! Нет проверки уппер_кейс после т.н. пробела"
покрутить назад, до первого символа !разделитель_пассажа, перед отгрузкой в массив, что то типа:
$s='';while(true){ $j--; if(in_array($a[$j], $passage_separator)){ $s.=$a[$j]; } else break;}$res[] = $str . $s;
Или собирать разделители_пассажей. Но, с оглядкой, что в строке они могут быть не только в конце предложения. Например в сокращениях.
А если есть, то 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.phpOriginal: А если есть, то 4 раза!!! С каждым возможным разделителем; Ида... Т..н. (так называемые) нюансы. Надо искать не точку, а точку с пробелом! Но ещё вспомнилась засада! Если в тексте есть т.н. сокращения, то всё намного хуже.вопроса с восклицанием?! Правила русского языка допускают также три восклицательных знака!!!а вот... Тут или регэексп находит всего два предложения или ... одно из двухArray( [0] => А если есть, то 4 раза [1] => С каждым возможным разделителем; Ида [2] => Т..н. (так называемые) нюансы [3] => Надо искать не точку, а точку с пробелом [4] => Но ещё вспомнилась засада [5] => Если в тексте есть т.н. сокращения, то всё намного хуже.вопроса с восклицанием [6] => Правила русского языка допускают также три восклицательных знака!!!а вот [7] => Тут или регэексп находит всего два предложения или ... одно из двух)
Кому нужно?
Поисковая подсказка для уточнения запроса. Дополнительные критерии в зависимости от задачи - впереди то, что есть у того кто заплатил, минимум цены, разные варианты, дата обновления, наличие, есть у компаний расположенных ближе всего к пользователю и т.д.
Ну вот например, конструкция начинающаяся с:
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 пользователя.
В общем, зависит...
Легко было на бумаге, да забыли про овраги..
Дерзайте. Мои комментарии, к тому, что я на разработке похожего на все грабли, какие можно, уже наступал. Предостеречь, скажем так.