创建一个Python语言的名言生成器
任务:用户输入一个标签,根据该标签,Python程序必须能够逐个生成名言。如果程序无法找到任何具有给定标签的名言,则必须打印“未找到具有给定哈希标记的名言”。
解决方案 :
对于此任务,我们需要使用一个数据集。数据集必须包含名言和可以与每个名言相关联的标签。然后,程序可以搜索用户指定的标签的数据集,如果找到任何名言,它可以打印名言。我们可以在互联网上找到很多数据集,这些数据集由各个网站的开发人员上传,例如Github、Kaggle等。
在本教程中,我们将使用来自kaggle的数据集。以下是如何查找它的方法:
- 访问Google搜索并搜索“Quotes dataset”。
-
您可以找到不同的网站提供不同的数据集:
-
我们选择了Kaggle上的第一个数据集:
-
Kaggle是一个在线开发人员、机器学习爱好者和数据科学家社区,他们在项目中进行协作并分享自己的作品。正如您所观察到的,名言数据集是由社区中的一位开发人员贡献的,我们可以轻松地下载并用于我们的项目。
-
单击“下载”并等待其下载,它是一个大文件,可能需要一些时间。
-
向下滚动,您可以在kaggle中找到数据集的详细信息。现在,打开已下载的文件。
-
它是一个.json文件。使用文本文档打开.json文件。
JSON文件:
JSON代表“JavaScript对象表示法”。它是一种独立于语言的标准数据格式。它在各种数据应用程序中使用,特别是在Web应用程序和服务器之间进行数据交换时使用。它源自JavaScript,因此名称为 JSON。它使用易于阅读的文本来存储和传输数据。数据以属性值对的形式排列。可以将.json文件导入Excel以获取结构化表格格式。
以下是名言数据集中的两个名言: :
[
{
"Quote": "Don't cry because it's over, smile because it happened.",
"Author": "Dr. Seuss",
"Tags": [
"attributed-no-source",
"cry",
"crying",
"experience",
"happiness",
"joy",
"life",
"misattributed-dr-seuss",
"optimism",
"sadness",
"smile",
"smiling "
],
"Popularity": 0.15566615566615566,
"Category": "life"
},
{
"Quote":
"I'm selfish, impatient and a little insecure. I make mistakes, I am out of control and at times hard to handle. But if you can't handle me at my worst, then you sure as hell don't deserve me at my best.",
"Author": "Marilyn Monroe",
"Tags": [
"attributed-no-source",
"best",
"life",
"love",
"mistakes",
"out-of-control",
"truth",
"worst "
],
"Popularity": 0.12912212912212911,
"Category": "life"
},
?.
]
现在,如果我们尝试理解文件的基本表结构:
名称 | 名言 | 作者 | 标签 | 流行度 | 类别 |
---|---|---|---|---|---|
1 | 不要因为结束而哭泣,微笑吧,因为它曾经发生过 | Dr. Seuss | 归因于无来源,哭泣,经历,幸福,喜悦,生活,误归于Dr.Seuss,乐观,悲伤,微笑 | 0.15566615566615566 | 生活 |
2 | 我很自私、不耐烦,有点不安全。我会犯错,我失控,在某些时候难以掌控。但是,如果你不能应对我最坏的状态,那么你肯定不配拥有我最好的状态。 | Marilyn Monroe | 归因于无来源,最好,生活,爱情,错误,失控,真相,最坏 | 0.12912212912212911 | 生活 |
- 确保您编写代码的Python文件和包含数据集的Json文件在同一个文件夹中。
- 如果没有,请在代码中提供json文件的完整路径。
现在,我们将编写一个程序来读取json文件,使用用户指定的标签对其进行过滤,根据最大流行度对其进行排序,然后逐个打印最受欢迎的名言:
代码 :
import json
with open('quotes.json', encoding="utf-8") as file:
data = json.load(file)
tag = input('Enter a tag:')
dictionary = {}
for quote in data:
if tag in quote["Tags"]:
dictionary[quote["Popularity"]]=quote["Quote"]
if(len(dictionary)==0):
print("Sorry, we couldn't find any quote with given tag")
else:
keys = list(dictionary.keys())
keys.sort(reverse=True)
sorted_dict = {i: dictionary[i] for i in keys}
for i in sorted_dict:
print("Popularity: ", i)
print("Quote: ",sorted_dict[i])
print()
a = input("Next(Y/N):")
print()
if(a=="Y"):
continue
else:
break
输出 :
Enter a tag:happiness
Popularity: 0.15566615566615566
Quote: Don't cry because it's over, smile because it happened.
Next(Y/N):Y
Popularity: 0.025575025575025574
Quote: Love is that condition in which the happiness of another person is essential to your own.
Next(Y/N):Y
Popularity: 0.01855001855001855
Quote: Time you enjoy wasting is not wasted time.
Next(Y/N):Y
Popularity: 0.01366001366001366
Quote: It's so hard to forget pain, but it's even harder to remember sweetness. We have no scar to show for happiness. We learn so little from peace.
Next(Y/N):N
解释一下 :
- 第一行导入json模块,用于从文件中加载JSON数据。
- with语句以读取模式打开名言.json文件,并将其分配给变量file。编码参数设置为“utf-8”,以确保如果文件包含非ASCII字符,则正确读取文件。
- 使用json.load()函数解析来自文件的JSON数据并将其转换为Python对象。
- 使用input()函数提示用户输入标签。
- 创建一个名为dictionary的字典,用于存储具有用户输入的标签的名言以及它们的流行度得分。
- 循环迭代每个名言数据对象。如果名言具有用户输入的标签,则会将流行度得分和名言文本添加到dictionary对象中。
- 如果dictionary对象为空(即找不到具有指定标签的名言),则显示信息以通知用户。
- 如果dictionary对象不为空,则按降序对流行度得分进行排序,并逐个向用户显示排序后的名言。
- 在显示每个名言后,提示用户输入“Y”以显示下一个名言或输入“N”退出程序。如果用户输入“Y”,则继续循环到下一个名言。如果用户输入“N”,则中断循环,程序退出。