Natural Language Processing

Teme laborator

(Deadline: -)

Daca nu sunteti logati exercitiile nu se mai afiseaza.

Teme la alegere

In functie de sugestiile studentilor lista de mai jos se poate expanda.

De asemenea, in functie de intrebarile studentilor enunturile pot fi clarificate sau completate (daca studentii au nelamuriri legate de implementarea algoritmului sau despre cum trebuie sa arate inputul/outputul). Ultima editare: 25.12.2018 ora 11:00.

Prezentarea temei se va face in saptamanile 13 si 14. Aceasta tema nu se puncteaza fara prezentare.

(1p) Expandarea formelor prescurtate

Preluati un text in format raw de pe site-ul www.guttenberg.org sau alt site care contine texte neadnotate. Inlocuiti prescurtarile cu forma expandata.

De exemplu:

the cat's running in the yard -> the cat is running in the yard
the cat's fur is white -> the fur of the cat is white

Folositi pos-taggerul de la Standford pentru a optine partile de vorbire. Cu ajutorul unei structuri de tip dictionar, memorati modul de transformare dintr-o prescurtare in forma expandata.

Textul dat ca input trebuie sa fie de lungime medie (3000-4000 cuvinte) si sa contina mai multe fraze. Se poate porni de la un text in format raw (de exemplu de pe http://www.guttenberg.org). Nu e obligatoriu sa luati tot textul unei carti, ci doar cat va trebuie pentru testare.

Se va scrie o documentatie (in format txt) in care este prezentat algoritmul si clasele si metodele folosite. In documentatie se va explica si cum se ruleaza programul (ce argumente primeste in linia de comanda). Sau, daca este facut cu interfata grafica, cum anume se foloseste interfata.

Nu se vor folosi nume predefinite de fisiere ( de exemplu sa se citeasca textul doar dintr-un fisier numit input.txt). Utilizatorul trebuie sa aiba libertate in a alege fisierul de procesat fara a-l redenumi intr-un anume mod (de exemplu, introducand numele fisierului intr-un textbox in interfata grafica sau transmitand numele fisierului ca argument in linia de comanda).

(2p) Segmentarea in cuvinte

Se va da un text fara spatii. Textul dat ca input trebuie sa fie de lungime medie (3000-4000 cuvinte) si sa contina mai multe fraze. Se poate porni de la un text in format raw (de exemplu de pe http://www.guttenberg.org) din care se elimina spatiile pentru a avea un fisier de testare. Nu e obligatoriu sa luati tot textul unei carti, ci doar cat va trebuie pentru testare.

Un exemplu de propozitie fara spatii ar fi:

Iliketoeatbiscuitsalldaylong.

Se incearca impartirea acestuia pe cuvinte, astfel incat sa iasa o propozitie valida.

Se va folosi modulul words din nltk.corpus

Atentie, cuvintele pot sa apara in forma derivata in cadrul textului, nu neaparat in forma care apare in dictionar (lemma).

Se va calcula un scor in functie de impartirea realizata. Se porneste de la premisa ca pot exista cuvinte in text, care nu exista si in dictionar (substantive proprii, regionalisme sau arhaisme, cuvinte de argou).

Poate exista ambiguitate in urma unei impartiri. De exemplu: Hereyeswereblue s-ar transforma corect in Her eyes were blue.

Dar un rezultat poate fi si:

Here yes we re blue. deoarece toate cuvintele rezultate sunt cuvinte englezesti.

De aceea trebuie, cu ajutorul nltk verificata si corectitudinea frazei.

Fisierul de output va afisa textul impartit pe cuvinte. Se vor introduce in text in mod intentionat fraze care pot da rezultate duble doar din impartirea pe cuvinte (asa cum a fost exemplul anterior).

Se va scrie o documentatie (in format txt) in care este prezentat algoritmul si clasele si metodele folosite. In documentatie se va explica si cum se ruleaza programul (ce argumente primeste in linia de comanda). Sau, daca este facut cu interfata grafica, cum anume se foloseste interfata.

Nu se vor folosi nume predefinite de fisiere ( de exemplu sa se citeasca textul doar dintr-un fisier numit input.txt). Utilizatorul trebuie sa aiba libertate in a alege fisierul de procesat fara a-l redenumi intr-un anume mod (de exemplu, introducand numele fisierului intr-un textbox in interfata grafica sau transmitand numele fisierului ca argument in linia de comanda).

Bibliografie:

  1. https://www.nltk.org/book/ch03.html

(1.5) Similaritatea a doua texte (folosind frecventa cuvintelor)

Pentru testare se vor folosi texte din yelp dataset sau corpusul SICK.

Se elimina semnele de punctuatie si stopwords. Cuvintele se aduc toate in lowercase. Se calculeaza frecventa fiecarui cuvant in text. Pentru doua texte putem considera ca avem doi vectori de dimensiune N unde N e numarul de cuvinte din reuniunea vocabularelor celor doua texte. Fiecare pozitie din vector e corespunzatoare unui cuvant i si contine frecventa lui in text. Pozitia i din ambii vectori se refera la acelasi cuvant i. Se calculeaza distanta in felul urmator: D = arccos((V1*V2)/sqrt((V1*V1)*(V2*V2))) Inmultirea din formula se refera la produsul scalar al celor doi vectori.

Textele sunt cu atat mai similare cu cat distanta e mai mica.

Se va scrie o documentatie (in format txt) in care este prezentat algoritmul si clasele si metodele folosite. In documentatie se va explica si cum se ruleaza programul (ce argumente primeste in linia de comanda). Sau, daca este facut cu interfata grafica, cum anume se foloseste interfata.

Nu se vor folosi nume predefinite de fisiere ( de exemplu sa se citeasca textul doar dintr-un fisier numit input.txt). Utilizatorul trebuie sa aiba libertate in a alege fisierul de procesat fara a-l redenumi intr-un anume mod (de exemplu, introducand numele fisierului intr-un textbox in interfata grafica sau transmitand numele fisierului ca argument in linia de comanda).

(2.5p) Similaritatea a doua texte (folosind distanta Mover dintre cuvinte).

Pentru testare se vor folosi texte din yelp dataset sau corpusul SICK.

Pentru aplicarea algoritmului, cuvintele vor fi memorate ca vectori. Se va folosi un spatiu word2vec. Se elimina intai stopwords. Pentru cuvintele ramase se realizeaza reprezentarea lor in spatiul vectorial. Veti folosi tutorialul de la https://www.tensorflow.org/tutorials/representation/word2vec.

Distanta Mover intre doua texte A si B este definita (conform articolului 1 din bibliografie) ca minimul sumei distantelor pe care trebuie sa le traverseze cuvintele din textul A ca sa ajunga in pozitiile cuvintelor din textul B.

Distanta Mover se va calcula conform capitolului 4 din From Word Embeddings To Document Distances

Programul va avea ca output perechile de texte similare. Studentul va seta distanta limita sub care considera ca perechile de texte sunt similare.

Nu este necesar sa se foloseasca tot corpusul ales. Studentul poate folosi doar un subset de texte.

Se va scrie o documentatie (in format txt) in care este prezentat algoritmul si clasele si metodele folosite. In documentatie se va explica si cum se ruleaza programul (ce argumente primeste in linia de comanda). Sau, daca este facut cu interfata grafica, cum anume se foloseste interfata.

Nu se vor folosi nume predefinite de fisiere ( de exemplu sa se citeasca textul doar dintr-un fisier numit input.txt). Utilizatorul trebuie sa aiba libertate in a alege fisierul de procesat fara a-l redenumi intr-un anume mod (de exemplu, introducand numele fisierului intr-un textbox in interfata grafica sau transmitand numele fisierului ca argument in linia de comanda).

Bibliografie:

  1. From Word Embeddings To Document Distances
  2. https://www.tensorflow.org/tutorials/representation/word2vec

(1p) Gasirea colocatiilor

Veti folosi tutorialul.

Preluati un text in format raw de pe site-ul www.guttenberg.org sau alt site care contine texte neadnotate. Textul trebuie sa fie de lungime mare (roman cu minim 100 de mii de cuvinte).

Programul va crea doua fisiere de output: unul pentru colocatiile formate din doua cuvinte si unul pentru colocatiile formate din trei cuvinte.

Se va scrie o documentatie (in format txt) in care este prezentat algoritmul si clasele si metodele folosite. In documentatie se va explica si cum se ruleaza programul (ce argumente primeste in linia de comanda). Sau, daca este facut cu interfata grafica, cum anume se foloseste interfata.

Nu se vor folosi nume predefinite de fisiere ( de exemplu sa se citeasca textul doar dintr-un fisier numit input.txt). Utilizatorul trebuie sa aiba libertate in a alege fisierul de procesat fara a-l redenumi intr-un anume mod (de exemplu, introducand numele fisierului intr-un textbox in interfata grafica sau transmitand numele fisierului ca argument in linia de comanda).

(1p) Detectarea cuvintelor cheie folosind algoritmul RAKE (Rapid Automatic Keyword Extraction)

Preluati un text in format raw de pe site-ul www.guttenberg.org sau alt site care contine texte neadnotate. Programul va afisa cuvintele cheie penrtu acel text.

Se va scrie o documentatie (in format txt) in care este prezentat algoritmul si clasele si metodele folosite. In documentatie se va explica si cum se ruleaza programul (ce argumente primeste in linia de comanda). Sau, daca este facut cu interfata grafica, cum anume se foloseste interfata.

Nu se vor folosi nume predefinite de fisiere ( de exemplu sa se citeasca textul doar dintr-un fisier numit input.txt). Utilizatorul trebuie sa aiba libertate in a alege fisierul de procesat fara a-l redenumi intr-un anume mod (de exemplu, introducand numele fisierului intr-un textbox in interfata grafica sau transmitand numele fisierului ca argument in linia de comanda).

(1.5p)Sumarizare

Se va folosi algoritmul TF-IDF.

Frecventa unui termen reprezinta raportul dintre numarul de aparitii ale termenului si numarul de termeni din text.

Se calculeaza frecventa cuvintelor (atentie cat si cats reprezinta acelasi cuvant, deci frecventele se vor calcula pentru lemma cuvintelor) care nu sunt stopwords.

Se imparte textul in fraze. Pentru fiecare fraza se calculeaza suma frecventelor cuvintelor si se imparte la numarul de cuvinte.

De asemenea se calculeaza pentru fiecare termen idf-ul: log10(numar de propozitii/numar total de aparitii ale cuvantului in text)

Pentru fiecare fraza se calculeaza idf-ul adunand idf-urile cuvintelor din ea si impartind la numarul lor (evident se iau in calcul doar cuvintele care nu sunt stopwords).

Calculam scorul TF-IDF pentru fiecare fraza si pastram doar frazele care au scorul peste o anumita limita sau se afla intre primele N fraze (in ordinea scorului TF-IDF).

Se va scrie o documentatie (in format txt) in care este prezentat algoritmul si clasele si metodele folosite. In documentatie se va explica si cum se ruleaza programul (ce argumente primeste in linia de comanda). Sau, daca este facut cu interfata grafica, cum anume se foloseste interfata.

Nu se vor folosi nume predefinite de fisiere ( de exemplu sa se citeasca textul doar dintr-un fisier numit input.txt). Utilizatorul trebuie sa aiba libertate in a alege fisierul de procesat fara a-l redenumi intr-un anume mod (de exemplu, introducand numele fisierului intr-un textbox in interfata grafica sau transmitand numele fisierului ca argument in linia de comanda).

Bibliografie:

  1. https://hackernoon.com/finding-the-most-important-sentences-using-nlp-tf-idf-3065028897a3

(3p) chatbot simplu - poate fi facut de 2 studenti (dar se imparte nota:1.5p+1.5p):

Se va crea un chatbot pentru o firma. Domeniul de activitate al firmei este la alegere. Chatbotul va primi un input de la utilizator si va returna raspunsuri predefinite. Chatbotul "isi da seama" din inputul utilizatorului ce doreste acesta. Dupa fiecare raspuns utilizatorul va primi si o intrebare de genul: Acest raspuns este ceea ce cautai? da/nu. In caz ca raspunde nu se ofera urmatorul raspuns mai relevant - daca nu mai sunt raspunsuri posibile chatbotul va cere reformularea cererii.

Se va folosi un algoritm de extragere a cuvintelor cheie din textul dat de utilizator (puteti alege unul dintre algoritmii prezentati pe aceasta pagina)

Se aplica un algoritm de dezambiguizare (vedeti cursul), obtinand sensurile cuvintelor.

Se calculeaza un scor de similaritate intre cererea utilizatorului si raspunsurile predefinite (scorul se va baza pe sensuri, si nu pe cuvintele in sine). Se ofera raspunsul cu scorul cel mai bun (distanta cea mai mica intre texte).

chatbotul trebuie sa cuprinda intre 20-30 raspunsuri predefinite. Studentul va identifica minim 2 cazuri de input ale utilizatorului care pot declansa raspunsuri multiple din partea chatbotului, astfel incat sa se poata testa cazul in care utilizatorul raspunde "nu" cand este intrebat daca a primit raspunsul dorit.

Se vor memora atat cazurile in care raspunsul a fost "da" cat si cazurile in care raspunsul a fost "nu". In cererile urmatoare, raspunsul va fi influentat si de ce a invatat chatbotul din raspunsurile anterioare.

Se va scrie o documentatie (in format txt) in care este prezentat algoritmul si clasele si metodele folosite. In documentatie se va explica si cum se ruleaza programul (ce argumente primeste in linia de comanda). Sau, daca este facut cu interfata grafica, cum anume se foloseste interfata.

Se vor da si cel putin 3 exemple de conversatie (in urma unor interogari reale). Fiecare exemplu de conversatie va fi intr-un fisier separat (practic se da copy-paste din consola sau din panoul din interfata grafica in care se afiseaza conversatia).

Bibliografie:

  1. https://apps.worldwritable.com/tutorials/chatbot/
  2. https://moz.com/blog/chat-bot
  3. https://medium.com/analytics-vidhya/building-a-simple-chatbot-in-python-using-nltk-7c8c8215ac6e

(2p) Detectarea oximoronelor

Veti folosi articolul DETECTING OXYMORON IN A SINGLE STATEMENT

(3p) Generarea sugestiilor de titlu pentru texte date

Vom folosi algoritmul prezentat in Improved Algorithms For Keyword Extraction and Headline Generation From Unstructured Text

Primul pas reprezinta tokenizarea textului raw. Apoi se urmeaza pasii:

  1. Se aplica POS-taggerulpe textul dat.
  2. Se elimina textul neimportant (dintre paranteze si linioare)
  3. Se elimina semnele de punctuatie (cu exceptia celor care indica finalul de fraza) Markov?
  4. Se aplica un stemmer sau lemmatizer pe cuvintele ramase
  5. Se elimina stopwords.
  6. Se elimina eventuale sinonime cu ajutorul WordNet. Cuvintele rezultate reprezinta cuvintele cheie.
  7. In textul initial se identifica grupari de cuvinte cheie. Consideram un astfel de grupa daca e delimitat in capete fie de inceputul sau finalul propozitiei, fie de un numar de cuvinte (care nu sunt cheie) mai mare sau egal cu un K (determinat experimental).
  8. Se calculeaza un scor pentru fiecare cluster. Se calculeaza frecventa fiecarui cuvant in cluster. Se aduna patratele frecevntelor. Suma obtinuta se imparte la lungimea clusterului (numarul de cuvinte din cluster).
  9. Fiecarei fraze i se asociaza un scor. Scorul unei fraze este scorul maxim dintre scorurile cluseterelor din fraza. Se aleg frazele al caror scor depaseste o limita (setata experimental).
  10. Se foloseste un HMM pentru generarea titlurilor. HMM-ul va avea o stare S de inceput si o stare E de final. Vom considera in lant inca doua tipuri de stari: H si G. Fiecare stare Hi corespunde unui cuvant cheie i. Fiecarei stari Hi ii corespunde o stare Gi din care putem ajunge in oricare din starile Hi+1. O stare Hi genereaza doar cuvantul cheie asociat i. Starile G sar peste cuvinte care nu sunt cheie. Dintr-o stare Hi se poate ajunge ori in starea G asociata ori intr-o alta stare Hj (cu j>i). Practic se porneste de la inceputul textului, si ori se sare la H1 luand primul cuvant cheie, ori la G1 care are optiunea de a sari peste cuvintele non-cheie dintre H1 si H2, sau a trece la un Hi cu i>1. Se obtin astfel mai multe titluri posibile formate din subseturi de cuvinte cheie (in ordinea in care se gaseau in text).
  11. Se aleg cele mai bune titluri dintre cele generate folosind Viterbi decoding