Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

PARSER in PROLOG

Linguaggi e sistemi

Moderatori: Foto UtentePaolino, Foto Utentefairyvilje

0
voti

[11] Re: PARSER in PROLOG

Messaggioda Foto Utenterugweri » 11 dic 2021, 19:23

prolog ha scritto:Il tuo interprete può essere realizzato pure con un linguaggio procedurale tipo il python?
So che python ha una librareria che si chiama NLTK e può suddividere la frase in soggetto, verbo e complemento, giusto?


Puoi realizzarlo con qualunque linguaggio (a proposito, ma perché hai scelto Prolog tra tutti i possibili linguaggi esistenti? Cosa ti ha portato a scegliere un linguaggio logico invece di un banalissimo linguaggio procedurale oppure orientato agli oggetti?), e non hai neanche bisogno di librerie esterne: nel mio messaggio precedente ti ho letteralmente scritto (leggi bene ;-) ) cosa devi implementare.

PS: non quotare interi post molto lunghi... per stavolta ho sistemato io.
Avatar utente
Foto Utenterugweri
5.948 2 7 11
CRU - Account cancellato su Richiesta utente
 
Messaggi: 1366
Iscritto il: 25 nov 2016, 18:46

0
voti

[12] Re: PARSER in PROLOG

Messaggioda Foto Utenteprolog » 11 dic 2021, 19:58

Ho scelto la difficoltà del PROLOG perché mi sembrava l'unico linguaggio che potesse risolvere la questione NLP.
Vedo però che posso fare cose molto più semplici coi linguaggi procedurali ad oggetti.
Avatar utente
Foto Utenteprolog
0 2
 
Messaggi: 9
Iscritto il: 10 dic 2021, 8:20

0
voti

[13] Re: PARSER in PROLOG

Messaggioda Foto Utenterugweri » 11 dic 2021, 20:10

Premettendo che linguaggi procedurali e linguaggi orientati agli oggetti non sono la stessa cosa (anche se molti linguaggi permettono di fondere l'uno e l'altro approccio a varie gradazioni di fedeltà), l'utilizzo molto basico (e tendenzialmente scorretto se non hai il supporto di un buon testo di riferimento) di un linguaggio appartenente a uno di questi due insiemi è il massimo che tu possa ottenere senza studiare davvero.
Quel che pensavi circa i linguaggi logici non è del tutto campato in aria (tra "non del tutto campato in aria" e "vero" ce ne passa, comunque...), ma non tiene conto di una cosa: i linguaggi logici sono basati direttamente - indovina un po' - sulle logiche formali, e dunque se non conosci quelle tu un linguaggio logico non lo puoi usare.

Consiglio spassionato: prendi Python o C o un qualsiasi linguaggio procedurale/OO e fai un po' di pratica... e nel frattempo leggiti questo libro, così se non altro hai una minima idea di cosa stai facendo. Se mi comunichi che linguaggio scegli poi ti consiglio anche delle risorse didattiche per studiarlo e fare esercizi sensati.
Avatar utente
Foto Utenterugweri
5.948 2 7 11
CRU - Account cancellato su Richiesta utente
 
Messaggi: 1366
Iscritto il: 25 nov 2016, 18:46

0
voti

[14] Re: PARSER in PROLOG

Messaggioda Foto Utenteprolog » 12 dic 2021, 5:01

Ho scelto python.
Avatar utente
Foto Utenteprolog
0 2
 
Messaggi: 9
Iscritto il: 10 dic 2021, 8:20

0
voti

[15] Re: PARSER in PROLOG

Messaggioda Foto UtenteDarwinNE » 12 dic 2021, 9:04

prolog ha scritto:Il tuo interprete può essere realizzato pure con un linguaggio procedurale tipo il python?


Sicuramente. Nel mio caso, sono un 200 linee scarse scritte in C.

