出题引擎
本页介绍自动出题引擎的设计和实现。
题型设计
同一个字题型
四个选项考察同一个字的不同义项。
数据要求:
- 该字至少有 2 个不同义项
- 每个义项至少关联 2 个短句
不同字题型
四个选项考察不同的字。
数据要求:
- 至少有 4 个不同的字
- 每个字至少有 1 个义项
配置结构
typescript
interface ExamConfig {
questionCount: number // 题目数量
questionType: 'same-character' | 'different-characters'
answerType: 'find-different' | 'find-same'
optionsCount: 3 | 4 // 选项数量
sentencesPerOption: number // 每选项短句数
correctAnswer?: 'A' | 'B' | 'C' | 'D' | 'random'
targetCharacters?: string[] // 优先考察的字
scope: {
libraryId?: string
collectionId?: string
articleId?: string
}
}生成算法
同一个字题型
typescript
function generateSameCharQuestion(config: ExamConfig): Question {
// 1. 选择字符(优先使用 targetCharacters)
const character = selectCharacter(config)
// 2. 获取该字的所有义项
const definitions = getDefinitionsByChar(character)
// 3. 选择正确答案的义项
const correctDef = selectCorrectDefinition(definitions)
// 4. 选择干扰项的义项
const wrongDefs = selectWrongDefinitions(definitions, correctDef)
// 5. 为每个义项选择短句
const options = [correctDef, ...wrongDefs].map(def => ({
definition: def,
sentences: selectSentences(def, config.sentencesPerOption)
}))
// 6. 打乱选项顺序(除非指定了正确答案位置)
return assembleQuestion(options, config)
}不同字题型
typescript
function generateDiffCharQuestion(config: ExamConfig): Question {
// 1. 选择多个不同的字符
const characters = selectMultipleCharacters(config)
// 2. 为每个字符选择义项
const charDefPairs = characters.map(char => ({
character: char,
definition: selectDefinition(char)
}))
// 3. 确定正确答案(义项不同的那个)
const { correct, wrong } = determineAnswer(charDefPairs)
// 4. 为每个选项选择短句
const options = [correct, ...wrong].map(pair => ({
...pair,
sentences: selectSentences(pair.definition, config.sentencesPerOption)
}))
return assembleQuestion(options, config)
}智能推荐
typescript
function analyzeAndRecommend(): Recommendation {
const definitions = getAllDefinitions()
const charGroups = groupByCharacter(definitions)
// 统计多义项字符
const multiDefChars = charGroups.filter(g => g.definitions.length >= 2)
if (multiDefChars.length >= 10) {
return {
type: 'same-character',
reason: '有足够的多义项字符,推荐使用「同一个字」题型'
}
} else {
return {
type: 'different-characters',
reason: '多义项字符较少,推荐使用「不同字」题型'
}
}
}数据诊断
typescript
interface DiagnosticResult {
totalDefinitions: number
totalCharacters: number
multiDefCharacters: number // 多义项字符数
orphanDefinitions: number // 孤立义项数
duplicateDefinitions: number // 重复义项数
issues: DiagnosticIssue[]
}
function diagnose(): DiagnosticResult {
// 检查各种数据质量问题
}使用示例
typescript
import { examGenerator } from '@/services/examGenerator'
// 生成题目
const questions = examGenerator.generate({
questionCount: 10,
questionType: 'same-character',
answerType: 'find-different',
optionsCount: 4,
sentencesPerOption: 2
})
// 智能推荐
const recommendation = examGenerator.recommend()
// 数据诊断
const diagnostic = examGenerator.diagnose()