我应该如何用Python制作动词变位研究工具?

2024-04-20 00:35:46 发布

您现在位置:Python中文网/ 问答频道 /正文

谢谢你花时间看我的帖子,我现在是一个西班牙语班的学生,我想做一个学习工具来练习西班牙语动词的变化

在与代码学院顾问交谈后,他建议使用嵌套字典,您可以在下面的代码中看到

  • 1级键应该是所有动词的不定式形式
  • 第二级键应该是动词的时态
  • 第三级的关键应该是人称代词,第三级的值应该是我们想要学习的由人称和数字标记的相应动词

我不熟悉这些字典,需要帮助!在轮班结束前,代码学院顾问对随机性进行了短暂的检查。以下是我希望在游戏中实现的3个主要功能:

  1. 让程序随机选择动词、时态和文章

  2. 让程序询问用户输入并提出问题,例如,“动词的(时态)(冠词)形式是什么?”

  3. 让程序响应,说“正确!”或“错误!”

一些例子:

  • 例1:

    • 课程问题:目前的hacer形式是什么

    • 用户输入:Hago

    • 程序响应“正确!”

  • 例2:

    • 节目问题:现在的哈瑟形式是什么

    • 用户输入:Haces

    • 程序响应“正确!”

  • 例3:

    • 课程问题:hacer的形式是什么

    • 用户输入:Hece

    • 程序响应“不正确!”

这是我目前的字典

import random  
verbs = {
'hacer': {
'present':{
    'yo': 'hago',
    'tu': 'haces',
    'elellausted': 'hace',
    'nosotros': 'hacemos',
    'ellosellasuds': 'hacen'
}
, 'preterite':{
    'yo': 'hice',
    'tu': 'hiciste',
    'elellausted': 'hizo',
    'nosotros': 'hicimos',
    'ellosellasuds': 'hicieron'
}
}
'tener': {
'present':{
    'yo': 'tengo',
    'tu': 'tienes',
    'elellaud':'tiene',
    'nosotros':'tenemos' ,
    'ellosellasuds':'tienen'
}
, 'preterite':{
    'yo': 'tuve',
    'tu': 'tuviste',
    'elellausted': 'tuvo',
    'nosotros': 'tuvimos',
    'ellosellasuds': 'tuvieron'
}
}
}

感谢所有能帮助我的人!我刚开始编程,但我已经做了大约6个月的网站设计了。我愿意学习,任何帮助都将不胜感激

如果你想建立一个skype电话的某种形式或聊天,这将是非常感谢,我会非常愿意

再次感谢您的阅读


Tags: 代码用户程序字典动词形式学院yo
2条回答

我有几分钟的时间,这里有一些代码可以帮助你开始。它首先创建可能的冠词、动词和时态的列表(这些可以使用for循环找到,也可以由您手动输入)。然后它使用random模块从这些列表中选择一个随机条目。然后,我们询问用户的答案,如果他们答对了,我们会给他们一个新的问题,并允许他们再试一次。 如果你有什么不明白的,请告诉我

import random  
verbs = {
'hacer': {
'present':{
    'yo': 'hago',
    'tu': 'haces',
    'elellausted': 'hace',
    'nosotros': 'hacemos',
    'ellosellasuds': 'hacen'
}
, 'preterite':{
    'yo': 'hice',
    'tu': 'hiciste',
    'elellausted': 'hizo',
    'nosotros': 'hicimos',
    'ellosellasuds': 'hicieron'
}
}, # ADDED A MISSING COMMA HERE
'tener': {
'present':{
    'yo': 'tengo',
    'tu': 'tienes',
    'elellaud':'tiene',
    'nosotros':'tenemos' ,
    'ellosellasuds':'tienen'
}
, 'preterite':{
    'yo': 'tuve',
    'tu': 'tuviste',
    'elellausted': 'tuvo',
    'nosotros': 'tuvimos',
    'ellosellasuds': 'tuvieron'
    }
    }
    }

article_list = ["yo", "tu", "elellausted", "nosotros", "ellosellasuds"]
verb_list = list(verbs.keys())

tense_list = []
for key in verbs:
  for tense in verbs[key]:
    if tense not in tense_list:
      tense_list.append(tense)
# or you could just manually type a list of tenses, probably more efficient. 

while True:
  article_choice = random.choice(article_list)
  verb_choice = random.choice(verb_list)
  tense_choice = random.choice(tense_list)

  question = "What is the {} {} form of {}?\n> ".format(tense_choice, article_choice, verb_choice)

  while True:
    response = input("{}".format(question)) #in python2: raw_input(..)

    if verbs[verb_choice][tense_choice][article_choice] == response.lower().strip():
      print("Correct!")
      break
    else:
      print("Incorrect, try again.")