rugweri ha scritto:3) Date le semplificazioni spiegate nei precedenti punti e dati gli ovvi limiti del linguaggio del gioco (che potrà contenere... diciamo 200 parole?), l'interprete di DarwinNE può essere implementato anche ignorando del tutto la teoria dei linguaggi formali e dunque non costruendo esplicitamente (implicitamente lo si fa lo stesso, ma non è necessario saperlo) una grammatica formale e a maggior ragione una semantica formale.


Esattamente. Per la precisione, si tratta di 357 parole riconosciute da The Queen's Footsteps. I giochi di quel genere possono arrivare al migliaio di parole riconosciute.
Follow me on Mastodon: @davbucci@mastodon.sdf.org
Avatar utente
Foto UtenteDarwinNE
31,0k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 4420
Iscritto il: 18 apr 2010, 9:32
Località: Grenoble - France

0
voti

[16] Re: PARSER in PROLOG

Messaggioda Foto Utenteprolog » 12 dic 2021, 10:48

Sto cencando di far riconoscere la seguente frase:
Codice: Seleziona tutto
"Il cane è rosso"


Come database interno voglio far in modo che abbia quel concetto lì dentro.
Vorrei poi fare in modo che risponda alla domanda
Codice: Seleziona tutto
"Di che colore è il cane?"


ed il programma dovrebbe rispondere:
Codice: Seleziona tutto
"Rosso"


Dici sia troppo difficile fare una cosa del genere col python e le NLTK?
Io ci provo.
E' possibile avere una copia del tuo codice giusto per capire che strategia hai usato, oppure è protetto da copyright?
Avatar utente
Foto Utenteprolog
0 2
 
Messaggi: 9
Iscritto il: 10 dic 2021, 8:20

0
voti

[17] Re: PARSER in PROLOG

Messaggioda Foto Utenterugweri » 12 dic 2021, 12:05

prolog ha scritto:Ho scelto python.


Benissimo, allora puoi iniziare da questo libro, che è estremamente semplice e in più ti fa subito giocare con dei progetti in modo da permetterti di applicare quel che impari. Un altro bel libro è questo qui, che ti consiglio almeno di scorrere dopo aver visto il primo che ti ho consigliato in modo da cogliere gli spunti che ti dà su librerie utili, strutture dati e funzionalità "avanzate" del linguaggio (tra l'altro questo libro si trova gratis in pdf semplicemente cercando su Google il suo titolo. Non so se sia legale, ma tant'è...). Come terza risorsa (intesa ovviamente per la consultazione al bisogno e non per lo studio) ti consiglio la documentazione ufficiale di Python, che se hai un dubbio può senz'altro chiarirtelo (in alcuni punti in verità è un po' carente, ma tra libri e documentazione - e anche il forum, se vorrai chiederci aiuto - dovresti comunque riuscire a capire quel che ti interessa).


prolog ha scritto:Sto cencando di far riconoscere la seguente frase:
Codice: Seleziona tutto
"Il cane è rosso"


Come database interno voglio far in modo che abbia quel concetto lì dentro.
Vorrei poi fare in modo che risponda alla domanda
Codice: Seleziona tutto
"Di che colore è il cane?"


ed il programma dovrebbe rispondere:
Codice: Seleziona tutto
"Rosso"


Dici sia troppo difficile fare una cosa del genere col python e le NLTK?

No, anzi è abbastanza facile (reitero il consiglio: leggi il messaggio dove ti ho spiegato quelle cose sull'interprete del gioco... quale implementazione ho ipotizzato? ;-)).
Però ascoltami, per favore: tu NON SAI programmare (magari usi Python da un po', questo non lo so... ma saper programmare non è solo aver usato un linguaggio), e in questo momento baloccarti con le librerie è la via più veloce per non imparare mai davvero a programmare. Studia il linguaggio, cerca di scrivere quel che ti serve solo con le funzionalità base (cosa fattibilissima) e solo dopo esserci riuscito introduci le librerie indispensabili (e NLTK non lo è, perché quello che vuoi fare sta al NLP come un bambino che si diverte con le matite colorate sta a Botticelli).

prolog ha scritto:E' possibile avere una copia del tuo codice giusto per capire che strategia hai usato, oppure è protetto da copyright?

Ecco, questa è un'altra cosa che ti dovresti togliere dalla testa: contrariamente a quanto orde di pseudo-programmatori dipendenti da StackOverflow credono, leggere il codice di qualcun altro è tutt'altro che un'operazione facile, perché per trarre davvero qualcosa di sensato dall'operazione è essenziale che tu non solo conosca bene il linguaggio in cui il codice è scritto ma abbia anche le competenze per comprendere le scelte algoritmiche e le motivazioni profonde che hanno portato ad esempio alla selezione di una funzione di libreria invece che di un'altra.
Come già ti ho detto, per fare le cose bene non esistono scorciatoie: non impari l'astrofisica se prima non passi per la matematica (e per un bel po' di altra fisica), quindi perché ti aspetti di poter scrivere del codice sensato se prima non passi per tutte le tappe dell'apprendimento?
Avatar utente
Foto Utenterugweri
5.948 2 7 11
CRU - Account cancellato su Richiesta utente
 
Messaggi: 1366
Iscritto il: 25 nov 2016, 18:46

0
voti

[18] Re: PARSER in PROLOG

Messaggioda Foto Utenteprolog » 12 dic 2021, 12:36

Conosco già il linguagio C che ho fatto in modo approfondito.
Il python lo conosco meno del C, ma il primo l'ho studiato fino alle iterazioni con "for ...in_range()" , quindi so fare le iterazioni col ciclo for senza iterare i vari indici come si fa invece col C.
Posso inviare il sorgente di una rubrica telefonica in python giusto per far capire il mio livello di conoscenza di tale linguaggio:
rubrica.py
Codice: Seleziona tutto
import json
import os

class Rubrica:
    def __init__(self):
        self
   
    #funzione membro per visualizzare tutta la rubrica in ordine alfabetico
    def vis_rubrica(self, lista, diz):
        i = 0
        lista_selezionata = []
        try:
            lista = carica(lista)
        except OSError as e:
            print("\nNessun file di salvataggio\n\n")
            print("\nInserisci voci!\n")   
        lista.sort(key=ordina)
        iniziale = input("\n\nInserisci le iniziali di ricerca: ")
        if iniziale != "":
            for n in lista:
                key_list = list(n.keys())
                cogn = n[key_list[0]]
                lettera = cogn[0]
                if lettera == iniziale:
                    lista_selezionata.append(lista[i])
                i = i + 1
            for n in lista_selezionata:
                print("\n", n)
            lista_selezionata = []
        else:
            for n in lista:
                print("\n", n)   
        return lista
       
    #metodo per visualizzare i comandi
    def help(self):
        print("\n\n'lista'   comando per dare la lista completa della rubrica");
        print("\n\n'lista abc..etc'      aggiungendo la prima, la seconda o la terza ini");
        print("\n            ziale si puo' specificare quale parte della rub ");
        print("            rica si vuole visualizzare");
        print("\n\n'modifica nome da modificare'   comando per modificare il nome");
        print("                     o il numero di una voce della rubrica.");
        print("\n\n'cancella nome da cancellare'   comando per cancellare una voce");
        print("\n\n'cancella'                   comando per cancellare tutte le voci");
        print("\n\n'nuova'            comando per inserire una nuova voce");
        print("\n\n'esci'            comando per uscire dal programma\n\n");
   
    #metodo di inserimento nuova voce
    def nuova(self, lista, diz):
        cognome = input("\nCognome: ")
        nome = input("\nNome: ")
        telefono = input("\nTelefono: ")
        diz = {}
        diz["cognome"] = cognome
        diz["nome"] = nome
        diz["telefono"] = telefono
        lista.append(diz)
        try:
           os.remove("rubrica.json")     
        except OSError as e:
            print("\nNessun file di salvataggio\n\n")   
        salva_nuova(lista)
     
    #metodo per modificare i nomi ed i numeri della rubrica
    def modifica(self, lista, diz):
        i = 0
        print("\n\nInserisci cognome da modificare: ")
        voce = input("\nCognome: ")
        for n in lista:
            diz = lista[i]                   
            key_list = list(diz.keys())
            stato = key_list[0]
            cogn = diz[stato]
            if cogn == voce:
                cognome = input("\nCognome: ")
                nome = input("\nNome: ")
                telefono = input("\nTelefono: ")
                if cognome != "":
                    diz["cognome"] = cognome
                    print("\nChiave cambiata\n")
                if nome != "":
                    diz["nome"] = nome   
                    print("\nChiave cambiata\n")
                if telefono != "":
                    diz["telefono"] = telefono   
                    print("\nChiave cambiata\n")
            i = i + 1
        try:
           os.remove("rubrica.json") 
           salva_nuova(lista)
        except OSError as e:
            print("\nNessun file di salvataggio\n\n")
            print("\nInserisci voci!\n")   
           
   
    def cancella(self, lista, diz):
        n = 0
        i = 0
        voce = input("\n\nVoce da cancellare? ")
        if voce == "":
            try:
                os.remove("rubrica.json")
                lista = []
                print("\nRubrica cancellata\n\n")
            except OSError as e:
                print("\nNessun file di salvataggio\n\n")   
        else:
            for n in lista:
                diz = lista[i]
                key_list = list(diz.keys())
                stato = key_list[0]
                cogn = diz[stato]
                if cogn == voce:
                    del lista[i]
                    print("\nVoce cancellata\n\n")
                i = i + 1
            try:
                os.remove("rubrica.json")
                salva_nuova(lista)
            except OSError as e:
                print("\nNessun file di salvataggio\n\n") 
                print("\nInserisci voci!\n")
           
       
def salva_nuova(lista):   
    with open("rubrica.json", "a") as outfile:
        json.dump(lista, outfile)   
       
         
def carica(lista):
    with open("rubrica.json") as outfile: 
        return json.load(outfile)
     
def ordina(diz):
    key_list = list(diz.keys())
    return diz[key_list[0]]
 
 
i = 0
rub = []
diz = {}
lista = []
rub = Rubrica()

#presentazione rubrica
print("\n============================RUBRICA TELEFONICA=================================")
print("\n\nDigitare 'help' per avere la lista dei comandi\n\n")
try:
    lista = carica(lista)
except OSError as e:
    print("\nNessuna voce nella rubrica\n\n")

#iterazione comandi
while 1:
     comando = input("\n\n\n> ")
     if comando == "lista":
        rub.vis_rubrica(lista, diz)
     if comando == "nuova":
        while 1: 
            i = input("\n\nNuova voce? 1=yes, 0=no: ")
            i = int(i)
            if i == 0:
                break
            else:
                rub.nuova(lista, diz)
     if comando == "modifica":
         rub.modifica(lista, diz)
     if comando == "cancella":
         rub.cancella(lista, diz)
     if comando == "help":
         rub.help()
     if comando == "esci":
         break


saranno in tutto una trentina di righe.
La stessa cosa feci con le librerie ANSI del C, ma ne uscirono 400 righe come ridere.
Ho già delle buone basi con python.
Avatar utente
Foto Utenteprolog
0 2
 
Messaggi: 9
Iscritto il: 10 dic 2021, 8:20

0
voti

[19] Re: PARSER in PROLOG

Messaggioda Foto Utenterugweri » 12 dic 2021, 13:05

prolog ha scritto:Conosco già il linguagio C che ho fatto in modo approfondito.


Se lo conosci davvero in modo approfondito (che non vuol dire ricordare a memoria in che header stanno le varie funzioni o quante funzioni ci sono nella libreria standard) perché non hai già implementato il tuo interprete?
Capire davvero il C è una cosa che ha come prerequisito la capacità di pensare davvero ai programmi e ancor prima agli algoritmi e alle strutture dati su cui si basano: il C a differenza di praticamente qualsiasi altro linguaggio procedurale/OO di uso corrente non ti regala mai nulla, ma ha gli strumenti per fare tutto. Una volta che hai davvero capito il C, l'unica cosa che ti separa dalla facoltà di implementare un programma è lo studio delle fondamenta matematiche dell'ambito cui il programma fa riferimento (e ovviamente l'esperienza).

A me dispiace tantissimo dover essere netto e "duro", ma se vuoi davvero andare avanti ci sono delle convinzioni e delle modalità di pensiero di cui devi necessariamente comprendere la disfunzionalità.


prolog ha scritto:Il python lo conosco meno del C, ma il primo l'ho studiato fino alle iterazioni con "for ...in_range()" , quindi so fare le iterazioni col ciclo for senza iterare i vari indici come si fa invece col C.

Che vuol dire "fino alle iterazioni con for..in_range()"? Quale metodo stai seguendo? Hai un testo di riferimento?
Quando insegno Python io quella struttura iterativa la faccio vedere dopo un bel po', perché non è assolutamente necessaria al fine di scrivere programmi sensati; altre persone, invece, preferiscono mostrarla subito (approccio che io non condivido, ma non ho la presunzione di essere la misura del mondo). Stando così le cose, dirci "fino a dove sei arrivato" non è un'informazione particolarmente sensata se non ci dici anche come stai studiando.


Andando al tuo codice, ho alcune domande strutturali e algoritmiche (che non per forza sottolineano dei tuoi errori... se sei in grado di rispondere):

1) Usi una classe per la rubrica... perché?
2) Usi un file JSON... perché non un semplice file di testo? Cosa ti ha portato a questa scelta?
3) Perché ci sono funzioni che maneggiano il file della rubrica fuori dalla classe che descrive la rubrica?
4) Perché nella funzione di inserimento di una nuova voce (che hai chiamato in modo terribile peraltro) cancelli il file e lo ricrei? Non sarebbe meglio aggiornare un file già esistente? (Collegata alla domanda n° 2)
5) Per quale motivo nella funzione di visualizzazione della rubrica riutilizzi la variabile "lista" che hai ricevuto come parametro e non definisci invece una variabile locale?
6) Esattamente qual è l'algoritmo che implementi con la tua funzione di modifica?

