diff --git a/.gitignore b/.gitignore index 413c71c..09cd91c 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,5 @@ app/static/frequency/frequency.p app/static/wordfreqapp.db app/static/donate-the-author.jpg app/static/donate-the-author-hidden.jpg + +**/__pycache__ \ No newline at end of file diff --git a/app/cloze/__init__.py b/app/cloze/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/cloze/create_clozeTest.py b/app/cloze/create_clozeTest.py new file mode 100644 index 0000000..fb6021e --- /dev/null +++ b/app/cloze/create_clozeTest.py @@ -0,0 +1,127 @@ +import random +import sqlite3 +import re +from nltk.corpus import wordnet as wn + + +class Essay: + def __init__(self): + self._article_id = 0 + self._essay = None + self._difficulty = None + self._answers = None + self._questions = None + pass + + @property + def article_id(self): + pass + + @article_id.setter + def article_id(self, article_id): + self._article_id = article_id + self.find_essay_in_database(self._article_id) + + # 获取数据库中的文章和等级 + def find_essay_in_database(self, id): + try: + # 连接数据库 + conn = sqlite3.connect("static/wordfreqapp.db") + # 创建游标 + cursor = conn.cursor() + cursor.execute( + "select text,level from article where article_id = "+str(id)) + results = cursor.fetchall() + conn.commit() + cursor.close() + conn.close() + self._essay = results[0][0] + self._difficulty = results[0][1] + return results + except Exception as e: + print(e) + + # 将文章分割成单词列表 + def split_essay_to_word(self): + article = "".join(self._essay) + words = re.split(r"\b[\.,\s\n\r\n\$\']+?\b", article) + word_list = [word.lower() for word in words] + return word_list + + # 从数据库中查找和文章难度相同的单词 + def find_same_difficulty_words(self): + result_list = [] + try: + # 连接数据库 + conn = sqlite3.connect("static/wordfreqapp.db") + # 创建游标 + cursor = conn.cursor() + cursor.execute( + "select word from words where difficulty = " + str(self._difficulty)) + results = cursor.fetchall() + conn.commit() + cursor.close() + conn.close() + for result in results: + for res in result: + result_list.append(res) + return result_list + except Exception as e: + print(e) + + # 获取单词的近义词 + def get_word_synsets(self, word): + synsets_set = wn.synsets(word) + synset_list = [] + for synset in synsets_set: + synset_list.append(synset.name().split(".")[0]) + return synset_list + + # 生成完形填空 + def create_clozeTest(self, essay): + essay.article_id = self._article_id + word = [] # 存放文章中含有的与文章难度相同的单词 + answers = [] # 存放正确答案 + questions = [] # 存放题目 + + database_words = essay.find_same_difficulty_words() + essay_words = essay.split_essay_to_word() + # 寻找文章中与文章难度相同的单词存入word[]中 + for essay_word in essay_words: + if database_words.__contains__(essay_word) and essay_word not in word: + word.append(essay_word) + # 给出因文章内容太少的问题导致题目少于10个的情况 + if len(word) <= 10: + answers = word + else: # 将找出来的单词作为正确答案存入answers[]中 + for i in range(0, 10): + w = word[random.randint(0, len(word) - 1)] + if not answers.__contains__(w): + answers.append(w) + + self._answers = answers + # 用题号来替换文章中的单词 + No = 1 + for answer in answers: + questions.append(list(answer.split(","))) + self._essay = self._essay.replace(answer, '('+str(No)+')____', 1) + No += 1 + # 生成每道题目的四个选项 + for question in questions: + synset = list(set(essay.get_word_synsets(question[0]))) + if len(synset) == 0 or len(synset) == 1: + question.append(word[random.randint(0, len(word) - 1)]) + else: + syn = synset[random.randint(0, len(synset) - 1)] + while (syn == question[0]): + syn = synset[random.randint(0, len(synset) - 1)] + question.append(syn) + + while len(question) < 4: + add_word = word[random.randint(0, len(word) - 1)] + while question.__contains__(add_word): + add_word = word[random.randint(0, len(word) - 1)] + question.append(add_word) + random.shuffle(question) + + self._questions = questions \ No newline at end of file diff --git a/app/main.py b/app/main.py index d903bf4..bc3ce1d 100644 --- a/app/main.py +++ b/app/main.py @@ -11,6 +11,7 @@ from Article import * import Yaml from user_service import userService from account_service import accountService +from cloze.create_clozeTest import Essay app = Flask(__name__) app.secret_key = 'lunch.time!' @@ -68,9 +69,10 @@ def mark_word(): for word in request.form.getlist('marked'): lst.append((word, 1)) d = pickle_idea.merge_frequency(lst, lst_history) - pickle_idea.save_frequency_to_pickle(d, path_prefix + 'static/frequency/frequency.p') + pickle_idea.save_frequency_to_pickle( + d, path_prefix + 'static/frequency/frequency.p') return redirect(url_for('mainpage')) - else: # 不回应GET请求 + else: # 不回应GET请求 return 'Under construction' @@ -88,7 +90,8 @@ def mainpage(): d = load_freq_history(path_prefix + 'static/frequency/frequency.p') lst_history = pickle_idea.dict2lst(d) d = pickle_idea.merge_frequency(lst, lst_history) - pickle_idea.save_frequency_to_pickle(d, path_prefix + 'static/frequency/frequency.p') + pickle_idea.save_frequency_to_pickle( + d, path_prefix + 'static/frequency/frequency.p') return render_template('mainpage_post.html', lst=lst, yml=Yaml.yml) elif request.method == 'GET': # when we load a html page @@ -101,14 +104,38 @@ def mainpage(): d_len=d_len, lst=lst, yml=Yaml.yml) +essay = Essay() + + +@app.route('/gocloze', methods=['GET', 'POST']) +def go_ClozeTest(): + ''' + 根据GET或POST方法来分别返回答题前后的完型填空界面 + :return: 完型填空界面 + ''' + if request.method == 'GET': + essay._article_id += 1 + essay.create_clozeTest(essay) + + return render_template('clozeTest.html', essay=essay, answers=None) + if request.method == 'POST': + score = 0 + # submit_answers = [] + questions = essay._questions + answers = essay._answers + + for i in range(0, len(answers)): + ans = request.form.get('answer' + str(i+1)) + if ans: + ans = ans.upper() + no = ord(ans)-ord('A') + if questions[i][no] == answers[i]: + score += 10 + return render_template('clozeTest.html', essay=essay, msg=f'你的分数是: {score}', answers=answers) + if __name__ == '__main__': ''' 运行程序 ''' - # app.secret_key = os.urandom(16) - # app.run(debug=False, port='6000') app.run(debug=True) - # app.run(debug=True, port='6000') - # app.run(host='0.0.0.0', debug=True, port='6000') - # print(mod5('123')) diff --git a/app/templates/clozeTest.html b/app/templates/clozeTest.html new file mode 100644 index 0000000..52a4f44 --- /dev/null +++ b/app/templates/clozeTest.html @@ -0,0 +1,56 @@ + + + + + clozeTest + + + + + +

{{ msg }}

+{% set ascll = ['A','B','C','D'] %} +
{{ essay._essay }}
+
+ +
+
+ +
+

请输入abcd或其大写

+

tip:异常输入会被自动清除

+
+ + + {% for question in essay._questions %} + +

+ {{ loop.index }}. + {% for q in question %} + {{ ascll[loop.index0] }}. + {{ q }} + {% endfor %} +

+

{{ answers[loop.index0] }}

+ + {% endfor %} +

+ +
+ + \ No newline at end of file diff --git a/app/templates/userpage_get.html b/app/templates/userpage_get.html index 19542c1..bbf2107 100644 --- a/app/templates/userpage_get.html +++ b/app/templates/userpage_get.html @@ -32,6 +32,10 @@

阅读文章并回答问题

{{ today_article|safe }}
+
+ +
+ 生词高亮 大声朗读 划词入库 diff --git a/requirements.txt b/requirements.txt index 2746a3b..fcb5910 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ -Flask==1.1.2 +Flask==2.1.2 selenium==3.141.0 PyYAML~=6.0 +nltk==3.7 \ No newline at end of file