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/wordfreqapp.db
 | 
				
			||||||
app/static/donate-the-author.jpg
 | 
					app/static/donate-the-author.jpg
 | 
				
			||||||
app/static/donate-the-author-hidden.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
 | 
				
			||||||
							
								
								
									
										43
									
								
								app/main.py
								
								
								
								
							
							
						
						
									
										43
									
								
								app/main.py
								
								
								
								
							| 
						 | 
					@ -11,6 +11,7 @@ from Article import *
 | 
				
			||||||
import Yaml
 | 
					import Yaml
 | 
				
			||||||
from user_service import userService
 | 
					from user_service import userService
 | 
				
			||||||
from account_service import accountService
 | 
					from account_service import accountService
 | 
				
			||||||
 | 
					from cloze.create_clozeTest import Essay
 | 
				
			||||||
app = Flask(__name__)
 | 
					app = Flask(__name__)
 | 
				
			||||||
app.secret_key = 'lunch.time!'
 | 
					app.secret_key = 'lunch.time!'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -68,9 +69,10 @@ def mark_word():
 | 
				
			||||||
        for word in request.form.getlist('marked'):
 | 
					        for word in request.form.getlist('marked'):
 | 
				
			||||||
            lst.append((word, 1))
 | 
					            lst.append((word, 1))
 | 
				
			||||||
        d = pickle_idea.merge_frequency(lst, lst_history)
 | 
					        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'))
 | 
					        return redirect(url_for('mainpage'))
 | 
				
			||||||
    else: # 不回应GET请求
 | 
					    else:  # 不回应GET请求
 | 
				
			||||||
        return 'Under construction'
 | 
					        return 'Under construction'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -88,7 +90,8 @@ def mainpage():
 | 
				
			||||||
        d = load_freq_history(path_prefix + 'static/frequency/frequency.p')
 | 
					        d = load_freq_history(path_prefix + 'static/frequency/frequency.p')
 | 
				
			||||||
        lst_history = pickle_idea.dict2lst(d)
 | 
					        lst_history = pickle_idea.dict2lst(d)
 | 
				
			||||||
        d = pickle_idea.merge_frequency(lst, lst_history)
 | 
					        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)
 | 
					        return render_template('mainpage_post.html', lst=lst, yml=Yaml.yml)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    elif request.method == 'GET':  # when we load a html page
 | 
					    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)
 | 
					                               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__':
 | 
					if __name__ == '__main__':
 | 
				
			||||||
    '''
 | 
					    '''
 | 
				
			||||||
    运行程序
 | 
					    运行程序
 | 
				
			||||||
    '''
 | 
					    '''
 | 
				
			||||||
    # app.secret_key = os.urandom(16)
 | 
					 | 
				
			||||||
    # app.run(debug=False, port='6000')
 | 
					 | 
				
			||||||
    app.run(debug=True)
 | 
					    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>
 | 
					    <p><b>阅读文章并回答问题</b></p>
 | 
				
			||||||
    <div id="text-content">{{ today_article|safe }}</div>
 | 
					    <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="ChangeHighlight()" checked/>生词高亮
 | 
				
			||||||
    <input type="checkbox" onclick="onReadClick()" checked/>大声朗读
 | 
					    <input type="checkbox" onclick="onReadClick()" checked/>大声朗读
 | 
				
			||||||
    <input type="checkbox" onclick="onChooseClick()" checked/>划词入库
 | 
					    <input type="checkbox" onclick="onChooseClick()" checked/>划词入库
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,4 @@
 | 
				
			||||||
Flask==1.1.2
 | 
					Flask==2.1.2
 | 
				
			||||||
selenium==3.141.0
 | 
					selenium==3.141.0
 | 
				
			||||||
PyYAML~=6.0
 | 
					PyYAML~=6.0
 | 
				
			||||||
 | 
					nltk==3.7
 | 
				
			||||||
		Loading…
	
		Reference in New Issue