Natural Language Processing

Laboratorul 5

(Deadline: -)

Daca nu sunteti logati exercitiile nu se mai afiseaza.

NLTK - continuare

Analiza sintactica

Analiza sintactica(parsarea) se refera la analizarea textului pe baza unei gramatici formale (formal grammar). In cadrul laboratorului vom studia analiza bazata pe gramatici de constituenti si gramatici de dependente.

Vom folosi Stanford Parser. Putem folosi varianta online pentru a vizualiza parsarea (se scrie fraza, se apasa pe butonul "Parse" si in josul paginii (penultima sectiune) se va afisa lista de dependente), dar daca dorim sa folosim parserul intr-o aplicatie, trebuie sa il descarcam de la https://nlp.stanford.edu/software/lex-parser.html si sa il dezarhivam.

Pentru a folosi parserul descarcat, putem sa deschidem interfata grafica cu lexparser-gui.bat dar in interfata grafica avem acces doar la analiza bazata pe gramatici de constituenti.

Analiza bazata pe gramatici de constituenti

Arborele rezultat in urma parsarii propozitiei: I like to go to school. este:
arbore sintactic

Analiza bazata pe gramatici de dependente

Gramaticile de dependente (Dependency Grammar, abreviat DG) sunt gramatici bazate pe relatii de dependenta intre cuvintele frazei. O relatie de dependenta dintre doua cuvinte presupune existenta unui cuvant (numit cap) si a unui cuvant dependent de el. In reprezentarea vizuala, dependentele se deseneaza sub forma unei sageti de la cuvantul cap la cuvantul dependent, scriind deasupra sagetii si tipulde dependenta. Parserul de la Stanford afiseaza dependentele in format text. De exemplu, pentru fraza "I like to go to school." relatiile de dependenta sunt: nsubj(like-2, I-1)
nsubj:xsubj(go-4, I-1)
root(ROOT-0, like-2)
mark(go-4, to-3)
xcomp(like-2, go-4)
case(school-6, to-5)
nmod:to(go-4, school-6)

Formatul unei legaturi este: tip_dependenta(cuvant_cap - pozitie_in fraza, cuvant_dependent - pozitie_in_fraza)

Informatii sumare despre ce inseamna relatiile de dependenta se gasesc la https://nlp.stanford.edu/software/stanford-dependencies.html. O lista cu semnificatiile abrevierilor pentru dependente se gaseste la http://universaldependencies.org/u/dep/

Pentru a realiza analiza bazata pe relatii de dependenta, folosind parserul de la Stanford, folosim command prompt. Schimbam directorul pana ajungem in cel rezultat din arhiva downloadata de pe site. Cautam jar-ul stanford-parser-versiune-models.jar ( de exemplu, stanford-parser-3.9.2-models.jar ) si cu un program de dezarhivare ne ducem la edu\stanford\nlp\models\lexparser\englishPCFG.ser.gz si copiem fisierul din arhiva in folderul parserului.

Dam o comanda de forma: java -mx200m -cp "stanford-parser.jar;stanford-parser-3.9.2-models.jar" edu.stanford.nlp.parser.lexparser.LexicalizedParser -retainTMPSubcategories -outputFormat "wordsAndTags,penn,typedDependencies" englishPCFG.ser.gz [fisier_input] > [fisier_output]

In cazul de fata, pentru parametru outputFormat am specificat:

  • wordsAndTags - afisarea cuvintelor cu specificarea partilor de vorbire
  • penn - analiza sintactica bazata pe constituenti cu afisarea arborescenta
  • typedDependencies - afisarea dependentelor

In locul lui [fisier_input] se da calea catre fisierul text cu frazele ce se doresc a fi parsate.

