Skip to content

出题引擎

本页介绍自动出题引擎的设计和实现。

题型设计

同一个字题型

四个选项考察同一个字的不同义项。

数据要求:

  • 该字至少有 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()

基于 MIT 许可发布