, если подряд идут только с нулями, то склеиваем их один
Их мы тоже начинаем склеивать вместе. И т.д.
Dram #:мне два огромных подмассива
317 * 50 = 15850.
В двух, в сумме должно быть столько, если 50, если
Dram #:Каждый подмассив 3-го уровня длинной 50 (как и у исходного).
Dram #:(весь код)?
<?php $oldArray = [ [0,0,0], [0,0,0], [0,1,0], [0,0,0], [0,0,0], [0,0,0], [0,1,0], [0,1,0], [0,0,0], [1,1,1], ]; $new_a = [ 0=>[], 1=>[] ]; $l = count($oldArray); $tmp0 = []; $tmp1 = []; function _a(array &$a, array &$b, array $c){ foreach($c as $v){ $a = array_merge($a, $b[$v]); } } for($i=0;$i<$l;$i++){ if(!in_array(1, $oldArray[$i])) { if(count($tmp1)>1) { _a($new_a[1], $oldArray, $tmp1); } array_push($tmp0, $i); $tmp1 = []; } else { if(count($tmp0)>1) { _a($new_a[0], $oldArray, $tmp0); } array_push($tmp1, $i); $tmp0 = []; } } var_dump($new_a); exit();
Тут просто все, если нет 1, то в
$tmp0
собираем индексы исходного массива. Как только есть 1, обнуляем $tmp0, предварительно посчитав кол -во собранных индексов. Если их больше одного, значит подряд => сливаем в результирующий $new_a[0]. Аналогично поступаем там где есть, сливаем в $new_a[1]
$tmp = 0;
У меня такого нет. А, не с начала вставил😞
$l = count($oldArray);$tmp = [false];for($i=0;$i<$l;$i++){....
$tmp = [1, $i];
Если есть 1 то первый элемент 1, если нет, то 0. Расти ничего не должно, т.к.
$new_a[0][$i] = $tempArr[$i];
просто добавляется элемент исходного массива.
Но, все равно задачу не верно понял. Между делом, одним глазом. И 2 косяка с пониманием задачи. Надо в санаторий😅
$tmp0 = []; $tmp1 = [];function _a(array &$a, array &$b, array $c){ foreach($c as $v){ $a = array_merge($a, $b[$v]); }}for($i=0;$i<$l;$i++){ if(!in_array(1, $oldArray[$i])) { if(count($tmp1)>1) { _a($new_a[1], $oldArray, $tmp1); } array_push($tmp0, $i); #соберем индексы массива, если там нет единиц $tmp1 = []; } else { if(count($tmp0)>1) { #если индексов больше одного, что значит подряд, сольем в $new_a[0] _a($new_a[0], $oldArray, $tmp0); } array_push($tmp1, $i); $tmp0 = []; #обнулим массив индексов }}var_dump($new_a);
А ну да, ну да. Был невнимателен. Прошу понять и простить
for($i=0;$i<$l;$i++){ if(!in_array(1, $oldArray[$i])) { if($tmp[0]===0) { #значит предыдущий - только нули $new_a[0][$tmp[1]] = $oldArray[$tmp[1]]; #чтобы учесть предыдущий, если он учтен, то будет просто переписан $new_a[0][$i] = $oldArray[$i]; } $tmp = [0, $i]; #первый элемент 0 если только нули, второй ссылка на индекс элемента #если нужен #$new_a[3][$i] = $oldArray[$i]; } else { if($tmp[0]===1) { $new_a[1][$tmp[1]] = $oldArray[$tmp[1]]; $new_a[1][$i] = $oldArray[$i]; } $tmp = [1, $i]; }}
$oldArray = [ 0=>[0,0,0], 1=>[0,1,0], 2=>[0,0,0], 3=>[0,1,0],];$new_a = [ 0=>[], 1=>[],];foreach($oldArray as $k=>$v){ if(!in_array(1, $v)) $new_a[0] = array_merge ($new_a[0], $v); else $new_a[1] = array_merge ($new_a[1], $v); }
Array( [0] => Array ( [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 [5] => 0 ) [1] => Array ( [0] => 0 [1] => 1 [2] => 0 [3] => 0 [4] => 1 [5] => 0 ))
timo-71, Вы всё усложняете 😀 пайтон не обязателен и делается всё гораздо проще.
Подбор ключевых слов я сделал. Теперь мне архитектуру сущностей и поиск по запросу осталось сделать.
Ну, как угодно. И нормализацию делаете?
Куда уж проще то. Несколько, ну хорошо десятков, строк кода для получения моделей по признанным в мире алгоритмам распознавания и извлечения тематик из набора документов.
Важно задачу поставить.
Методика в т.ч. нужна и для определяет тематику.
Как? Вручную? Трудоемко. Автоматизированно? Тут изобретение колеса достаточно сложно. Просто тут не велосипед😂
Но есть инструменты - gensim пиарю в этой теме давно. Только, на питон надо пересесть🤔
Starts at 1599078247.3997316{'checksum': '68799af40b6bda07dfa47a32612e5364', 'description': 'First 100,000,000 bytes of plain text from Wikipedia. Used ' 'for testing purposes; see wiki-english-* for proper full ' 'Wikipedia datasets.', 'file_name': 'text8.gz', 'file_size': 33182058, 'license': 'not found', 'num_records': 1701, 'parts': 1, 'read_more': ['http://mattmahoney.net/dc/textdata.html'], 'reader_code': 'https://github.com/RaRe-Technologies/gensim-data/releases/download/text8/__init__.py', 'record_format': 'list of str (tokens)'}Corpus len 1701 1701abacus 0.006704047545684609abilities 0.0030255603220721273ability 0.003156168449586299able 0.0036673470201144674abnormal 0.004575122435127926abolished 0.0028052608258295926abolition 0.004064820137019515about 0.00014963587508918375above 0.0007492665180478759absence 0.004142807322609117End at 1599078297.5991597 (50.19942808151245 sec)
чуть допиленный скрипт из оф. документации, показывает Tfidf 10 слов из первых 100,000,000 bytes of plain text from Wikipedia.
# -*- coding: utf-8 -*-from time import timeimport gensim.downloader as apifrom gensim.models import TfidfModelfrom gensim.corpora import Dictionaryfrom pprint import pprintt0 = time()print('Starts at %s' % t0)pprint(api.info("text8"))dataset = api.load("text8")dct = Dictionary(dataset) # fit dictionarycorpus = [dct.doc2bow(line) for line in dataset] # convert corpus to BoW formatprint('Corpus len %s %s' % (len(corpus), dct.num_docs) )model = TfidfModel(corpus) # fit modelvector = model[corpus[0]] # apply model to the first corpus documentfor doc in vector[:10]: id = doc[0] print(dct[id], doc[1])t = time()print('End at %s (%s sec)' % (t, (t-t0)) )
Или посложней - файлик прикреплен из него, используя
# -*- coding: utf-8 -*-from gensim.models.word2vec import Word2Vecfrom os.path import dirname, join as pj, abspathimport sysBASE_PATH = dirname(dirname(abspath(__file__)))sys.path.append(BASE_PATH)from lemm import lemmstopwords = []with open(pj(BASE_PATH, 'data', 'stopwords')) as f: for tok in f: tok = tok.strip() if tok not in stopwords: stopwords.append( tok.strip() )_lemm = lemm(stopwords)with open(pj(BASE_PATH, 'data', 'text')) as f: data = f.read()data = data.split("\n")data = [ _lemm.normal_form(d) for d in data if d.strip() ]print(data)model = Word2Vec(data, min_count = 0, workers=2)vector = model.wv['яндекс']result = model.wv.similar_by_word('яндекс')print("\n similar_by_word яндекс", result)result = model.wv.similar_by_word('система')print("\n similar_by_word система", result)exit()
получаем список схожих с яндекс и система слов
similar_by_word яндекс [('google', 0.9942089319229126), ('компания', 0.9934411644935608), ('сайт', 0.9913094639778137), ('поиск', 0.9903950691223145), ('англ', 0.989749550819397), ('запрос', 0.9888874888420105), ('выдача', 0.9886837005615234), ('поисковый', 0.9885455369949341), ('the', 0.9878780841827393), ('информация', 0.9869726896286011)] similar_by_word система [('яндекс', 0.984493613243103), ('поиск', 0.9841199517250061), ('google', 0.9831591248512268), ('компания', 0.9825421571731567), ('сайт', 0.9824696779251099), ('запрос', 0.9824256896972656), ('поисковый', 0.9822441935539246), ('выдача', 0.9817354679107666), ('страница', 0.981270432472229),
Стоп-слова шум уменьшают.
Неоднократно в этом топике намекал.
На уровне документа один из наиболее полезных способов понимания текста - анализ его тем. Процесс изучения, распознавания и извлечения этих тем из набора документов называется тематическим моделированием.
4 самых популярных сегодня методов: LSA, pLSA, LDA и более новый lda2vec, основанный на глубоком обучении.
Предположим, у вас есть следующий набор предложений:
Что такое скрытое размещение Дирихле? Это способ автоматического обнаружения тем , содержащихся в этих предложениях. Например, учитывая эти предложения и запрашивая 2 темы, LDA может выдать что-то вроде
Вопрос, конечно, в том, как LDA делает это открытие?
Хотя, не ясно зачем городить это для поиска. Фуллтекст поиск есть во всех БД, и сейчас он ищет вполне себе неплохо. Эластик не невозможно поставить.
Если же это использовать для сео модуля, то надо понимать, что все это инструменты, а нужна в первую очередь методика.
"Тойота Рав 4" останется, только Тойота. Список стоп-слов придуман для этого. Нормализацию делали? Тойота, Тойоты, Тойоту это одно и тоже, учитывать следует вместе.