[ a1234567 @ 15.01.2020. 12:51 ] @
Kako napraviti englesko-srpski rečnik u pythonu?

Nemam pojma!
Ali sam kao neko ko voli rad sa tekstom uzeo ovo kao zanimljiv zadatak koji će mi pomoći da nešto naučim o programiranju.

Kako treba da izgleda taj rečnik?

A. Softver:
1. pretraživanje značenja prema unetoj reči
2.1. preko konzole
2.1. kasnije napraviti desktop aplikaciju ( (pretraživanje i prvim početnim slovima reči - dropdaun lista)
2.2. još kasnije napraviti onlajn izdanje, gde bi korisnici mogli i sami da predlažu nove reči ili njihova značenja (crowdsourcing)
3. mogućnost unošenja novih reči za oba jezika i snimanje izmena
4. mogućnost popravljanja već unetih reči za oba jezika i snimanje izmena
5. mogućnost brisanja već unetih reči za oba jezika i snimanje izmena
6. veličina: do 10.000 reči u svakom od jezika.
7. operativni sistem: windows

B: Sadržaj:
1. Svaka engleska reč ima oznaku za vrstu (n = noun, v = verb, adj = adjective, pre = preposition itd.)
2. Na taj način se pravi razlika između onih koje imaju isti oblik:
play n. = 1. igra, zabava; 2. drama, pozorišna predstava
play v. = 1. igrati (se); 2. svirati; 3. glumiti
3. Različita polja značenja iste reči se odvajaju arapskim brojevima (vidi gornji primer).
4. Fraze u kojima se javlja neka reč idu na kraj značenja te reči i iza kose crte (/). Tako za play:
play v. = 1. igrati (se); 2. svirati; 3. glumiti / to bring into play = staviti u pogon, pokrenuti
5. Oblik imenica je uvek u prvom licu jednine (play, a ne plays)
6. Oblik glagola je uvek u infinitivu bez "to" (work, a ne working ili worked, sem naravno u frazama)

Toliko za početak. Pa da krenemo.
[ a1234567 @ 15.01.2020. 13:36 ] @
Za sada sam stigao dovde:

rečnik ima jednu reč
i funkciju koja ga pretražuje

Code:
word = input('Unesi reč: ')

enSr = {'agent' : 'žbir, špijun'}

def pretraga (data, keys):
    if (keys in data):
        return data[keys]
    else:
        return 'Nema u rečniku'

print(pretraga(enSr, word))


koja daje sledeći rezultat:



Naredni korak:

1. proširiti rečnik
2. dodati učitavanje fajla sa rečnikom, umesto da je unutar koda.
3. dodati proveru kod unosa za slučajeve velikog i malog slova: Agent ili agent
[ flighter_022 @ 16.01.2020. 08:17 ] @
Tebi prvo treba propisna baza. Bilo kakva. I u njoj barem 3 tabele:

1. Reči jezika 1
2. Reči jezika 2
3. Tabela koja povezuje 1 i 2, jer jedna reč može imati više značenja

Te 3 tabele možeš da nabiješ i u nizove pa da tako radiš.
[ Panta_ @ 16.01.2020. 10:14 ] @
"Najlakše" ti je to odradiš sa Python + SQLAlchemy + neka baza podatataka, npr. SQLite.

Za web aplikaciju, "najlakše" je da koristiš Django i njegov ORM (ima admin podrazumevano, pa možeš lako da unosiš nove reči, upravljaš korisničkim nalozima, itd.), ili pak Flask i SQLAlchemy.

E sad, kako ti još uvek ne znaš ništa od pomenutog, najjednostavnije je da iskoristiš API od nekog servisa za prevođenje, npr. Yandex Translation

Code (python):
from yandex.Translater import Translater

tr = Translater()
tr.set_key('yandex_kljuc')

def translate(from_lang, to_lang, text):
    tr.set_from_lang(from_lang)
    tr.set_to_lang(to_lang)
    tr.set_text(text)
    return tr.translate()


translate('en', 'sr', 'dog')                                                                                                                                                          
'pas'

translate('en', 'sr', 'cat')                                                                                                                                                          
'mačka'

translate('en', 'sr', 'dog and cat')                                                                                                                                                  
'pas i mačka'


Code:
pip install yandex-translater

[ a1234567 @ 17.01.2020. 11:20 ] @
Citat:
flighter_022:
Tebi prvo treba propisna baza. Bilo kakva. I u njoj barem 3 tabele:

1. Reči jezika 1
2. Reči jezika 2
3. Tabela koja povezuje 1 i 2, jer jedna reč može imati više značenja

Te 3 tabele možeš da nabiješ i u nizove pa da tako radiš.


Mislim da mi ne trebaju tri tabele, dovoljan je jedan fajl. Jer za ove slučajeve što si naveo sa istom reči i više značenja sam predvideo da ona budu zajedno. Tako su sva značenja izlistana odjednom. Na primer:

play = (noun) 1. igra, zabava; 2. drama, pozorišna predstava; (verb) 1. igrati (se); 2. svirati; 3. glumiti

Šta misliš?


[ a1234567 @ 17.01.2020. 11:37 ] @
Citat:
Panta_:
"Najlakše" ti je to odradiš sa Python + SQLAlchemy + neka baza podatataka, npr. SQLite.

Za web aplikaciju, "najlakše" je da koristiš Django i njegov ORM (ima admin podrazumevano, pa možeš lako da unosiš nove reči, upravljaš korisničkim nalozima, itd.), ili pak Flask i SQLAlchemy.

E sad, kako ti još uvek ne znaš ništa od pomenutog, najjednostavnije je da iskoristiš API od nekog servisa za prevođenje, npr. Yandex Translation


Hvala Panto na idejama, ali lepo kao što si lepo zaključio, ne znam ništa od ovoga, dakle ne mogu da vozim avion dok ne provozam bicikl
Nije meni bitno da napravim rečnik koji će se stvarno koristiti, ima ih već fala bogu dovoljno i online i offline. Meni je ovo više prilika da učim korak po korak. Zato, drži ti jedno oko ovde, pa kad zapnem, da daš hint neki, kao i od sada.

Inače, probao Yandeks, fenomenalno prevodi, bolje od google translate. odmah ga instalirao na mobilnom da ga testiram.
Google Translate istog trenutka deinstaliran. Ne volim hobotnice





[ Shadowed @ 17.01.2020. 12:38 ] @
Citat:
a1234567:Mislim da mi ne trebaju tri tabele, dovoljan je jedan fajl. Jer za ove slučajeve što si naveo sa istom reči i više značenja sam predvideo da ona budu zajedno. Tako su sva značenja izlistana odjednom. Na primer:

play = (noun) 1. igra, zabava; 2. drama, pozorišna predstava; (verb) 1. igrati (se); 2. svirati; 3. glumiti

Šta misliš?

Imas razlicitih mogucnosti.
Jedna je da ti podaci budu tako organizovani kao sto si naveo: za prevod imas jednu rec i jedan kombinovani prevod. Ako to radis, mozes koristiti tekstualni fajl ili bazu sa samo jednom tabelom (dve kolone). Prednost baze je mogucnost indeksiranja sto moze znacajno ubrzati pretragu.
Druga je da imas svaki prevod zasebno. To je korisno ako ti treba iz nekog razloga da koristis pojedinacne prevode (npr. da korisnik u okviru prevoda klikne na neki od njih pa da mu uradi obrnut prevod). To mozes sa fajlom tako sto bi imao vise redova za svaku rec. Npr.
play = igra
play = pozorisna predstava
...
Onda bi ucitao sve redove koji se odnose na play. Isto tako mozes i bazu sa dve kolone, ako hoces indeksiranje za brze nalazenje.
Treca mogucnost je ono sto ti je flighter_022 naveo. Prednosti toga u slucaju recnika nisu neke narocite. Takav nacin rada je "po knjizi" ali bi ti vise znacio kada bi imao nesto vise podataka o pojedinacnim recima pa onda tabela sa recima sa kolonom za svaki podatak i sl. Ti ovde imas jedan dodatni podatak - vrstu reci. Tako da mozes ali i ne moras.


PS. ako ti je cilj ucenje, mozes probati da sam pravis neko indeksiranje. Nece biti efikasno kao kod baze ali ces nauciti neke stvari i verovatno ce biti zanimljivo :)
[ a1234567 @ 20.01.2020. 07:15 ] @
Za sada bih da probam najjednostavniju varijantu sa malom količinom podataka. Dakle, tekst file, sa tuplama, eng - srp.
Ako bude volje i znanja, posle mogu da probam i nešto komplikovanije.