Implicit rezultatul e afisat in consola, dar il putem redirecta catre un fiser de output folosind simbolul ">" si specificand calea catre fiserul de output. De exemplu: java -mx200m -cp "stanford-parser.jar;stanford-parser-3.9.2-models.jar" edu.stanford.nlp.parser.lexparser.LexicalizedParser -retainTMPSubcategories -outputFormat "wordsAndTags,penn,typedDependencies" englishPCFG.ser.gz ../test.txt > ../out.txt unde ../test.txt este calea relativa catre fisierul cu textul de parsat si ../out.txt fisierul catre care va fi redirectionat outputul.

Pentu a vizualiza dependentele descarcam de la https://nlp.stanford.edu/software/lex-parser.html din sectiunea de extensii DependenSee. Punem fiserul jar in folderul parserului.Putem testa functionalitatea printr-o comanda de forma: java -cp dependensee-3.7.0.jar;stanford-parser.jar;stanford-parser-3.9.2-models.jar;slf4j-api.jar com.chaoticity.dependensee.Main [fraza de parsat] [cale fisier png de output] de exemplu (este chiar exemplul de pe pagina DependenSee): java -cp "dependensee-3.7.0.jar;stanford-parser.jar;stanford-parser-3.9.2-models.jar;slf4j-api.jar" com.chaoticity.dependensee.Main "Example isn't another way to teach, it is the only way to teach." out.png

Atentie, comenzile sunt pentru windows. In cazul in care folositi unix, trebuie sa puneti separatorul : in loc de ; in classpath.. In cazul in care aveti probleme cu slf4j-api.jar stergeti-l din classpath.

Folosirea parserului de la Stanford in NLTK

Pentru a realiza analiza sintactica bazata pe gramatici de constituenti:

import os
from nltk.parse.stanford import StanfordParser

os.environ['JAVAHOME'] = "cale folder bin java"
os.environ['STANFORD_PARSER'] = 'cale relativa/absoluta jar parser'
os.environ['STANFORD_MODELS'] = 'cale relativa/absoluta jar modele'

parser = StanfordParser(model_path="cale relativa/absoluta englishPCFG.ser.gz")
propozitii = parser.raw_parse_sents(("I like to go to school.", "The cat is running through the room.","Where are you?"))
for prop in propozitii:
    print(list(prop))

Pentru a realiza analiza sintactica bazata pe gramatici de dependente:

import os
from nltk.parse.stanford import StanfordDependencyParser
# se poate folosi si nltk.parse.corenlp.CoreNLPDependencyParser

os.environ['JAVAHOME'] = "cale folder bin java"
cale_parser = 'cale relativa/absoluta jar parser'
cale_modele = 'cale relativa/absoluta jar modele'

dependency_parser = StanfordDependencyParser(path_to_jar=cale_parser, path_to_models_jar=cale_modele)

dependente = dependency_parser.raw_parse('I like to go to school.')

for dep in dependente:
    print(list(dep.triples()))

Wordnet

Wordnet este un dictionar semantic organizat pe synsets (synonim rings). Un synset este un grup de sinonime si are asociat un id si un sens (un cuvant poate sa apara in mai multe synsets daca respectivul cuvant (sau colocatie) este polisemantic.) explicat printr-o scurta glosa.

>>> from nltk.corpus import wordnet
>>> wordnet.synsets('school')
[Synset('school.n.01'), Synset('school.n.02'), Synset('school.n.03'), Synset('school.n.04'), Synset('school.n.05'), Synset('school.n.06'), Synset('school.n.07'), Synset('school.v.01'), Synset('educate.v.03'), Synset('school.v.03')]



