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
 | 
			
		||||
							
								
								
									
										43
									
								
								app/main.py
								
								
								
								
							
							
						
						
									
										43
									
								
								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'))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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