forked from mrlan/EnglishPal
				
			[IMPROVE]:create_clozeTest.py:生成完型填空
							parent
							
								
									3e554c61c9
								
							
						
					
					
						commit
						f214838cdd
					
				|  | @ -0,0 +1,122 @@ | ||||||
|  | import random | ||||||
|  | import sqlite3,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() | ||||||
|  |         for essay_word in essay_words: | ||||||
|  |             if database_words.__contains__(essay_word) and essay_word not in word: | ||||||
|  |                 word.append(essay_word) | ||||||
|  | 
 | ||||||
|  |         if len(word) <= 10: | ||||||
|  |             answers = word | ||||||
|  |         else: | ||||||
|  |             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 | ||||||
|  | @ -1,3 +1,4 @@ | ||||||
| Flask==2.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