Compare commits
	
		
			8 Commits 
		
	
	
		
			master
			...
			Bug428-Lou
		
	
	| Author | SHA1 | Date | 
|---|---|---|
|  | e241c47744 | |
|  | 9d5175d0a6 | |
|  | 0117470ab5 | |
|  | 241708af9c | |
|  | 4870772f1f | |
|  | f214838cdd | |
|  | 3e554c61c9 | |
|  | 1e6c4c6da0 | 
|  | @ -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__ | ||||
|  | @ -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 | ||||
							
								
								
									
										41
									
								
								app/main.py
								
								
								
								
							
							
						
						
									
										41
									
								
								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,7 +69,8 @@ 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请求 | ||||
|         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')) | ||||
|  |  | |||
|  | @ -0,0 +1,56 @@ | |||
| <!DOCTYPE html> | ||||
| <html lang="en"> | ||||
| <head> | ||||
|     <meta charset="UTF-8"> | ||||
|     <title>clozeTest</title> | ||||
|     <style> | ||||
|         pre { | ||||
|             font-size: large; | ||||
|             white-space: pre-wrap; /*css-3*/ | ||||
|             background-color: aliceblue; | ||||
|             word-wrap: break-word; /*InternetExplorer5.5+*/ | ||||
|         } | ||||
|         #button{ | ||||
|             text-align: center; | ||||
|         } | ||||
| 
 | ||||
|         #content{ | ||||
|             background-color: azure; | ||||
|             margin: auto; | ||||
|         } | ||||
|     </style> | ||||
|      | ||||
| </head> | ||||
| <body> | ||||
|      | ||||
| <p style="color: red; font-size: 20px">{{ msg }}</p> | ||||
| {% set ascll = ['A','B','C','D'] %} | ||||
| <pre>{{ essay._essay }}</pre> | ||||
| <form action="/gocloze" id="button" method="GET"> | ||||
|     <input type="submit" style="background-color: aquamarine; width: 100px; height: 40px" value="下一题"> | ||||
| </form> | ||||
| <form action="/" id="button"> | ||||
|     <input type="submit" style="background-color: aquamarine; width: 100px; height: 40px" value="返回"> | ||||
| </form> | ||||
| <p style="color: red; font-size: 20px">请输入abcd或其大写</p> | ||||
| <p style="color: red; font-size: 20px">tip:异常输入会被自动清除</p> | ||||
| <form id="content" action="/gocloze" method="POST" > | ||||
|     <tr> | ||||
| 
 | ||||
|         {% for question in essay._questions %} | ||||
|             <td> | ||||
|                 <p><input type="text" onkeyup="this.value=this.value.replace(/[^a-dA-D]/g,'')" maxlength="1" name="answer{{ loop.index }}" placeholder="请输入答案" > | ||||
|                     {{ loop.index }}. | ||||
|                     {% for q in question %} | ||||
|                         {{ ascll[loop.index0] }}. | ||||
|                         {{ q }} | ||||
|                     {% endfor %} | ||||
|                 </p> | ||||
|             <p style="color: red">{{ answers[loop.index0] }}</p> | ||||
|             </td> | ||||
|         {% endfor %} | ||||
|     <p><input type="submit" value="提交" style="background-color: cornsilk; width: 100px; height: 40px"></p> | ||||
|     </tr> | ||||
| </form> | ||||
| </body> | ||||
| </html> | ||||
|  | @ -32,6 +32,10 @@ | |||
|     <p><b>阅读文章并回答问题</b></p> | ||||
|     <div id="text-content">{{ today_article|safe }}</div> | ||||
| 
 | ||||
|     <form action="/gocloze" method="GET"> | ||||
|         <input type="submit" style.display="block" value="去做完型填空"> | ||||
|     </form> | ||||
| 
 | ||||
|     <input type="checkbox" onclick="ChangeHighlight()" checked/>生词高亮 | ||||
|     <input type="checkbox" onclick="onReadClick()" checked/>大声朗读 | ||||
|     <input type="checkbox" onclick="onChooseClick()" checked/>划词入库 | ||||
|  |  | |||
|  | @ -1,3 +1,4 @@ | |||
| Flask==1.1.2 | ||||
| Flask==2.1.2 | ||||
| selenium==3.141.0 | ||||
| PyYAML~=6.0 | ||||
| nltk==3.7 | ||||
		Loading…
	
		Reference in New Issue