forked from mrlan/EnglishPal
				
			commit
							parent
							
								
									b41e1044bc
								
							
						
					
					
						commit
						f741f84b4d
					
				| 
						 | 
				
			
			@ -22,12 +22,12 @@ def total_number_of_essays():
 | 
			
		|||
    return len(result)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_article_title(s):
 | 
			
		||||
    return s.split('\n')[0]
 | 
			
		||||
def get_article_title(article):
 | 
			
		||||
    return article.split('\n')[0]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_article_body(s):
 | 
			
		||||
    lst = s.split('\n')
 | 
			
		||||
def get_article_body(article):
 | 
			
		||||
    lst = article.split('\n')
 | 
			
		||||
    lst.pop(0)  # remove the first line
 | 
			
		||||
    return '\n'.join(lst)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -111,11 +111,11 @@ def within_range(x, y, r):
 | 
			
		|||
    return x > y and abs(x - y) <= r
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_question_part(s):
 | 
			
		||||
    s = s.strip()
 | 
			
		||||
def get_question_part(article):
 | 
			
		||||
    article = article.strip()
 | 
			
		||||
    result = []
 | 
			
		||||
    flag = 0
 | 
			
		||||
    for line in s.split('\n'):
 | 
			
		||||
    for line in article.split('\n'):
 | 
			
		||||
        line = line.strip()
 | 
			
		||||
        if line == 'QUESTION':
 | 
			
		||||
            result.append(line)
 | 
			
		||||
| 
						 | 
				
			
			@ -127,11 +127,11 @@ def get_question_part(s):
 | 
			
		|||
    return '\n'.join(result)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_answer_part(s):
 | 
			
		||||
    s = s.strip()
 | 
			
		||||
def get_answer_part(article):
 | 
			
		||||
    article = article.strip()
 | 
			
		||||
    result = []
 | 
			
		||||
    flag = 0
 | 
			
		||||
    for line in s.split('\n'):
 | 
			
		||||
    for line in article.split('\n'):
 | 
			
		||||
        line = line.strip()
 | 
			
		||||
        if line == 'ANSWER':
 | 
			
		||||
            flag = 1
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,6 +3,7 @@ import string
 | 
			
		|||
from datetime import datetime, timedelta
 | 
			
		||||
from UseSqlite import InsertQuery, RecordQuery
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def md5(s):
 | 
			
		||||
    '''
 | 
			
		||||
    MD5摘要
 | 
			
		||||
| 
						 | 
				
			
			@ -12,14 +13,16 @@ def md5(s):
 | 
			
		|||
    h = hashlib.md5(s.encode(encoding='utf-8'))
 | 
			
		||||
    return h.hexdigest()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# import model.user after the defination of md5(s) to avoid circular import
 | 
			
		||||
from model.user import get_user_by_username, insert_user, update_password_by_username
 | 
			
		||||
 | 
			
		||||
path_prefix = '/var/www/wordfreq/wordfreq/'
 | 
			
		||||
path_prefix = './'  # comment this line in deployment
 | 
			
		||||
 | 
			
		||||
def verify_pass(newpass,oldpass):
 | 
			
		||||
    if(newpass==oldpass):
 | 
			
		||||
 | 
			
		||||
def verify_pass(new_password, old_password):
 | 
			
		||||
    if new_password == old_password:
 | 
			
		||||
        return True
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -53,7 +56,7 @@ def change_password(username, old_password, new_password):
 | 
			
		|||
    if not verify_user(username, old_password):  # 旧密码错误
 | 
			
		||||
        return False
 | 
			
		||||
    # 将用户名和密码一起加密,以免暴露不同用户的相同密码
 | 
			
		||||
    if verify_pass(new_password,old_password): #新旧密码一致
 | 
			
		||||
    if verify_pass(new_password, old_password):  #新旧密码一致
 | 
			
		||||
        return False
 | 
			
		||||
    update_password_by_username(username, new_password)
 | 
			
		||||
    return True
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -43,7 +43,6 @@ def signup():
 | 
			
		|||
                return jsonify({'status': '1'})
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@accountService.route("/login", methods=['GET', 'POST'])
 | 
			
		||||
def login():
 | 
			
		||||
    '''
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,25 +18,25 @@ def load_record(pickle_fname):
 | 
			
		|||
    return d
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def convert_test_type_to_difficulty_level(d):
 | 
			
		||||
