from WordFreq import WordFreq from wordfreqCMD import youdao_link, sort_in_descending_order from UseSqlite import InsertQuery, RecordQuery import pickle_idea, pickle_idea2 import os import random, glob import hashlib from datetime import datetime from flask import Flask, request, redirect, render_template, url_for, session, abort, flash, get_flashed_messages from difficulty import get_difficulty_level, text_difficulty_level, user_difficulty_level path_prefix = '/var/www/wordfreq/wordfreq/' path_prefix = './' # comment this line in deployment def total_number_of_essays(): rq = RecordQuery(path_prefix + 'static/wordfreqapp.db') rq.instructions("SELECT * FROM article") rq.do() result = rq.get_results() return len(result) def get_article_title(s): return s.split('\n')[0] def get_article_body(s): lst = s.split('\n') lst.pop(0) # remove the first line return '\n'.join(lst) def get_today_article(user_word_list, articleID): rq = RecordQuery(path_prefix + 'static/wordfreqapp.db') if articleID == None: rq.instructions("SELECT * FROM article") else: rq.instructions('SELECT * FROM article WHERE article_id=%d' % (articleID)) rq.do() result = rq.get_results() random.shuffle(result) # Choose article according to reader's level d1 = load_freq_history(path_prefix + 'static/frequency/frequency.p') d2 = load_freq_history(path_prefix + 'static/words_and_tests.p') d3 = get_difficulty_level(d1, d2) d = {} d_user = load_freq_history(user_word_list) user_level = user_difficulty_level(d_user, d3) # more consideration as user's behaviour is dynamic. Time factor should be considered. random.shuffle(result) # shuffle list d = random.choice(result) text_level = text_difficulty_level(d['text'], d3) if articleID == None: # print('result = ', len(result), sep=' ') p = False for reading in result: text_level = text_difficulty_level(reading['text'], d3) factor = random.gauss(0.8, 0.1) # a number drawn from Gaussian distribution with a mean of 0.8 and a stand deviation of 1 if within_range(text_level, user_level, (8.0 - user_level) * factor): list = session.get('articleIdList') if list == None: d = reading list = [reading['article_id']] session['articleIdList'] = list p = True break exist = False for i in list: if reading['article_id'] == i: exist = True break if exist == False: d = reading list.append(reading['article_id']) session['articleIdList']=list p = True break if p == False: session['articleIdList'] = None p = True while p: for reading in result: text_level = text_difficulty_level(reading['text'], d3) factor = random.gauss(0.8, 0.1) # a number drawn from Gaussian distribution with a mean of 0.8 and a stand deviation of 1 if within_range(text_level, user_level, (8.0 - user_level) * factor): if reading['article_id'] != session['prearticleID']: d = reading p = False ''' 测试代码: print(session['articleIdList']) print(session['prearticleID'], d['article_id'], sep=' ') 问题描述:选择下一篇文章时,由于没有考虑选择文章时会重复选择当前文章,可能会导致重复进入某一篇文章 解决方法:选择下一篇文章时,将选择的文章ID和当前文章ID比较,若重复则换一个 进一步优化: 问题描述:利用上述方法可以满足不重复进入某一篇文章,但是可能两篇文章会反复出现 解决方法:记录一个队列,用来保存出现过的文章ID 选择文章时,若文章Id出现在队列中,则放弃; 若都出现过,则清空队列,随机选择一个不与当前文章重复的文章 ''' s = '' % ( user_level, text_level) s += '

Article added on: %s

' % (d['date']) s += '
' article_title = get_article_title(d['text']) article_body = get_article_body(d['text']) s += '

%s

' % (article_title) s += '

%s

' % (article_body) s += '

%s

' % (d['source']) s += '

%s

' % (get_question_part(d['question'])) s = s.replace('\n', '
') s += '%s' % (get_answer_part(d['question'])) s += '
' session['articleID'] = d['article_id'] return s def load_freq_history(path): d = {} if os.path.exists(path): d = pickle_idea.load_record(path) return d def within_range(x, y, r): return x > y and abs(x - y) <= r def get_question_part(s): s = s.strip() result = [] flag = 0 for line in s.split('\n'): line = line.strip() if line == 'QUESTION': result.append(line) flag = 1 elif line == 'ANSWER': flag = 0 elif flag == 1: result.append(line) return '\n'.join(result) def get_answer_part(s): s = s.strip() result = [] flag = 0 for line in s.split('\n'): line = line.strip() if line == 'ANSWER': flag = 1 elif flag == 1: result.append(line) # https://css-tricks.com/snippets/javascript/showhide-element/ js = ''' ''' html_code = js html_code += '\n' html_code += '\n' html_code += '\n' % ('\n'.join(result)) return html_code