Python NLP spacy

Am facut cu ajutorul openai un script care calculeaza folosind NLP si importand spacy si en_core_web_lg un calcul de similitudine dintre o lista si cu un fisier importand bucati de 8 tokens si listele mele de cuvinte, 10 la numar. Deci ia lista1 si o compara cu 700 de tokenuri, afisand probabilitatea maxima de potrivire. ok, merge. problema e ca timpul de prelucrare este de 50 sec la cele 10 liste si 42 sec la 5 liste…deci mult. Cum pot sau ce imi recomandati sa fac pentru a paraleliza acest job? orice sugestie este binevenita (ubuntu server) 16GB 16 threads

Cred ca daca rulezi pe GPU s-ar putea sa ai performante mai bune.

1 Like

am reusit ceva facand cu succes asta. dar tot e mult pentru ca eu as vrea sa ruleze in 4-5 sec.

create a global results list to store the results

global_results = [[] for _ in range(9)]

create 8 threads that run the process_text function with the given text parts

threads = []
for i in range(8):
t = threading.Thread(target=process_text, args=(text_parts[i],), name=f"Thread {i+1}")
threads.append(t)

Sunt noob în domeniu, da văzusem pe undeva un comentariu că Gensim ar fi optimizat / mai rapid pentru eforturi mai considerabile.

2 Likes

Importați bibliotecile necesare

import gensim
from gensim import corpora
from pprint import pprint

Definirea unui set de documente

documents = [“A dog is a pet animal.”,
“My cat’s name is Charlie.”,
“The bird is flying in the sky.”,
“My dog loves to play fetch.”,
“The cat is sleeping on the couch.”]

Preprocesarea textului

stop_words = set(‘for a of the and to in’.split())
texts = [[word for word in document.lower().split() if word not in stop_words]
for document in documents]

Crearea dicționarului

dictionary = corpora.Dictionary(texts)

Transformarea textelor în format bag-of-words (BOW)

corpus = [dictionary.doc2bow(text) for text in texts]

Antrenarea modelului LDA pe baza corpus-ului

lda_model = gensim.models.ldamodel.LdaModel(corpus=corpus,
id2word=dictionary,
num_topics=2,
passes=10,
alpha=‘auto’)

Vizualizarea topicelor generate

pprint(lda_model.print_topics())

[(0,
'0.137*“is” + 0.083*“bird” + 0.083*“flying” + 0.083*“sky.” + 0.082*“cat” + ’
'0.082*“on” + 0.082*“sleeping” + 0.082*“couch.” + 0.029*“dog” + ’
‘0.028*“animal.”’),
(1,
'0.110*“is” + 0.108*“my” + 0.108*“dog” + 0.065*“charlie.” + 0.065*“cat's” + ’
‘0.065*“name” + 0.065*“play” + 0.065*“loves” + 0.065*“fetch.” + 0.065*“pet”’)]

interesant, o sa arunc un ochi zilele astea. si eu sunt la fel de noob dar cred ca am mai mult timp ca tine de pierdut probabil :slight_smile:

oricum problema de paralelizare ramane in picioare, am analizat si azi situatia si pare evident ca trebuie sa intru brutal in importul textului si pre-procesarea lui inainte sa creez seriile

da, interesanta sugestia. o sa vad ce pot face in sensul asta si cat ar costa chiriile la un GPU dedicat (la o prima vedere scapi cu un cloud ok la 100eur pe luna

GPU Cloud - VMs for Deep Learning | Lambda (lambdalabs.com)

1 Like

O sa vrei sa faci aproximate nearest neighbor searching, care foloseste niste algoritmi fancy ca sa aproximeze rezultatele mult mai rapid. Annoy, FAISS sunt cateva librarii open source pentru asa ceva.

3 Likes

foarte interesant mai ales primul, dar eu nu o sa ajung curand la nivelul sa folosesc asa ceva. ieri reusisem ceva cu

create 8 threads that run the process_text function with the given text parts

threads = []
for i in range(8):
t = threading.Thread(target=process_text, args=(text_parts[i],), name=f"Thread {i+1}")
threads.append(t)

start the threads

for t in threads:
t.start()

wait for the threads to finish

for t in threads:
t.join()
dar azi am rezolvat situatia facand alt script si reusid operatiunea sub 2sec, cum era normal…o sa incerc si cu gemsim ceva sa vad diferentele

de ce nu folosesti ray? What is Ray Core? — Ray 2.3.1

2 Likes

Dacă am înțeles corect probprma, atunci vectorii sunt soluția.
Transformi tot textul în vectori, apoi, când ai un input text pe care vrei să il compari, il transformi și pe el in vector si găsești textul cu vectorul cel mai apropiat. Devine practic o operațiune matematică.

Chiar si așa, tot sunt necesare multe resurse, dar nu ca plain text.

1 Like

foarte corect…asta adica:
def create_custom_doc(words):
# Creeaza un obiect Doc custom cu proprietati necesare
custom_doc = Doc(nlp.vocab, words=words)
custom_doc.user_token_hooks[“is_stop”] = lambda token: False
custom_doc.user_span_hooks[“stop”] = lambda span: False
custom_doc.user_token_hooks[“lemma”] = lambda token: token.lower()
return custom_doc

programe similare folosind Spacy si Gensim au rulat satisfacator si destul de apropiat ca rezultate la o analiza sumara facuta azi. diferenta este data de faptul ca memoria folosita si timpul de executie sunt net in fav Gensim(in special pentru ca nu incarca en_core_web_lg care are 550Mb).
inca nu sunt sigur de acuratete si metoda, voi mai umbla la ele.

1 Like

Din ce povesteti acolo nu ai nevoie de niciun GPU ori computare pe thread-uri si nici ceva complicat.
Daca ai posta toata bucata de cod ar fi mult mai usor sa te ajut, asa pe bucati pot doar ghici ce rulezi acolo.

Partea misto in python este ca poti scrie cod foarte usor si citibil si reproductibil. Partea naspa este ca de multe ori asta te impinge sa scrii cod ne-optimizat deloc si atunci computatiile cresc exponential.

Am patit de multe ori asta, si am facut debugging prin tot codul, iar de la o functie ce dura 50s pentru o singura entitate, la ~0.25s. Facea destul de multe functia, cauta niste vectori similari intr-un spatiu de 1Mil de obiecte, apoi computa distantele intre ele, apoi cauta aceleasi id-uri in alte 3 spatii unde si acolo calcula distante si similitudini iar apoi erau normalizate si sortate.

Si asta fara nicio paralelizare facuta de mine. sklearn si spacy sunt optimizate sa foloseasca toata putea dintr-un CPU, si spacy si si multe alte librarii. Trebuie doar sa le invoci asa cum scrie in documentatie :smiley:.

3 Likes

multumesc mult de intentie, am rezolvat problema deja prin customDoc:
def create_custom_doc(words):
# Creeaza un obiect Doc custom cu proprietati necesare
custom_doc = Doc(nlp.vocab, words=words)
custom_doc.user_token_hooks[“is_stop”] = lambda token: False
custom_doc.user_span_hooks[“stop”] = lambda span: False
custom_doc.user_token_hooks[“lemma”] = lambda token: token.lower()
return custom_doc

fara ele itera pentru fiecare serie cu dictionarul de 500 de mega…subiectul ramane inca mai am chestii pe care le caut

1 Like

insa situatia se schimba semnificativ cand rulez gpt_2_simple as gpt2 :

Începe o sesiune TensorFlow

sess = gpt2.start_tf_sess()