def convert_test_type_to_difficulty_level(words_dict):
 | 
			
		||||
    """
 | 
			
		||||
    对原本的单词库中的单词进行难度评级
 | 
			
		||||
    :param d: 存储了单词库pickle文件中的单词的字典
 | 
			
		||||
    :param words_dict: 存储了单词库pickle文件中的单词的字典
 | 
			
		||||
    :return:
 | 
			
		||||
    """
 | 
			
		||||
    result = {}
 | 
			
		||||
    L = list(d.keys())  # in d, we have test types (e.g., CET4,CET6,BBC) for each word
 | 
			
		||||
    words_lst = list(words_dict.keys())  # in words_dict, we have test types (e.g., CET4,CET6,BBC) for each word
 | 
			
		||||
 | 
			
		||||
    for k in L:
 | 
			
		||||
        if 'CET4' in d[k]:
 | 
			
		||||
    for k in words_lst:
 | 
			
		||||
        if 'CET4' in words_dict[k]:
 | 
			
		||||
            result[k] = 4  # CET4 word has level 4
 | 
			
		||||
        elif 'OXFORD3000' in d[k]:
 | 
			
		||||
        elif 'OXFORD3000' in words_dict[k]:
 | 
			
		||||
            result[k] = 5
 | 
			
		||||
        elif 'CET6' in d[k] or 'GRADUATE' in d[k]:
 | 
			
		||||
        elif 'CET6' in words_dict[k] or 'GRADUATE' in words_dict[k]:
 | 
			
		||||
            result[k] = 6
 | 
			
		||||
        elif 'OXFORD5000' in d[k] or 'IELTS' in d[k]:
 | 
			
		||||
        elif 'OXFORD5000' in words_dict[k] or 'IELTS' in words_dict[k]:
 | 
			
		||||
            result[k] = 7
 | 
			
		||||
        elif 'BBC' in d[k]:
 | 
			
		||||
        elif 'BBC' in words_dict[k]:
 | 
			
		||||
            result[k] = 8
 | 
			
		||||
 | 
			
		||||
    return result  # {'apple': 4, ...}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -63,7 +63,7 @@ def mark_word():
 | 
			
		|||
    '''
 | 
			
		||||
    if request.method == 'POST':
 | 
			
		||||
        d = load_freq_history(path_prefix + 'static/frequency/frequency.p')
 | 
			
		||||
        lst_history = pickle_idea.dict2lst(d)
 | 
			
		||||
        lst_history = pickle_idea.dict_to_lst(d)
 | 
			
		||||
        lst = []
 | 
			
		||||
        for word in request.form.getlist('marked'):
 | 
			
		||||
            lst.append((word, 1))
 | 
			
		||||
| 
						 | 
				
			
			@ -86,7 +86,7 @@ def mainpage():
 | 
			
		|||
        lst = f.get_freq()
 | 
			
		||||
        # save history
 | 
			
		||||
        d = load_freq_history(path_prefix + 'static/frequency/frequency.p')
 | 
			
		||||
        lst_history = pickle_idea.dict2lst(d)
 | 
			
		||||
        lst_history = pickle_idea.dict_to_lst(d)
 | 
			
		||||
        d = pickle_idea.merge_frequency(lst, lst_history)
 | 
			
		||||
        pickle_idea.save_frequency_to_pickle(d, path_prefix + 'static/frequency/frequency.p')
 | 
			
		||||
        return render_template('mainpage_post.html', lst=lst, yml=Yaml.yml)
 | 
			
		||||
| 
						 | 
				
			
			@ -96,7 +96,7 @@ def mainpage():
 | 
			
		|||
        number_of_essays = total_number_of_essays()
 | 
			
		||||
        d = load_freq_history(path_prefix + 'static/frequency/frequency.p')
 | 
			
		||||
        d_len = len(d)
 | 
			
		||||
        lst = sort_in_descending_order(pickle_idea.dict2lst(d))
 | 
			
		||||
        lst = sort_in_descending_order(pickle_idea.dict_to_lst(d))
 | 
			
		||||
        return render_template('mainpage_get.html',
 | 
			
		||||
                               admin_name=ADMIN_NAME,
 | 
			
		||||
                               random_ads=random_ads,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,7 +10,7 @@ import pickle
 | 
			
		|||
from datetime import datetime
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def lst2dict(lst, d):
 | 
			
		||||
def lst_to_dict(lst, d):
 | 
			
		||||
    ''' 
 | 
			
		||||
    Store the information in list lst to dictionary d. 
 | 
			
		||||
    Note: nothing is returned.
 | 
			
		||||