TL;博士

我在Windmill的代码中添加了一些功能——一个保存的动词分数计数器,有助于区分低分数变化的优先级,一些可以跳过或退出的选项,我将dict作为json保存在一个文件中,我还添加了一些关于webscraping动词的建议

学习工具

  • 目标:通过测试用户经常失败的动词,简化动词的学习

用例

请注意,我在搜索相同的通用用例时发现了这篇文章

也就是说,“我想学习X语言中的动词,并通过使用一个小程序进行改进。”

具体来说,我在学习葡萄牙语时还需要一个动词变位学习工具。葡萄牙语在几个方面与西班牙语相似,其中一个是动词变位

我还考虑了一个事实,即你需要一个动词变位研究工具,我认为这就是问题通常所指的-这个工具的使用不仅限于西班牙语。从这个问题中,我了解到学习工具应该帮助你学习-例如,在学习过程中与一起调整,并对你不断出错的单词进行优先排序,应该很容易理解它的工作原理

针对弱点的设计

基本上,我们希望跟踪我们的分数以针对我们的弱点,否则程序将回到我们已经熟悉的动词*。我认为这在这样的研究工具中很重要,否则使用它将是浪费时间

*添加动词是规则动词还是不规则动词的信息可能是个好主意。这样,我们就能够在某种时态的规则形式被很好地理解之后,对不规则动词进行优先排序好的,“这里”可以由工具的用户以启发式或经验的方式决定,作为一个研究问题。两者都取决于用户的需求和工具存储的信息

获取数据

首先,我们需要动词表数据

您可以选择手动输入数据,这需要大量的繁琐和耐心,或者自动输入数据,如果您不懂网络垃圾,则需要愿意学习。我建议您使用python查找webscraping,这样您就可以学习使用一些库(如requests和lxml或beautifulsoup)构造获取动词所需的基本命令。这取决于你决定浏览哪个网站,因为有很多在线词典可以浏览动词屈折变化的信息

数据格式选择

保存刮取的数据时,您有一些选择

json

如果您想使用字典,我建议将其保存为json文件并使用python json库加载。这样您就可以将文件与代码分开

因此,在名为spanish_verbs.json的文件中,动词看起来像这样:

{
  "hacer": {
    "present": {
      "yo": "hago",
      "tu": "haces",
      "elellausted": "hace",
      "nosotros": "hacemos",
      "ellosellasuds": "hacen"
    },
    "preterite": {
      "yo": "hice",
      "tu": "hiciste",
      "elellausted": "hizo",
      "nosotros": "hicimos",
      "ellosellasuds": "hicieron"
    }
  },
  "tener": {
    "present": {
      "yo": "tengo",
      "tu": "tienes",
      "elellaud": "tiene",
      "nosotros": "tenemos",
      "ellosellasuds": "tienen"
    },
    "preterite": {
      "yo": "tuve",
      "tu": "tuviste",
      "elellausted": "tuvo",
      "nosotros": "tuvimos",
      "ellosellasuds": "tuvieron"
    }
  }
}

因此,现在不必在程序中使用动词,您可以使用以下简单的方法加载它们:

with open("spanish_verbs.json", 'r') as f:
      verbs = json.load(f)
csv

否则,我会将数据保存为csv或tsv,并使用熊猫之类的东西加载文件

程序操作和接口

当前接口基于终端。如果您想更进一步,可以使用tkinter或wxpython之类的东西来构建GUI

启动程序

从终端启动程序:

python3 ./ask_verb_tense_example.py spanish_verbs.json verb_scores.tsv

行动

您可以使用以下操作之一:

  1. 要键入动词,请按return检查是否正确
  • 运行此命令可以是正确的,也可以是错误的

  1. 要选择一个选项,请按return

关于选项,您可以选择

  • q-保存进度并退出

  • p-传递并显示用户无法记住的动词

  • 这些选项假定不应该有任何称为q或p的动词

记录分数

还有一个动词在程序中对数据框进行评分,该数据框将更新,并在您完成所有动词一次后,从一组最差的5个评分动词中跟踪和训练您的随机动词

评分规则

评分规则如下:

  • 键入正确答案将为动词的正确累积分数增加一分

  • 键入错误答案将使动词的错误累积分数增加一分

  • 及格将使动词的错误累积分数增加一分

  • 上述任何操作都会将一个添加到总变量中,该变量会被跟踪以检查错误/正确答案的百分比

