timo-71

Рейтинг
63
Регистрация
19.09.2018

, если подряд идут только с нулями, то склеиваем их  один

Их мы тоже начинаем склеивать вместе. И т.д.

Dram #:
мне два огромных подмассива

317 * 50 = 15850.

В двух, в сумме должно быть столько, если 50, если

Dram #:
Каждый подмассив 3-го уровня длинной 50  (как и у исходного).


Dram #:
(весь код)?

Кстати, да. Может опять неверно понял задание😆  Обратите внимание на $oldArray - исходный похож на него?
<?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();
Dram #:
что-то не поспеваю...

Тут просто все, если нет 1, то в 

$tmp0

собираем индексы исходного массива. Как только есть 1,  обнуляем $tmp0, предварительно посчитав кол -во собранных индексов. Если их больше одного, значит  подряд => сливаем в результирующий $new_a[0]. Аналогично поступаем там где есть, сливаем в    $new_a[1]

Dram #:
какой индекс - это же переменная, не массив?
$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];
  }
}
Dram #:
array_merge ($tempArr[$i],$newArr[count($newArr)-1])
$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
        )

)
ArbNet #:

timo-71, Вы всё усложняете 😀 пайтон не обязателен и делается всё гораздо проще. 

Подбор ключевых слов я сделал. Теперь мне архитектуру сущностей и поиск по запросу осталось сделать.

Ну, как угодно. И нормализацию делаете?

ArbNet #:
делается всё гораздо проще. 

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

ArbNet #:
Вот я и продумываю методику

Важно задачу поставить. 

ArbNet #:
Движок анализирует текст, определяет тематику*

Методика в т.ч. нужна и для определяет тематику

ArbNet #:
Для определения тематики хочу составлять списки ключевых слов

Как? Вручную? Трудоемко. Автоматизированно? Тут изобретение колеса достаточно сложно. Просто тут не велосипед😂

Но есть инструменты - 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 1701
abacus 0.006704047545684609
abilities 0.0030255603220721273
ability 0.003156168449586299
able 0.0036673470201144674
abnormal 0.004575122435127926
abolished 0.0028052608258295926
abolition 0.004064820137019515
about 0.00014963587508918375
above 0.0007492665180478759
absence 0.004142807322609117
End at 1599078297.5991597 (50.19942808151245 sec)

чуть допиленный скрипт из оф. документации, показывает Tfidf 10 слов из первых 100,000,000 bytes of plain text from Wikipedia.

# -*- coding: utf-8 -*-

from time import time
import gensim.downloader as api
from gensim.models import TfidfModel
from gensim.corpora import Dictionary
from pprint import pprint

t0 = time()
print('Starts at %s' % t0)
pprint(api.info("text8"))
dataset = api.load("text8")
dct = Dictionary(dataset)  # fit dictionary
corpus = [dct.doc2bow(line) for line in dataset]  # convert corpus to BoW format
print('Corpus len %s %s' % (len(corpus), dct.num_docs) )
model = TfidfModel(corpus)  # fit model
vector = model[corpus[0]]  # apply model to the first corpus document
for 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 Word2Vec
from os.path import dirname, join as pj, abspath
import sys

BASE_PATH = dirname(dirname(abspath(__file__)))
sys.path.append(BASE_PATH)
from lemm import lemm

stopwords = []
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),
txt text.txt
ArbNet #:
не составлять список для игнорирования слов

Стоп-слова шум уменьшают.

ArbNet #:
составлять списки относящиеся к той или иной тематике

Неоднократно в этом топике намекал.

На уровне документа один из наиболее полезных способов понимания текста - анализ его тем. Процесс изучения, распознавания и извлечения этих тем из набора документов называется тематическим моделированием.

4 самых популярных сегодня методов: LSA, pLSA, LDA и более новый lda2vec, основанный на глубоком обучении.

Или вот, на пальцах

Предположим, у вас есть следующий набор предложений:

  • Я люблю есть брокколи и бананы.
  • На завтрак я съела смузи из банана и шпината.
  • Шиншиллы и котята милые.
  • Моя сестра вчера удочерила котенка.
  • Посмотрите, как этот симпатичный хомяк жует брокколи.

Что такое скрытое размещение Дирихле? Это способ автоматического обнаружения тем , содержащихся в этих предложениях. Например, учитывая эти предложения и запрашивая 2 темы, LDA может выдать что-то вроде

  • Предложения 1 и 2 : 100% Тема A
  • Предложения 3 и 4 : 100% Тема B
  • Предложение 5 : 60% по теме A, 40% по теме B
  • Тема A : 30% брокколи, 15% бананов, 10% завтрак, 10% жевание,… (в этот момент вы можете интерпретировать тему A как о еде)
  • Тема B : 20% шиншилл, 20% котят, 20% милых, 15% хомяков,… (в этот момент вы можете интерпретировать тему B как о милых животных)

Вопрос, конечно, в том, как LDA делает это открытие?

Хотя, не ясно зачем городить это для поиска. Фуллтекст поиск есть во всех БД, и сейчас он ищет вполне себе неплохо. Эластик не невозможно поставить. 

Если же это использовать для сео модуля, то надо понимать, что все это инструменты, а нужна в первую очередь методика.

ArbNet #:
Затем удаляются слова меньше 4 букв

"Тойота Рав 4" останется, только  Тойота. Список стоп-слов придуман для этого. Нормализацию делали?  Тойота,  Тойоты,  Тойоту это одно и тоже, учитывать следует вместе.

Кстати, вот это , разложить хтмл документ на предложения - имеет важное значение, для построения лси модели. 
Всего: 541