prolog ha scritto:La stessa cosa feci con le librerie ANSI del C, ma ne uscirono 400 righe come ridere.

Come sopra, il C non ti regala nulla mentre linguaggi come Python nascondono buona parte della complessità e ti danno l'impressione di sapere quando invece non hai la minima idea.

prolog ha scritto:Ho già delle buone basi con python.

Cosa ti rende convinto di quest'affermazione?
Avatar utente
Foto Utenterugweri
5.948 2 7 11
CRU - Account cancellato su Richiesta utente
 
Messaggi: 1366
Iscritto il: 25 nov 2016, 18:46

0
voti

[20] Re: PARSER in PROLOG

Messaggioda Foto Utentexyz » 12 dic 2021, 13:06

prolog ha scritto:Ho già delle buone basi con python.

Non credo, rivedi le tue conoscenze e competenze non sono da programmatore per quello che vuoi fare (valutazione in base al codice che hai allegato prima in Python).

Se vuoi vedere dei problemi risolti da me in Prolog presenti in questo forum:

viewtopic.php?f=41&t=23201&p=176532#p176532
viewtopic.php?f=41&t=21787&p=163302#p163302
Avatar utente
Foto Utentexyz
6.864 2 4 6
G.Master EY
G.Master EY
 
Messaggi: 1778
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

PrecedenteProssimo

Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 10 ospiti