I'm a beginner at programming. I created an English-Malayalam dictionary bot for telegram in python. It is working fine. But I'm thinking about an upgrade. The database is a CSV file (tab separated). The bot searches for the input word and replies with the results (Malayalam definitions) to the user. check screenshot here.
It searches for the entire word. But I want the bot to give me the results with only two or three letters as input. For example, when I type "ent", I want the results of all words starting with "ent". Screenshot here.
My current code is below. (searching section)
import csv
def malayalamDict(word):
mDict = []
mDef = []
eWrd = []
with open("data/olam-enml.csv", "r") as f:
r = csv.reader(f)
for i in r:
if word in i[0]:
mDict.append(i[0].split('\t'))
for j in range(0, len(mDict)):
mDef.append(str(mDict[j][-1]))
for k in range(0, len(mDict)):
eWrd.append(str(mDict[k][1]))
return mDef, eWrd
My CSV file example:
id english_word part_of_speech definition
14007 Entity n സത്ത
14008 Entity n അസ്തിത്വം
14009 Entity n വസ്തു
138185 Entity n നിലനില്പ്
138186 Entity n ഉണ്മ
207395 Entity n നിലനില്പ്
Please somebody help me here.
CodePudding user response:
to check first letters you can use text.startswith(word)
but you have few other problems which makes that it may not work.
You compare ent
with Entity
and you should use lower()
(or upper()
) to compare it with entity
.
You check word
with i[0]
before split()
so you compare it with 14007 Entity n സത്ത
. You should simply use csv_reader(..., delimiter='\t')
to split it automatically - and then you can compare with second column row[1]
This code works with your file csv
which you added in your comment here - it gives 307 results for ent
import csv
def malayalam_dict(word):
malayalam_definition = []
english_word = []
word = word.lower()
with open("olam-enml.csv", "r") as f:
cvs_reader = csv.reader(f, delimiter='\t')
#for (id_, english, part_of_speech, definition) in cvs_reader:
for row in cvs_reader:
#(id_, english, part_of_speech, definition) = row
if row[1].lower().startswith(word):
malayalam_definition.append(row[-1])
english_word.append(row[1])
return malayalam_definition, english_word
definitions, words = malayalam_dict('ent')
print(len(definitions))
To make code more readable I uses full names for variables.
See more: PEP 8 -- Style Guide for PythonCde
EDIT:
I would keep results as pairs (definition, english)
instead of separated lists.
I would also use regex to use more complex searching
import csv
import re
def malayalam_dict(word, regex=False):
results = []
word = word.lower()
with open("olam-enml.csv", "r") as f:
cvs_reader = csv.reader(f, delimiter='\t')
#for (id_, english, part_of_speech, definition) in cvs_reader:
for row in cvs_reader:
#(id_, english, part_of_speech, definition) = row
if regex:
if re.findall(word, row[1].lower()):
results.append( (row[-1], row[1]) )
else:
if row[1].lower().startswith(word):
results.append( (row[-1], row[1]) )
return results
results = malayalam_dict('ent') # normal `startswith()`
results = malayalam_dict('^ent', regex=True) # regex
print(len(results))
for number, (definition, english) in enumerate(results, 1):
print(f'{number:4} | {english:20}: {definition}')
Result:
307
1 | Entail : പ്രത്യേകപിന്തുടര്ച്ചക്രമം
2 | Entail : ദാനവിക്രയാദി അധികാരങ്ങളില്ലാതെ തലമുറയായി അനുഭവിക്കുന്നതിനു നല്കിയ സ്വത്ത്
3 | Entail : അന്യാധീനപ്പെടുത്താന് പാടില്ലാത്ത വിധം നല്കുക
4 | Entail : ചുമത്തുക
5 | Entail : അനിവാര്യമാക്കിത്തീര്ക്കുക
6 | Entail : കൈമാറ്റം ചെയ്യാന് അധികാരമില്ലാത്ത വസ്തുവകകളുടെ പിന്തുടര്ച്ചാവകാശം
7 | Entail : ആവശ്യമായി വരുക
8 | Entail : അന്യാധീനപ്പെടുത്താന് പാടില്ലാത്ത വിധം അവകാശം കൊടുക്കുക
9 | Entail : കൈമാറ്റം ചെയ്യാന് അധികാരമില്ലാത്ത വസ്തുവകകളുടെ പിന്തുടര്ച്ചാവകാശം
10 | Entailer : അവകാശമായി വിട്ടുകൊടുക്കുന്നവന്
11 | Entangle : കുടുക്കുക
12 | Entangle : അകപ്പെടുത്തുക
13 | Entangle : സങ്കീര്ണ്ണീകരിക്കുക
14 | Entangle : കെട്ടുപിണയുക
15 | Entangle : വിഷമിക്കുക
16 | Entangle oneself with: മറ്റുള്ളവരുമായി വഴക്കടിച്ച് പ്രശ്നമുണ്ടാക്കുക
...