Kad govoriš o indeksiranju, šta tačno treba da uradim?
[ djoka_l @ 20.01.2020. 07:57 ] @
Problem sa tvojim "projektom" je pogrešan odabir teme kojom hoćeš da se baviš.

Standardni školski rečnici imaju oko 20-50 hiljada pojmova.
On-line rečnici imaju od 45 hiljada pa naviše pojmova i to u više jezika.
WordNet, recimo, ima 155 hiljada engleskih reči.

Sa druge strane, ti govoriš o 10 hiljada reči i to samo rečnika u jednom smeru engleski -> srpski. Pri tom, još uvek ne znaš da programiraš, a tvoj primer ima manje od 100 reči.

Projekat ti se ne mrda, a ti tapkaš u mraku.

Evo ti nekoliko potprojekata:

1. Napraviti CLI (command line interface) za korišćenje rečnika. Nazovim taj fajla MyDict-CLI.py
Primer korišćenja:
Recimo, traženje prevoda za play treba da izgleda:
py MyDict-CLI.py --find play

MyDict-CLI.py treba da prepoznaje sledeće opcije kod pozivanja

-f , --find word :::pretraga rečnika po zadatoj reči
-a, --add json-string :::ubacivanje novog pojma
-d, --delete word :::brisanje reči word iz rečnika
-v, --version :::ispisivanje verzije rečnika
-h, --help :::ispisavnje help teksta (nešto kao ovo što sam ti sada napisao)