| 
						 | 
				
			
			@ -25,14 +25,14 @@ def lst2dict(lst, d):
 | 
			
		|||
            d[word] += freq
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def dict2lst(d):
 | 
			
		||||
def dict_to_lst(d):
 | 
			
		||||
    return list(d.items())  # a list of (key, value) pairs
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
def merge_frequency(lst1, lst2):
 | 
			
		||||
def merge_frequency(list1, list2):
 | 
			
		||||
    d = {}
 | 
			
		||||
    lst2dict(lst1, d)
 | 
			
		||||
    lst2dict(lst2, d)
 | 
			
		||||
    lst_to_dict(list1, d)
 | 
			
		||||
    lst_to_dict(list2, d)
 | 
			
		||||
    return d
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -54,33 +54,35 @@ def save_frequency_to_pickle(d, pickle_fname):
 | 
			
		|||
    pickle.dump(d2, f)
 | 
			
		||||
    f.close()
 | 
			
		||||
 | 
			
		||||
def unfamiliar(path,word):
 | 
			
		||||
    f = open(path,"rb")
 | 
			
		||||
 | 
			
		||||
def unfamiliar(path, word):
 | 
			
		||||
    f = open(path, "rb")
 | 
			
		||||
    dic = pickle.load(f)
 | 
			
		||||
    dic[word] += [datetime.now().strftime('%Y%m%d%H%M')]
 | 
			
		||||
    fp = open(path,"wb")
 | 
			
		||||
    pickle.dump(dic,fp)
 | 
			
		||||
    fp = open(path, "wb")
 | 
			
		||||
    pickle.dump(dic, fp)
 | 
			
		||||
 | 
			
		||||
def familiar(path,word):
 | 
			
		||||
    f = open(path,"rb")
 | 
			
		||||
 | 
			
		||||
def familiar(path, word):
 | 
			
		||||
    f = open(path, "rb")
 | 
			
		||||
    dic = pickle.load(f)
 | 
			
		||||
    if len(dic[word])>1:
 | 
			
		||||
    if len(dic[word]) > 1:
 | 
			
		||||
        del dic[word][0]
 | 
			
		||||
    else:
 | 
			
		||||
        dic.pop(word)
 | 
			
		||||
    fp = open(path,"wb")
 | 
			
		||||
    pickle.dump(dic,fp)
 | 
			
		||||
    fp = open(path, "wb")
 | 
			
		||||
    pickle.dump(dic, fp)
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
 | 
			
		||||
    lst1 = [('apple',2),  ('banana',1)]
 | 
			
		||||
    d = {}
 | 
			
		||||
    lst2dict(lst1, d) # d will change
 | 
			
		||||
    lst_to_dict(lst1, d) # d will change
 | 
			
		||||
    save_frequency_to_pickle(d, 'frequency.p') # frequency.p is our database
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    lst2 = [('banana',2), ('orange', 4)]
 | 
			
		||||
    d = load_record('frequency.p')
 | 
			
		||||
    lst1 = dict2lst(d)
 | 
			
		||||
    lst1 = dict_to_lst(d)
 | 
			
		||||
    d = merge_frequency(lst2, lst1)
 | 
			
		||||
    print(d)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,6 +11,7 @@
 | 
			
		|||
import pickle
 | 
			
		||||
