我应该如何在Python中制作我的西班牙语动词结合学习工具?

时间:2017-04-22 23:44:27

标签: python dictionary random

感谢您抽出时间查看我的帖子,我现在是西班牙语课程的学生,我想为学生制作一个学习动词变形的学习工具。在与代码学院顾问交谈后,他建议使用3级词典,您可以在我的代码中看到,我不熟悉这些词典并需要帮助!他简短地进行了随机化,他的转变结束了。以下是我在游戏中想要的主要内容

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

  2. 让程序询问用户输入并提出问题,例如(动词)的(紧张)(文章)形式是什么?

  3. 示例1:目前的哟形式是什么?正确答案:Hago

    示例2:目前的tu形式是什么?正确答案:Haces

    示例3:什么是hater的preterite yo形式?正确答案:Hice

    1. 让程序回复,说“正确!”或者“错了!”
    2. 这是我目前的词典

      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电话或聊聊此事,我将非常感激,我会非常愿意!

      再次感谢阅读。

2 个答案:

答案 0 :(得分:3)

TL;DR

我在 Windmill 的代码中添加了一些功能 - 保存的动词分数计数器有助于优先考虑低分变位,一些跳过或退出的选项,我将 dict 作为 json 保存在文件中,我还添加了一些建议网页抓取动词。

学习工具

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

用例

请注意,我在搜索相同的一般用例时遇到了这篇文章。

即,“我想学习X语言的动词,并通过一个小程序进行改进。”

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

我还考虑过您需要一个动词变位研究工具的事实,我认为这就是问题通常所暗示的 - 该工具的使用不仅限于西班牙语。从我的问题中我了解到学习工具应该可以帮助您学习 - 例如在您学习时根据您的调整,并始终优先考虑您出错的单词,并且应该很容易理解它的工作原理。

针对弱点的设计

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

* 添加有关动词是规则还是不规则的信息可能是一个想法。这样我们就可以在理解了某种时态的规则形式后优先考虑不规则动词。这里的“好”可以由工具的用户启发式地或经验地决定,作为研究问题。两者都取决于用户的需求和工具存储的信息。

获取数据

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

您可以选择手动输入数据,这要么需要大量的乏味和耐心,要么自动输入,如果您不了解网页抓取,则需要愿意学习。我建议您在 python 中查找 webscraping,这样您就可以学习构建获取动词所需的基本命令,例如请求和 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 或 tsv 并使用类似 Pandas 的东西来加载文件。

程序操作和界面

当前界面是基于终端的。如果您想更进一步,可以使用 tkinter 或 wxpython 之类的工具来构建 GUI。

启动程序

从终端启动程序:

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

操作

您可以使用的操作是

  1. 输入动词并按回车键检查您是否正确
  • 通过运行这个命令,你可以是正确的也可以是不正确的

  1. 选择一个选项并按回车

关于选项,您可以选择

  • 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

答案 1 :(得分:1)

我有一些时间,所以这里有一些代码可以帮助你开始。它首先创建可能的文章,动词和时态的列表(这些可以使用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.")