Python treba da javi ako je zadata nepoznata opcija i da reaguje isto kao kada se zada -h, tj da ispiše moguće opcije

Cilj ovog zadatka je da naučiš kako se procesiraju ulazni parametri komandne linije, JSON način predstavljanje podataka, kao i da malo razmišliš o strukturi podataka kojom će se rečnik koristiti.

2. Napraviti interaktivnu tekst verziju za pretragu i izmenu rečnika, recimo MyDict-txt.py
Program treba da prikaže uvodni ekran, ponudi pretragu reči, dodavanje ili brisanje.
Ukoliko je u prethodnom koraku već tražena ta reč, treba da je ispiše, da prikaže opcije za brisanje, izmenu, ili za novu pretragu.
Treba da ima opciju za izlaz iz programa.

3. Napraviti program MyDict-core.py gde će (za početak) biti smešteni podaci rečnika i koji će raditi funkcije pretrage, dodavanja, brisanja, snimanja (u fazi 2) i učitavanja (u fazi 2) podataka rečnika

4. Napraviti funkciju MyDict-txtformater.py koji će od, bilo kakve strukture kojom se služi rečnik, napraviti string ili fajl u tekstualnom formatu, koji ćeš da prikazuješ kao odgovor iz rečnika.

Cilj ovih vežbi je da, sada kada je projekat razbijen na više malih projekata, kreneš sa mrtve tačke. Osim toga, cilj je i da naučiš kako da program podeliš na više fajlova, jer si do sada samo radio jedan program - jedan fajl.
[ djoka_l @ 20.01.2020. 08:14 ] @
5. Napraviti html formater koji pojam iz rečnika prikazuje kao ispravanu HTML stranicu.
Dodati opciju u CLI:

-o, --output txt|html ::: izbor formata ispisa (txt ili html)

Ova opcija može da se pojavi uz -f opciju, za ostale opcije nema smisla.

HTML ispis preusmeri u fajl i pogledaj ga iz browsera.
Neka bude vanilla html (samo osnovni prikaz) - ulepšavanjem html izlaza ostavi za projekat 6.

Cilj vežbe je da savladaš koncept MVC (Model, View, Controller). Dakle, imaš nešto što je model - to je struktura podataka kojom je opisan rečnik. View je način na koji vidiš (podskup) podataka iz modela. Controller je skup funkcija koje manipulišu modelom.
[ a1234567 @ 20.01.2020. 08:21 ] @
Đoko, hvala na instrukcijama i podeli po etapama.
Ali moje znanje je toliko, da moram i etape da podelim na podetape :)

Prva podetapa:
da uopšte vidim kako se pravi CLI
Ako imaš neki bolji tutorial (a da je tekstualni), javi.

Druga podetapa:
da otkrijem ŠTA je to JSON, a onda i da vidim kako ću da ga iskoristim.

Ali hajde ovu prvu podetapu da savladam, pa se javljam.

[ djoka_l @ 20.01.2020. 08:45 ] @
https://stackabuse.com/command-line-arguments-in-python/
https://www.tutorialspoint.com...hon_command_line_arguments.htm
https://docs.python.org/3.3/library/argparse.html

https://en.wikipedia.org/wiki/JSON

https://en.wikipedia.org/wiki/...2%80%93view%E2%80%93controller
[ djoka_l @ 20.01.2020. 08:54 ] @
Uostalom, ne moraš redom da praviš ove potprojekte. Kreni od 2. jer print znaš kako da koristiš.
[ djoka_l @ 20.01.2020. 10:16 ] @
Evo jednog primera kako može struktura rečnika da se predstavi kao JSON podatak:

Code:

   "dictionary":[ 
      { 
         "word":"play",
         "type":"noun",
         "translation":[ 
            "igra",
            "predstava"
         ],
         "usage":"Napraviti primer fraze na engleskom gde se play koristi u ovom značenju, pa onda prevod na srpski"
      },
      { 
         "word":"play",
         "type":"verb",
         "translation":[ 
            "igrati (se)"
         ]
      }
   ]
}


Kako se ovo čita:

"dictionary" je niz podataka čija je struktura (čija su polja) word, type, transalation i usage. translation je niz (lista) stringova, dok su ostala tri polja stringovi.

Vitičaste zagrade ( { i } ) označavaju početak i kraj sloga, uglaste zagrade ( [ i ] ) označavaju početak i kraj liste, naziv polja i vrednost polje razdvojeni su dvotačkom ( : ) a naziv polja i vrednost polja su (opciono) pod znacima navoda...
Članovi niza, odnosno parovi ime:vrednost su razdvojeni zarezom ( , )

Ova indentacija je zbog čitljivosti, može više stvari u isti red, recimo:

Code:
{"dictionary":[ 
{"word":"play","type":"noun","translation":["igra","predstava"],"usage":"Napraviti primer fraze na engleskom gde se play koristi u ovom značenju, pa onda prevod na srpski"},
{"word":"play","type":"verb","translation":["igrati (se)"]}
]}
[ a1234567 @ 20.01.2020. 15:10 ] @
Đoko, napravio sam listu od petstotinak reči i prema strukturi koju si dao.
Ovde sam je sačuvao, pa pogledaj jel to to.
[ djoka_l @ 20.01.2020. 17:09 ] @
Vidim da si se potrudio.
Primer ti je odličan, jer pokazuje mnoge slabosti koje nisi video u mom prvom modelu podataka. Te slabosti sam, delimično, namerno stavio, delimično zato što se nisam preterano udubio.

Recimo:
1. Prve dve odrednice nisu imenice, nego skraćenice (tebi je sve "noun")
2. Imaš gomilu fraza, one treba da idu nekako posebno. Samo pomisli kako bi radio pretragu - ako neko ne unese tačno onako kako si uneo, jednostavno pretraživanje neće uspeti.
3. Imaš mešavinu malih i velikih slova. Potrebno je da se odlučiš za velika ili mala slova i da sve bude na isti način napisano.
4. Imaš recimo banking, a nemaš bank. bank može da bude banka, može da bude obala (reke), može da bude gomila itd. Onako kako sam ja smislio u prvi mah značilo bi da mora da se unese više redova, jer je "usage" vezan za pojam "word" umesto za listu prevoda.
5. Pošto je ovo neki rečnik finansijskih termina, možda treba da bude neko dodatno polje, na primer "context". Pa bi, recimo kontekst za banking bio "financial", a za neke druge stvari, recimo, "colloquial", opet nekad "archaic", nekad "urban" nekad ništa.
6. Treba da razmišljaš o šifarnicima, recimo "type" može da bude noun, verb, adjective, adverb. Pa onda ni to nije dovoljno, nego se pojavi i abbrevation, phrase, pronoun, determiner, conjunction, lista se širi i širi.


Uzmi kao primer, neki normalan rečnik, i vidi šta će ti dati pretraga.
Recimo https://www.dictionary.com/browse/banking
Pogledaj rezultat i zamisli kako bi ti napravio model podataka, koji bi po reči "banking" dao sličan rezultat
[ B3R1 @ 20.01.2020. 18:33 ] @
Ako ti je JSON komplikovan ili necitljiv dobra alternativa je i YAML. Ovaj recnik gore u YAML postaje:
Code:

dictionary:
    - word: "play"
      type: "noun"
      translation:
        - "igra"
        - "predstava"
      usage: "Primer fraze na engleskom jeziku i prevoda ..."

    - word: "play"
      type: "verb"
      translation:
        - "igrati (se)"

YAML je zgodan jer je manje-vise intuitivan, citiljiviji od JSON-a i ne zahteva jurnjavu za zagradama. Zapravo podseca na nacin na koji studenti hvataju beleske. Pravila su slicna pravilima sintakse Pythona - bitan je pravilan razmak reci od leve ivice, odnosno "nazubljivanje" (indenting). Liste se predstavljaju spiskom elemenata s vodecim crticama - npr:
Code:

lista:
    - "prvi element"
    - "drugi element"
    - "treci element"

niz_brojeva:
    - 1
    - 153213
    - 2190

sto je ekvivalentno Python kodu:
Code:
{ "lista": [ "prvi element", "drugi element", "treci element" ] }
{ "niz_brojeva": [ 1, 153213, 2190 ] }


Dictovi, odnosno hash tabele, se definisu kao spisak parova kljuc : "vrednost" npr:
Code:

person:
    lastname: "Doe"
    firstname: "John"
    birthdate: "1960-12-01"

sto je ekvivalentno Python kodu:
Code:
{ "person" : { "lastname": "Doe", "firstname": "John", "birthdate": "1960-12-01" }}

Naravno, kombinacije su uvek moguce - npr:
Code:

person:
    lastname: "Doe"
    firstnames:
      - "John"
      - "Wilson"

sto daje:
Code:
{ "person": { "lastname": "Doe", "firstnames": [ "John", "Wilson" ] }}


U gornjem primeru sa recnikom promenljiva 'dictionary' je zapravo lista u kojoj su elementi dict-ovi
Mada su navodnici stvar konzistentnosti, YAML se lepo snalazi i konvertuje stringove bez obzira da li stavljas navodnike ili ne, jer je dizajniran u skladu sa Postelovim principom. Drugim recima, recnik iz gornjeg primera Python ume savrseno da cita cak i ako napises:
Code:
dictionary:
    - word: play
      type: noun
      translation:
        - igra
        - predstava
      usage: Primer fraze na engleskom jeziku i prevoda ...

    - word: play
      type: verb
      translation:
        - igrati (se)

YAML parser je izuzetno inteligentan. Stavise, ako napises u fajlu:
Code:
vreme:
    - datum: 2017-09-27
    - vreme: 23:59:00
    - temperatura: -5

YAML parser ce to lepo prepoznati i prilikom ucitavanja YAML fajla u promenljivu Python ce to lepo prepoznati i dace ti:
Code:
{'vreme': [{'datum': datetime.date(2017, 9, 27)}, {'vreme': 86340}, {'temperatura': -5}]}

Cak je prepoznao i da je 2017-09-27 datum, a vreme je izrazio u sekundama od ponoci (86340 = 23*3600 + 59*60). Takodje, temperaturu je prepoznao kao int.

Umalo da zaboravim finalnu sitnicu - kako se Python liste importuju iz YAML fajlova? Prosto, treba ti PyYAML modul. Jednom kada ga instaliras i napravis fajl u YAML formatu (npr. yaml.txt) - samo kazes:
Code:
import yaml
d = yaml.load(open('yaml.txt', 'r'))


Naravno moguca je i obrnuta operacija - ako imas defiisanu promenljivu 'd' koja je neka kombinacija list/dict, mozes da je ispises u YAML formatu koriscenjem:
Code:
import yaml
yaml.dump(d)


I to je sve.

[Ovu poruku je menjao B3R1 dana 21.01.2020. u 11:18 GMT+1]
[ bokinet @ 20.01.2020. 19:51 ] @
Dodatak na @djoka_l post:

Pogledati american soundex, daitch-mokotoff soundex i phonetic matching algoritme kao nacin za pretrazivanje reci.
[ djoka_l @ 21.01.2020. 08:37 ] @
bokinet je stvarno daleko otišao, čisto sumnjam da imaš znanja da uradiš pretragu po soundex i sličnim stvarima

Programiranje ti je kao konzerva crva, jednom kad otvoriš, treba ti veća da ih ponovo potrpaš u nju.
Već sam ti više puta rekao da tvoj projekat može da ode mnogo dalje nego što uopšte imaš predstavu.

Ruku na srce, tebi problem može da reši i word fajl, ali ti si krenuo u nešto što ne poznaješ.
Drži se ti zadataka iz knjige, ljudi koji su to pisali polako te uvode u različite koncepte, a dok stigneš do nekog ozbiljnog programiranja, fali ti, jedno, 1000 programa...
[ Nedeljko @ 21.01.2020. 18:15 ] @
Dobar rečnik može biti i jednojezični, a suština je da za svaku reč definiše sva značenja te reči sa primerima upotrebe u svakom od značenja, kao i sa oznakama o vrsti reči (imenica, glagol, pridev...) i njenim gramatičkim promenama ako se menja pravilno, odnosno navođenjem promena ako se menja nepravilno.

Jedna od ideja je takođe da se uzme neka količina teksta i da se reči sortiraju po učestanosti upotrebe, pa da se unose najpre one najučestalije, a onda one maje učestale.
[ a1234567 @ 24.01.2020. 14:38 ] @
Citat:
djoka_l:
Vidim da si se potrudio.
Primer ti je odličan, jer pokazuje mnoge slabosti koje nisi video u mom prvom modelu podataka. Te slabosti sam, delimično, namerno stavio, delimično zato što se nisam preterano udubio.

Nisam se bavio time da podaci budu precizni, već da napravim strukturu podataka i nešto stavim u slot. A posle je te podatke moguće naravno doterivati i ispravljati.
I danas sam pokušao da napravim pretragu rečnika, ali imam problem, jer ovako kako je sada, kad učitam fajl stalno dobijam tip string. Ne mogu da ga ubedim da bude dict :))

Rečnik je sada u ovoj formi:
{"word" : "automatic data processing (ADP)", "type" : "fraza", "translation" : ["automatska obrada podataka (AOP)"], "usage" : "primer upotrebe"},
{"word" : "AAR (Against All Risks)", "type" : "noun", "translation" : ["protiv svih rizika"], "usage" : "primer upotrebe"},
{"word" : "abate", "type" : "noun", "translation" : ["sniziti; reducirati (cene)"], "usage" : "primer upotrebe"},
{"word" : "abbreviated (abbr.)", "type" : "noun", "translation" : ["skraćeno; skraćenica"], "usage" : "primer upotrebe"},
{"word" : "abeyance", "type" : "noun", "translation" : ["privremena obustava (zakona)"], "usage" : "primer upotrebe"},
{"word" : "ability", "type" : "noun", "translation" : ["sposobnost; mogućnost; platežna sposobnost"], "usage" : "primer upotrebe"},
{"word" : "abolition", "type" : "noun", "translation" : ["obustavljanje parnice"], "usage" : "primer upotrebe"},
{"word" : "abortive expenditure", "type" : "noun", "translation" : ["ekonomski neopravdani izdaci"], "usage" : "primer upotrebe"}

Svaki red je recnik sa ovim vitičastim zagradama, ali ceo fajl python vidi kao string.
[ a1234567 @ 24.01.2020. 16:15 ] @
Mislim da ću morati napraviti nešto ovako:

recnik = {1: {"word" : "automatic data processing (ADP)", "type" : "fraza", "translation" : "automatska obrada podataka (AOP)", "usage" : "primer upotrebe"}, 2: {"word" : "AAR (Against All Risks)", "type" : "noun", "translation" : "protiv svih rizika", "usage" : "primer upotrebe"}, 3: {"word" : "abate", "type" : "noun", "translation" : "sniziti; reducirati (cene)", "usage" : "primer upotrebe"}, 4: {"word" : "abbreviated (abbr.)", "type" : "noun", "translation" : "skraćeno; skraćenica", "usage" : "primer upotrebe"}, 5: {"word" : "abeyance", "type" : "noun", "translation" : "privremena obustava (zakona)", "usage" : "primer upotrebe"}, 6: {"word" : "ability", "type" : "noun", "translation" : "sposobnost; mogućnost; platežna sposobnost", "usage" : "primer upotrebe"}, 7: {"word" : "abolition", "type" : "noun", "translation" : "obustavljanje parnice", "usage" : "primer upotrebe"}, 8: {"word" : "abortive expenditure", "type" : "noun", "translation" : "ekonomski neopravdani izdaci", "usage" : "primer upotrebe"}}

Ovo sam isprobao, radi kao rečnik :)
[ djoka_l @ 24.01.2020. 18:11 ] @
Code:
import json

with open('data.txt') as json_file:

    data = json.load(json_file)
    print('\nSadržaj fajla sa podacima\n'+60*'-')
    print(data)
    print(60*'-')
    print('\nPodaci\n'+60*'-')
    for p in data['dictionary']:
        print('word: ' + p['word'])
        print('type: ' + p['type'])
        print('translation: ' + ', '.join(p['translation']) )
        if 'usage' in p:
            print('usage: ' + p['usage']) 
 
        print('')


Rezultat:
Code:
Sadržaj fajla sa podacima
------------------------------------------------------------
{'dictionary': [{'word': 'play', 'type': 'noun', 'translation': ['igra', 'predstava'], 'usage': 'Napraviti primer fraze na engleskom gde se play koristi u ovom značenju, pa onda prevod na srpski'}, {'word': 'play', 'type': 'verb', 'translation': ['igrati (se)']}]}
------------------------------------------------------------

Podaci
------------------------------------------------------------
word: play
type: noun
translation: igra, predstava
usage: Napraviti primer fraze na engleskom gde se play koristi u ovom značenju, pa onda prevod na srpski

word: play
type: verb
translation: igrati (se)
[ a1234567 @ 26.01.2020. 11:03 ] @
Nije mi baš jasna struktura ovog tvog rečnika:

{'dictionary': [{'word': 'play', 'type': 'noun', 'translation': ['igra', 'predstava'], 'usage': 'Napraviti primer fraze na engleskom gde se play koristi u ovom značenju, pa onda prevod na srpski'}, {'word': 'play', 'type': 'verb', 'translation': ['igrati (se)']}]}

Key je samo jedan - 'dictionary', a sve ovo ostalo je 1 'value'?
[ djoka_l @ 26.01.2020. 12:31 ] @
Moj post je samo odgovor na:

Citat:

I danas sam pokušao da napravim pretragu rečnika, ali imam problem, jer ovako kako je sada, kad učitam fajl stalno dobijam tip string. Ne mogu da ga ubedim da bude dict :))

Svaki red je recnik sa ovim vitičastim zagradama, ali ceo fajl python vidi kao string.


Pokazao sam ti da MOŽE fajl ispravno da se parsira kao JSON.
A to kakva će biti struktura podataka je drugi par rukava.

Snimi tvoju varijablu kao JSON, pa ćeš i moći da je učitaš kao JSON.
[ a1234567 @ 26.01.2020. 12:44 ] @
To je sve u redu. Učitao sam ga i taj deo radi.
Ali onda sam krenuo da probam pretragu po ključevima i vidim da nešto ne štima.

Ali sad ako promenim strukturu, videćemo šta će biti i sa učitavanjem. Igranka bez prestanka :)
[ a1234567 @ 26.01.2020. 15:34 ] @
Dobro, još jedan korak napravljen.
Pronalazim traženu reč.

Rečnik koji učitavam je ovde.

a kod takođe:

Code:
import json

with open('c:/englesko-srpski recnik/en_srp_recnik.txt', encoding='utf-8') as json_file:
    data = json.load(json_file)

word = input('Unesi reč: ')

word = word.lower()

for i in data['dictionary']:
    if i['word'] == word:
        print(i['translation'])


Unesi reč: accounting control
['računovodstvena kontrola']


Ostaje da vidim kako da ubacujem nove reči i popravljam već unete ako uočim neku grešku.
[ a1234567 @ 11.04.2020. 15:45 ] @
Nova, jednostavna verzija englesko-srpskog rečnika :)