from datetime import datetime
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def lst2dict(lst, d):
 | 
			
		||||
    ''' 
 | 
			
		||||
    Store the information in list lst to dictionary d. 
 | 
			
		||||
| 
						 | 
				
			
			@ -25,7 +26,8 @@ def lst2dict(lst, d):
 | 
			
		|||
        else:
 | 
			
		||||
            d[word] += dates
 | 
			
		||||
 | 
			
		||||
def deleteRecord(path,word):
 | 
			
		||||
 | 
			
		||||
def deleteRecord(path, word):
 | 
			
		||||
    with open(path, 'rb') as f:
 | 
			
		||||
        db = pickle.load(f)
 | 
			
		||||
    try:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -93,7 +93,7 @@ def familiar(username, word):
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
@userService.route("/<username>/<word>/del", methods=['GET', 'POST'])
 | 
			
		||||
def deleteword(username, word):
 | 
			
		||||
def delete_word(username, word):
 | 
			
		||||
    '''
 | 
			
		||||
    删除单词
 | 
			
		||||
    :param username: 用户名
 | 
			
		||||
| 
						 | 
				
			
			@ -181,6 +181,7 @@ def user_mark_word(username):
 | 
			
		|||
    else:
 | 
			
		||||
        return 'Under construction'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_time():
 | 
			
		||||
    '''
 | 
			
		||||
    获取当前时间
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,7 +9,8 @@ import operator
 | 
			
		|||
import os, sys  # 引入模块sys,因为我要用里面的sys.argv列表中的信息来读取命令行参数。
 | 
			
		||||
import pickle_idea
 | 
			
		||||
 | 
			
		||||
def freq(fruit):
 | 
			
		||||
 | 
			
		||||
def freq(s):
 | 
			
		||||
    '''
 | 
			
		||||
    功能: 把字符串转成列表。 目的是得到每个单词的频率。
 | 
			
		||||
    输入: 字符串
 | 
			
		||||