>>> wordnet.synsets('schooled')
[Synset('school.v.01'), Synset('educate.v.03'), Synset('school.v.03')]
>>> wordnet.synsets('cats')
[Synset('cat.n.01'), Synset('guy.n.01'), Synset('cat.n.03'), Synset('kat.n.01'), Synset('cat-o'-nine-tails.n.01'), Synset('caterpillar.n.02'), Synset('big_cat.n.01'), Synset('computerized_tomography.n.01'), Synset('cat.v.01'), Synset('vomit.v.01')]

Tipurile de relatii intre substantive sunt:

  • hiperonimie/hiponimie >>> sch=wordnet.synset('school.n.01')


    >>> sch.hyponyms()
                                                
    [Synset('academy.n.03'), Synset('alma_mater.n.01'), Synset('conservatory.n.01'), Synset('correspondence_school.n.01'), Synset('crammer.n.03'), Synset('dance_school.n.01'), Synset('dancing_school.n.01'), Synset('day_school.n.02'), Synset('direct-grant_school.n.01'), Synset('driving_school.n.01'), Synset('finishing_school.n.01'), Synset('flying_school.n.01'), Synset('grade_school.n.01'), Synset('graduate_school.n.01'), Synset('language_school.n.01'), Synset('night_school.n.01'), Synset('nursing_school.n.01'), Synset('private_school.n.01'), Synset('public_school.n.01'), Synset('religious_school.n.01'), Synset('riding_school.n.01'), Synset('secondary_school.n.01'), Synset('secretarial_school.n.01'), Synset('sunday_school.n.01'), Synset('technical_school.n.01'), Synset('training_school.n.01'), Synset('veterinary_school.n.01')]
    >>> sch.hypernyms()
                                                
    [Synset('educational_institution.n.01')]
    >>>
  • meronime/holonime care sunt de 3 feluri: "parte fizica din", "substanta din", "membru din". >>> aer=wordnet.synset('air.n.01')


    >>> aer.substance_holonyms()
                                                
    [Synset('wind.n.01')]
    >>> aer.substance_meronyms()
                                                
    [Synset('argon.n.01'), Synset('krypton.n.01'), Synset('neon.n.01'), Synset('nitrogen.n.01'), Synset('oxygen.n.01'), Synset('xenon.n.01')]
    >>>



    >>> casa=wordnet.synset('house.n.01')


    >>> casa.part_holonyms()
                                                
    []
    >>> casa.part_meronyms()
                                                
    [Synset('library.n.01'), Synset('loft.n.02'), Synset('porch.n.01'), Synset('study.n.05')]
    >>>




    >>> tree=wordnet.synset('tree.n.01')
                                                
    >>> tree.member_holonyms()
                                                
    [Synset('forest.n.01')]
    >>> tree.member_meronyms()
                                                
    []
    >>> tree.part_meronyms()
                                                
    [Synset('burl.n.02'), Synset('crown.n.07'), Synset('limb.n.02'), Synset('stump.n.01'), Synset('trunk.n.01')]
    >>>

Similaritatea a doua synset-uri: >>> tree=wordnet.synset('tree.n.01')
                                            
>>> tree.path_similarity(wordnet.synset('plant.n.01'))

0.09090909090909091
>>> tree.path_similarity(wordnet.synset('car.n.01'))

0.07142857142857142
>>> tree.path_similarity(wordnet.synset('public_school.n.01'))

0.05555555555555555

Tema

Acest laborator, pe langa temele obisnuite de folosire a tool-ului are si o tema la alegere (o gasiti si in meniu). Temele sunt punctate diferit in functie de dificultate (intre 1-3 puncte). Studentii pot sa isi propuna propriile teme insa in realizarea temei toti trebuie sa foloseasca tool-urile invatate la laborator. Unele teme pot fi facute de 2 studenti (se specifica in enuntul lor acest lucru) caz in care punctajul se imparte la 2.

Atentie, tema aceasta si eventual alte teme alese aleator dintre cele facute de studenti se vor prezenta in ultima saptamana. Prezentarea pentru aceasta tema este obligatorie in vederea obtinerii punctajului. Deadline-ul pentru uploadarea temei este ultima zi de vacanta din vacanta de iarna. Tema se uploadeaza pe pagina in care sunt descrise toate temele.

In cazul in care un student e interesat de doua subiecte sau ar dori sa isi completeze punctajul de laborator poate alege chiar doua teme.

Temele alese de catre studenti trebuie comunicate prin e-mail pana in prima zi de vacanta (vedeti detalii pe pagina temelor).