代码

代码如下:

import random
import readline
import sys
import os
import json
import pandas as pd

with open(sys.argv[1], 'r') as f:
   verbs = json.load(f)

def load_verb_scores(filename):
   if not os.path.exists(filename):
       verb_scores = pd.DataFrame(
           {
               "verb": pd.Series([], dtype='str'),
               "correct": pd.Series([], dtype='int'),
               "incorrect": pd.Series([], dtype='int'),
               "total": pd.Series([], dtype='int'),
           },
       )
   else:
       verb_scores = pd.read_csv(filename, sep='\t')
   return verb_scores

def update_scores(verb_scores, verb, correct=False, incorrect=False):
   total=0

   if correct and incorrect:
       raise Exception("Answer to question cannot be both correct and incorrect!")

   if (verb_scores.verb==verb).any():

       if correct:
           verb_scores.loc[(verb_scores.verb==verb),"correct"]+=1

       elif incorrect:
           verb_scores.loc[(verb_scores.verb==verb),"incorrect"]+=1

       verb_scores.loc[(verb_scores.verb==verb),"total"]+=1

   else:
       verb_scores=verb_scores.append(
           {
               "verb":verb,
               "correct":int(correct),
               "incorrect":int(incorrect),
               "total":1,
           },
           ignore_index=True
       )


   return verb_scores

verb_scores = load_verb_scores(sys.argv[2])
total_to_practice = sum([len(y) for v in verbs.values() for y in v.values()])
print(f"found {total_to_practice} verbs to practice")

while True:

   if verb_scores.shape[0]==total_to_practice:
       # random choice out of poorest performing verbs
       poorest_performance = (verb_scores.incorrect/verb_scores.total).nlargest(5).index
       verb = random.choice(verb_scores.loc[poorest_performance].verb.tolist())

       v_index=verb_scores.verb==verb

       # warning: some verbs may correspond to multiple infinitives/tenses/articles !
       infinitive = [i for i, v in verbs.items() for y in v.values() if verb in y.values()][0]
       tense = [t for v in verbs.values() for t, y in v.items() if verb in y.values()][0]
       article = [a for a,v in verbs.get(infinitive).get(tense).items() if verb==v][0]

       incorrect_pct = (verb_scores[v_index].incorrect*100/verb_scores[v_index].total).item()
       print("selected verb: ", infinitive, " wrong ", incorrect_pct, "% of the time")

   else:
       # random choice over all verbs to begin with
       infinitive = random.choice(list(verbs.keys()))

       tense2articles2verbs = verbs.get(infinitive)
       tense = random.choice(list(tense2articles2verbs.keys())) # choose a tense
       articles2verbs = tense2articles2verbs.get(tense)
       article = random.choice(list(articles2verbs.keys())) # choose an article
       verb = articles2verbs.get(article)

   question = "What is the {} {} form of {}?\n> ".format(
       tense,
       article,
       infinitive,
   )

   while True:
       response = input("{}".format(question))

       if verb == response.lower().strip():
           print("\033[92mCorrect!\033[0m")
           verb_scores = update_scores(
               verb_scores,
               verb,
               correct=True
           )
           break
       elif 'p' == response.lower():
           print("\033[91mPassing... the correct verb was {}\033[0m".format(verb))
           verb_scores = update_scores(
               verb_scores,
               verb,
               incorrect=True
           )
           break
       elif 'q' == response.lower():
           print("Safe quit.")
           verb_scores.to_csv(sys.argv[2], sep='\t', index=False)
           sys.exit(0)
       else:
           verb_scores = update_scores(
               verb_scores,
               verb,
               incorrect=True
           )

           print("\033[91mIncorrect, try again.\033[0m")

示例输出

程序输出如下所示:

What is the present nosotros form of hacer?
> hacemos
Correct!

在你看完所有可能的动词后,它将开始浏览你最容易出错的前5个动词

$ python3 ./ask_verb_tense_example.py spanish_verbs.json verb_scores.tsv
found 20 verbs to practice
selected verb:  tener  wrong  100.0 % of the time
What is the preterite tu form of tener?
> tenes
Incorrect, try again.
...

分数档案

您还可以访问名为verb_scores.tsv的动词分数文件,该文件是在用户点击q保存并退出后由程序创建和更新的。通过这种方式,您可以通过将tsv导入某些电子表格软件(例如)来跟踪进度

verb     correct   incorrect  total
hacemos  0         3          3
tiene    1         1          2

相关问题 更多 >