Ulazni podaci su u Excelu.
Prva kolona engleska reč, druga kolona srpska:

one | jedan
two | dva
itd.

Kad sam pravio csv fajl, stavio sam = a ne zarez između engleske i srpske reči, da bih imao gde da delim na kolone,
jer se inače zarezi pojavljuju u rečniku između reči istog jezika.

Sve radi kako treba, ali na kraju kad upisujem novo stanje u izlazni Excel fajl dict_new.csv
iz nekog razloga upiše samo prvu kolonu i to svako slovo u reči odvoji zarezom!?
Jel ima neko ideju gde je greška?

Code:
import csv

with open('c:/FAJLOVI/Python_School/recnik/recnik.csv', newline = '', encoding = 'utf-8') as csvfile:
    reader = csv.reader(csvfile, delimiter='=')
    mydict = {rows[0]:rows[1] for rows in reader}

# Search an English word
def searching(search):
    print('This English word in Serbian means: ', mydict[search])
    return

# Add a new English word to the Dictionary
def adding(add_eng, add_serbian):
    mydict[add_eng] = add_serbian
    print('Done!')

# Correct an English word in the Dictionary
def correcting(error, correction):
    x = mydict.get(error)
    if x:
        mydict[correction] = mydict[error]
        del mydict[error]
        print(f'{error} replaced with {correction}')
    else:
        print(f'{error} is not in the dictionary')

ans = True
while ans:
    print ("""
    1. Look Up English word
    2. Add an English word
    3. Correct an English word
    4. Exit/Quit
    """)
    ans = input("What would you like to do? ") 
    if ans == "1": 
        searching(input('Search for English word: '))
    elif ans == "2":
      adding(input('To add a new English word, type it here: '), input('Now type its meaning in Serbian: '))
    elif ans == "3": 
      correcting(input('Type English word to be corrected: '), input('Type correct version of the English word: '))
    elif ans == "4":
      print("\n Goodbye")
      break
    elif ans != "":
      print("\n Not Valid Choice. Try again")     


#Writing new status of the Dictionary
with open('dict_new.csv', mode='w', encoding = 'utf-8') as outfile:
    writer = csv.writer(outfile)
    writer.writerows(mydict)

print("Writing completed.")
[ a1234567 @ 07.05.2020. 06:20 ] @
Nova, poboljšana verzija ekonomskog rečnika je ovde
Pošto je još u eksperimentalnoj fazi, u bazi su samo engleske reči na slova A-C i njihovi srpski prevodi.

Fajlovi su:
srp_eng.py
eng_srp.csv
srp_eng.csv

Sada može da se:
1. pretražuje u oba smera: englesko-srpski i srpsko-engleski
2. ubacuju nove reči
3. ispravljaju već postojeće
4. izlistaju reči prema nekoliko početnih karaktera, radi lakše pretrage

Ako ima predloga na koji način rečnik može da se poboljša, dobro su došli.
[ djoka_l @ 07.05.2020. 11:40 ] @
U tvom programu su BUKVALNO sve funkcije osim glavnog menija duplirane.
Ovakav način pisanja programa dovodi do gomile grešaka tipa, u jednoj funkciji se nešto izmeni, a u drugoj ne i onda imaš problem da pohvataš koja je izmena aktuelna.

Pisanje u rečnik. Posle svakog unosa nove reči, praviš fajl od nule. Za add je dovoljno da se uradi append nove reči na kraj fajla.
[ a1234567 @ 07.05.2020. 17:16 ] @
Moraju biti duplirane, kad su dva rečnika
englesko-srpski i srpsko engleski, pa učitavaju različite tabele
i barataju njima.

Ili ima neki drugi način?

To za append ću da popravim.
[ djoka_l @ 07.05.2020. 19:51 ] @
Naravno da postoji drugi način. Jedina razlika je varijabla iz koje se čita/piše reč.
Zašto parametar pretrage ne bi bila i varijabla u kojoj je rečnik.
[ a1234567 @ 09.05.2020. 18:13 ] @
Sad gledam ponovo kod.
Postoje dva fajla (englesko-srpski i srpsko-engleski), tako da ima i dve varible sa rečnikom.
A onda su i funkcije za pretragu različite.