Python 脱机字典程序:查找相似的单词以及以相同开头的单词

Python 脱机字典程序:查找相似的单词以及以相同开头的单词,python,dictionary,difflib,Python,Dictionary,Difflib,我已经写了这个离线字典程序。我想当用户按下一个键时,这个程序进入数据库,找到一个接近用户输入的单词。或者,当用户完全输入一个单词并且该单词在数据库中时,程序将显示该单词及其含义 就这一部分而言,一切进展顺利。然后我想举个例子,当用户输入单词“a”时,程序会显示数据库中以“a”开头的所有单词 下面是我的问题的一个例子:当我们输入“a”时,所有以“a”开头的单词和含义都应该显示出来。但该节目显示了如下内容: 下面是我的一些json格式的数据库: {"apple": ["Apple", "apple

我已经写了这个离线字典程序。我想当用户按下一个键时,这个程序进入数据库,找到一个接近用户输入的单词。或者,当用户完全输入一个单词并且该单词在数据库中时,程序将显示该单词及其含义

就这一部分而言,一切进展顺利。然后我想举个例子,当用户输入单词“a”时,程序会显示数据库中以“a”开头的所有单词

下面是我的问题的一个例子:当我们输入“a”时,所有以“a”开头的单词和含义都应该显示出来。但该节目显示了如下内容:

下面是我的一些json格式的数据库:

{"apple": ["Apple", "apple", "Sib", "Apfel", "Des pommes"], "average": ["Average", "average", "Miangin", "Durchschnitt", "Des pommes"], "acknowledge": ["Acknowledge", "acknowledge", "Tasdigh Kardan", "Zu bestatigen", "Pour reconnaître"], "book": ["Book", "book", "Ketab", "Buch", "Livre"], "banana": ["Banana", "banana", "Mouz", "Bananen", "Bananes"], "beach grass": ["Beach Grass", "beach grass", "Chamane Sahel", "Strandhafer", "herbe de plage"], "cat": ["Cat", "cat", "Gorbe", "Katzen", "chatte"], "certificate": ["Certificate", "certificate", "Govahi Name", "Zertifikat", "certificat"], "declaration of conformity": ["Declaration Of Conformity", "declaration of conformity", "Elamie Entebagh", "Konformitatserklarung", "déclaration de conformité"], "database": ["Database", "database", "Paygah Dade", "Datenbank", "base de données"], "dear colleagues": ["Dear Colleagues", "dear colleagues", "Hamkarane Aziz", "Liebe Mitarbeiterinnen und Mitarbeiter", "Chers collègues"]}
在这本词典中,每个单词都有英语、波斯语、法语和德语的意思

您可以在下面看到我的代码:

导入json
导入msvcrt
导入操作系统
从difflib导入获取\u关闭\u匹配
DataBase=json.load(打开(“DataBase.json”))
定义的含义(w):
w=w.下()
n=长度(w)
如果w在数据库中:
返回数据库[w]
elif len(get_close_matches(w,DataBase.keys(),1,0.3))>0:
close_match=get_close_matches(w,DataBase.keys(),1,0.3)[0]
打印(“未找到!\n检查紧密匹配:\n”)
返回数据库[关闭匹配]
其他:
打印(“未找到!\n”)
res=[键的值,数据库中的值。items()]
对于我在res:
对于i中的j:
如果w在j[0:n]中,则下()
印刷品(j)
返回“”
单词=“”
尽管如此:
如果msvcrt.kbhit():
temp=msvcrt.getwch()
字+=温度
操作系统(“cls”)
打印(word)
打印(“\n”)
意思=获得意义(单词)
对于具有以下含义的项目:
打印(项目)

请注意,您必须在
CMD
中运行此程序才能正常工作,因为
msvcrt.kbhit()
如果有人输入
a
,您将调用
getmeans
,该程序反过来调用
get\u close\u matches
。然后检查该调用是否有非零长度的返回值,如果有,则执行
返回数据库[关闭匹配]
。这就是
getMeans
的结尾

如果
get\u close\u匹配
生成结果,您将永远无法访问
else
-部分
getmeans
。在您问题的屏幕截图中,我们可以看到用户输入的结果
a
,这是有意义的,因为
get\u close\u匹配的
finds
cat
类似于
a

忽略这一点,如果要测试一个字符串是否以另一个字符串开头,则应该使用。此外,如果
elif
具有
返回值,并且我已根据更改了名称,则在上一个
之后,您不需要
elif
else

下面是一个可能的解决方案,使用一个过滤器,该过滤器仅在字母与
word
中的字母相同时才接受紧密匹配:

从difflib导入获取\u关闭\u匹配
数据库={“apple”:[“apple”、“apple”、“Sib”、“Apfel”、“Des pommes”],“average”:[“average”、“average”、“Miangin”、“Durchchnitt”、“Des pommes”],“acknowledge”:[“acknowledge”、“acknowledge”、“Tasdigh Kardan”、“Zu bestatigen”、“Pour reconnaîître”],“book”:[“book”、“book”、“book”、“Ketab”、“Buch”、“Livre”],“banana”:[“banana”、“banana”、“banana”、“Ban,“巴南群岛”],“海滩草”:[“海滩草”、“海滩草”、“沙曼萨赫勒”、“斯特拉达弗”、“普拉格之草”],“猫”:[“猫”、“猫”、“戈尔贝”、“卡岑”、“查特”],“证书”:[“证书”、“证书”、“Govahi名称”、“Zertifikat”、“证书”],“符合性声明”:[“符合性声明”、“符合性声明”,“Elamie Entebagh”、“Konformitatserklarung”、“déclaration de conformité”]、“数据库”:[“数据库”、“数据库”、“Paygah Dade”、“Datenbank”、“base de données”]、“亲爱的同事”]、“亲爱的同事们”:[“亲爱的同事们”、“亲爱的同事们”、“Hamkarane Aziz”、“Liebe Mitarbeiterinen and Mitarbeiter”]、“Chers collégues”]
def get_含义(单词):
#使word不区分大小写
word=word.lower()
#检查word是否已在数据库中
如果数据库中有word:
返回{word:database[word]}
#找到可能的匹配项
close\u matches=get\u close\u matches(word,database.keys(),1,0.3)
#筛选匹配项:仅保留包含相同字母的匹配项
关闭匹配项=[
势均力敌
对于close_匹配中的close_匹配
如果设置(关闭匹配)=设置(字)
]
#如果有剩余的匹配项,则返回结束匹配项
如果close_匹配:
返回{
关闭匹配:数据库[关闭匹配]
对于close_匹配中的close_匹配
}
#返回以单词开头的所有词典条目
返回{
条目:数据库[条目]
用于在数据库中输入
if entry.startswith(word)
}
现在
a
不再产生
cat

>>获得意义(“a”)
{'apple':['apple'、'apple'、'Sib'、'Apfel'、'Des pommes']、'average':['average'、'Miangin'、'Durchschnitt'、'Des pommes']、'acknowledge':['acknowledge'、'acknowledge'、'Tasdigh Kardan'、'Zu bestatigen'、'Pour reconnerî238
但是
applle
仍然被识别为
apple

>>获取含义(“applle”)
{'apple':['apple','apple','Sib','Apfel','despommes']

或者,您可以修改调用的参数
cutoff
,以获得不同的结果。

get\u close\u中,匹配项
可选参数
cutoff
是范围
[0,1]
中的浮点值
不得分至少与word相似的可能性将被忽略

因此,我只需要将
get\u close\u matches
cutoff
0.3
更改为
0.8

这就解决了我的问题

    elif len(get_close_matches(w,DataBase.keys(),1,0.8)) > 0:
        close_match = get_close_matches(w,DataBase.keys(),1,0.8)[0]
        print("Not Found!\nCheck The Close Match:\n")
        return DataBase[close_match]

如果是这么简单就更好了:)