cefr-analyzer
Version:
分析英文文本中各CEFR级别(A1-C2)单词的数量
118 lines (97 loc) • 3.07 kB
text/typescript
import { CEFRLevel, IVocabularyItem, PartOfSpeech } from '../types';
import vocabularyData from './dict';
/**
* 词汇表管理类
* 提供加载和查询CEFR词汇的功能
*/
export class VocabularyManager {
private vocabularyMap: Map<string, IVocabularyItem[]> = new Map();
private initialized = false;
/**
* 初始化词汇表
* 将词汇数据加载到内存中,并按单词建立索引
*/
public initialize(): void {
if (this.initialized) {
return;
}
// 将词汇表数据转换为Map结构,便于快速查找
const vocabData = vocabularyData as IVocabularyItem[];
vocabData.forEach(item => {
const word = item.word.toLowerCase();
if (!this.vocabularyMap.has(word)) {
this.vocabularyMap.set(word, []);
}
this.vocabularyMap.get(word)?.push(item);
});
this.initialized = true;
}
/**
* 查询单词的CEFR级别
* @param word 要查询的单词
* @param pos 词性(可选)
* @returns 单词的CEFR级别,如果未找到则返回undefined
*/
public getCEFRLevel(word: string, pos?: PartOfSpeech): CEFRLevel | undefined {
if (!this.initialized) {
this.initialize();
}
const normalizedWord = word.toLowerCase();
const entries = this.vocabularyMap.get(normalizedWord);
if (!entries || entries.length === 0) {
return undefined;
}
// 如果指定了词性,则查找匹配词性的条目
if (pos) {
const matchedEntry = entries.find(entry => entry.pos === pos);
return matchedEntry?.cefr;
}
// 如果没有指定词性,返回最低级别的CEFR
const levels: CEFRLevel[] = ['a1', 'a2', 'b1', 'b2', 'c1', 'c2'];
let lowestLevel: CEFRLevel | undefined;
for (const entry of entries) {
const currentLevelIndex = levels.indexOf(entry.cefr);
const lowestLevelIndex = lowestLevel ? levels.indexOf(lowestLevel) : Infinity;
if (currentLevelIndex < lowestLevelIndex) {
lowestLevel = entry.cefr;
}
}
return lowestLevel;
}
/**
* 获取单词的所有CEFR级别和词性信息
* @param word 要查询的单词
* @returns 单词的所有CEFR级别和词性信息
*/
public getWordInfo(word: string): IVocabularyItem[] {
if (!this.initialized) {
this.initialize();
}
const normalizedWord = word.toLowerCase();
return this.vocabularyMap.get(normalizedWord) || [];
}
/**
* 检查单词是否在词汇表中
* @param word 要检查的单词
* @returns 是否在词汇表中
*/
public hasWord(word: string): boolean {
if (!this.initialized) {
this.initialize();
}
const normalizedWord = word.toLowerCase();
return this.vocabularyMap.has(normalizedWord);
}
/**
* 获取词汇表中的单词总数
* @returns 单词总数
*/
public getTotalWords(): number {
if (!this.initialized) {
this.initialize();
}
return this.vocabularyMap.size;
}
}
// 导出单例实例
export const vocabularyManager = new VocabularyManager();