| 
						 | 
				
			
			@ -18,27 +19,26 @@ def freq(fruit):
 | 
			
		|||
    '''
 | 
			
		||||
 | 
			
		||||
    result = []
 | 
			
		||||
    
 | 
			
		||||
    fruit = fruit.lower() # 字母转小写
 | 
			
		||||
    flst = fruit.split()  # 字符串转成list
 | 
			
		||||
    c = collections.Counter(flst)
 | 
			
		||||
    s = s.lower()  # 字母转小写
 | 
			
		||||
    word_lst = s.split()  # 字符串转成list
 | 
			
		||||
    c = collections.Counter(word_lst)
 | 
			
		||||
    result = c.most_common()
 | 
			
		||||
    return result
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def youdao_link(s): # 有道链接
 | 
			
		||||
    link = 'http://youdao.com/w/eng/' + s + '/#keyfrom=dict2.index'# 网址
 | 
			
		||||
def youdao_link(word):  # 有道链接
 | 
			
		||||
    link = 'http://youdao.com/w/eng/' + word + '/#keyfrom=dict2.index'  # 网址
 | 
			
		||||
    return link
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def file2str(fname):#文件转字符
 | 
			
		||||
    f = open(fname) #打开
 | 
			
		||||
    s = f.read()    #读取
 | 
			
		||||
    f.close()       #关闭
 | 
			
		||||
    return s
 | 
			
		||||
def file_to_str(f_name):  # 文件转字符
 | 
			
		||||
    f = open(f_name)  # 打开
 | 
			
		||||
    f_str = f.read()  # 读取
 | 
			
		||||
    f.close()  # 关闭
 | 
			
		||||
    return f_str
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def remove_punctuation(s): # 这里是s是形参 (parameter)。函数被调用时才给s赋值。
 | 
			
		||||
def remove_punctuation(s):  # 这里是words_text是形参 (parameter)。函数被调用时才给words_text赋值。
 | 
			
		||||
    special_characters = '\_©~<=>+-/[]*&$%^@.,?!:;#()"“”—‘’{}|'  # 把里面的字符都去掉
 | 
			
		||||
    for c in special_characters:
 | 
			
		||||
        s = s.replace(c, ' ')  # 防止出现把 apple,apple 移掉逗号后变成 appleapple 情况
 | 
			
		||||
| 
						 | 
				
			
			@ -47,25 +47,25 @@ def remove_punctuation(s): # 这里是s是形参 (parameter)。函数被调用
 | 
			
		|||
 | 
			
		||||
    if '\'' in s:
 | 
			
		||||
        n = len(s)
 | 
			
		||||
        t = '' # 用来收集我需要保留的字符
 | 
			
		||||
        characters = ''  # 用来收集我需要保留的字符
 | 
			
		||||
        for i in range(n):  # 只有单引号前后都有英文字符,才保留
 | 
			
		||||
            if s[i] == '\'':
 | 
			
		||||
                i_is_ok = i - 1 >= 0 and i + 1 < n
 | 
			
		||||
                if i_is_ok and s[i-1] in string.ascii_letters and s[i+1] in string.ascii_letters:
 | 
			
		||||
                    t += s[i]
 | 
			
		||||
                if i_is_ok and s[i - 1] in string.ascii_letters and s[i + 1] in string.ascii_letters:
 | 
			
		||||
                    characters += s[i]
 | 
			
		||||
            else:
 | 
			
		||||
                t += s[i]
 | 
			
		||||
        return t
 | 
			
		||||
                characters += s[i]
 | 
			
		||||
        return characters
 | 
			
		||||
    else:
 | 
			
		||||
        return s
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def sort_in_descending_order(lst):# 单词按频率降序排列
 | 
			
		||||
def sort_in_descending_order(lst):  # 单词按频率降序排列
 | 
			
		||||
    lst2 = sorted(lst, reverse=True, key=lambda x: (x[1], x[0]))
 | 
			
		||||
    return lst2
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def sort_in_ascending_order(lst):# 单词按频率降序排列
 | 
			
		||||
def sort_in_ascending_order(lst):  # 单词按频率降序排列
 | 
			
		||||
    lst2 = sorted(lst, reverse=False, key=lambda x: (x[1], x[0]))
 | 
			
		||||
    return lst2
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -93,15 +93,15 @@ if __name__ == '__main__':
 | 
			
		|||
        s = input()
 | 
			
		||||
    elif num == 2:  # 从文件读入字符串
 | 
			
		||||
        fname = sys.argv[1]
 | 
			
		||||
        s = file2str(fname)
 | 
			
		||||
        s = file_to_str(fname)
 | 
			
		||||
    else:
 | 
			
		||||
        print('I can accept at most 2 arguments.')
 | 
			
		||||
        sys.exit()# 结束程序运行, 下面的代码不会被执行了。
 | 
			
		||||
        sys.exit()  # 结束程序运行, 下面的代码不会被执行了。
 | 
			
		||||
 | 
			
		||||
    s = remove_punctuation(s)  # 这里是s是实参(argument),里面有值
 | 
			
		||||
    L = freq(s)
 | 
			
		||||
    for x in sort_in_descending_order(L):
 | 
			
		||||
        print('%s\t%d\t%s' % (x[0], x[1], youdao_link(x[0])))#函数导出
 | 
			
		||||
        print('%s\t%d\t%s' % (x[0], x[1], youdao_link(x[0])))  # 函数导出
 | 
			
		||||
 | 
			
		||||
    # 把频率的结果放result.html中
 | 
			
		||||
    make_html_page(sort_in_descending_order(L), 'result.html')
 | 
			
		||||
| 
						 | 
				
			
			@ -112,12 +112,9 @@ if __name__ == '__main__':
 | 
			
		|||
    else:
 | 
			
		||||
        d = {}
 | 
			
		||||
 | 
			
		||||
    print(sort_in_descending_order(pickle_idea.dict2lst(d)))
 | 
			
		||||
    print(sort_in_descending_order(pickle_idea.dict_to_lst(d)))
 | 
			
		||||
 | 
			
		||||
    # 合并频率
 | 
			
		||||
    lst_history = pickle_idea.dict2lst(d)
 | 
			
		||||
    lst_history = pickle_idea.dict_to_lst(d)
 | 
			
		||||
    d = pickle_idea.merge_frequency(L, lst_history)
 | 
			
		||||
    pickle_idea.save_frequency_to_pickle(d, 'frequency.p')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
Flask==1.1.2
 | 
			
		||||
Flask==2.2.3
 | 
			
		||||
selenium==3.141.0
 | 
			
		||||
PyYAML~=6.0
 | 
			
		||||
pony==0.7.16
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue