
簡介CFA核心詞匯.pdf是一份面向CFA考生及金融從業(yè)者的專業(yè)術語整理文檔系統(tǒng)收錄金融、會計、投資、證券、保險等領域的核心詞匯內(nèi)容覆蓋從基礎概念到實務應用。文檔按字母順序編排每個詞條均附中文對照與詳細解釋例如Accelerated Depreciation加快折舊、Accounts Receivable應收賬款、Agency Problem代理問題等既有概念定義又有應用示例便于理解記憶和考前速查。資源為單個PDF文件體積僅3.29MB攜帶便捷且排版清晰適合在電腦或移動設備上隨時查閱。目前已有730人學習使用說明對備考金融證書或提升專業(yè)英語確有幫助。這些詞匯不只對應考試也常見于財報、研報和實際業(yè)務場景掌握后能顯著加快英文資料的閱讀速度并為后續(xù)學習CFA其他科目打下扎實基礎切實提升備考效率。1. 拿到 CFA 詞匯 PDF 之后工程師先做文本清洗一份《CFA核心詞匯.pdf》在大多數(shù)考生手里是背誦材料但在工程視角里它是一個未經(jīng)治理的文本數(shù)據(jù)源。CFA 官方教材本身用詞非??酥迫Ф鄠€核心術語分布在道德、數(shù)量、經(jīng)濟學、財報分析、公司金融、權益、固收、衍生品、另類投資和組合管理十個學科里PDF 格式意味著你沒法直接grep、沒法條件篩選、沒法按章節(jié)做詞頻統(tǒng)計。第一次用 Python 打開這類 PDF 時常見的挫敗感是表格邊界錯亂、換行符把術語攔腰截斷、英中對照列對不齊。把這份 PDF 轉成可查詢的 CSV 或 SQLite 庫并不是為了炫技而是為了兩個實際目標一是能在命令行里按學科、按首字母、按詞頻過濾詞匯二是能二次加工成 Anki 卡組、自測問卷或知識圖譜。本文按「提取 → 清洗 → 結構化 → 復用」這條路徑展開所有代碼建議直接跑一遍你會看到從 PDF 里的半結構化文本到干凈術語表的完整過程。適合想用程序化方式吃透 CFA 詞匯的開發(fā)者也適合做 NLP 語料預處理的人參考——PDF 解析的坑在這份資料里非常典型。2. 定位 PDF 正文結構規(guī)劃詞匯字段2.1 先判斷 PDF 是文本層還是掃描件處理任何 PDF 的第一步永遠是確認它有沒有文本層。用pdfplumber打開文件后如果page.extract_text()返回的是空字符串那說明這是一份圖片型掃描件需要 OCR。CFA 詞匯表這類資料通常由 Word 或 LaTeX 導出文本層大概率存在但不同出版社生成的 PDF 結構差異很大有的詞匯表是雙欄排版有的是單欄逐條列出。import pdfplumber with pdfplumber.open(CFA核心詞匯.pdf) as pdf: for i, page in enumerate(pdf.pages[:5]): text page.extract_text() print(f 第 {i1} 頁 ) print(text[:500]) print(--- 頁寬:, page.width, 頁高:, page.height)這段代碼先打印前五頁內(nèi)容確認三個關鍵信息文本是否完整、是單欄還是雙欄、頁眉頁腳是否混進正文。參數(shù)說明pdf.pages是按頁迭代的列表對象page.extract_text()返回該頁全部文本page.width和page.height用于后續(xù)判斷表格區(qū)域坐標。如果前五頁輸出里出現(xiàn)大量無關的版權頁、目錄頁后面解析正文頁碼范圍時要手動跳過。2.2 觀察條目格式圈定正則邊界確定有文本層后找到一頁典型的詞匯正文觀察每條術語的結構。常見的 CFA 詞匯 PDF 條目格式有兩種純文本型每行一個術語如abnormal returns 異常收益表格型兩列或三列術語、詞性、釋義分列但用extract_text()提取后很可能變成「abnormal returns 異常收益 n. 超過預期收益的部分」確認結構后為每條詞匯規(guī)劃字段。我一般會建這樣一張表字段順序固定方便后續(xù)導入 SQLite 和 Anki字段名類型說明示例term_enTEXT英文術語原文保留大小寫Abnormal Returnsterm_cnTEXT中文釋義主體異常收益POSTEXT詞性標注可為空n.definitionTEXT詳細中文解釋實際收益與預期收益之差subjectTEXT所屬學科分類組合管理source_pageINTEGER在 PDF 中的頁碼127字段規(guī)劃的意義在于不同用途對字段的粒度要求不同。做間隔重復spaced repetition時POS和definition可以組合成填空題卡面做知識圖譜時subject字段是節(jié)點聚類的核心維度。如果一開始只草草存成「英文中文」二元組后面再做分類就得回頭翻 PDF。2.3 用 pdfplumber 精確抽取表格型詞匯如果詞匯頁是表格排版extract_text()的裸文本容易把同一行不同列的內(nèi)容粘連在一起。更穩(wěn)妥的方式是用page.extract_table()按表格線切分import pdfplumber import csv with pdfplumber.open(CFA核心詞匯.pdf) as pdf: rows_all [] for page in pdf.pages[5:]: # 假設前5頁是目錄 table page.extract_table() if table: rows_all.extend(table) with open(cfa_terms_raw.csv, w, newline, encodingutf-8) as f: writer csv.writer(f) writer.writerow([term_en, term_cn, definition, source_page]) for row in rows_all: writer.writerow(row)參數(shù)說明extract_table()不傳參數(shù)時pdfplumber 會按頁面默認配置檢測表格線返回一個二維列表每行是單元格內(nèi)容空單元格是None。pdf.pages[5:]是切片語法從第 6 頁開始處理跳過目錄和版權頁具體起始頁要看第一步打印結果。這里把source_page直接寫進 CSV后面回溯出處時不用重新解析整個文件。3. 清洗三座大山換行符、英中粘連、詞性噪聲3.1 把提取結果從「能看」變成「能查」PDF 提取出的文本經(jīng)常帶著上一行結尾的連字符和\n最典型的情況是abnormal\nreturns被拆成兩行。對詞匯表來說術語本身是短文本跨行斷詞一般只出現(xiàn)在釋義里。清洗策略按嚴重程度分三層去除頁眉頁腳和頁碼行合并被換行符截斷的英文短語分離英中釋義處理詞性標注import re import pandas as pd df pd.read_csv(cfa_terms_raw.csv) def clean_term(en: str) - str: en re.sub(r\s, , en) # 壓縮空白和換行 en en.replace(- , ) # 去掉行尾連字符如 abnormal- returns en en.strip() return en def split_cn_definition(cell: str): parts re.split(r\s{2,}|(?[\u4e00-\u9fff])\s(?[a-zA-Z]), cell) cn parts[0] if parts else definition .join(parts[1:]) if len(parts) 1 else return cn.strip(), definition.strip() df[term_en] df[term_en].apply(clean_term) df[[term_cn, definition]] df[definition].apply( lambda x: pd.Series(split_cn_definition(str(x))) )這里第二個正則值得展開(?[\u4e00-\u9fff])\s(?[a-zA-Z])是一個零寬斷言匹配它只匹配「中文字符后緊跟空格再緊跟英文字母」的位置用來把「異常收益 n. 實際收益與預期之差」切分成中文核心詞和后面的英文釋義。參數(shù)說明\s{2,}匹配兩個以上連續(xù)空格處理 PDF 表格導出后常見的多空格分隔split后parts[0]一定是最純的中文術語parts[1:]是剩余釋義如果原文沒有詞性和詳細解釋definition就是空字符串后續(xù)導入數(shù)據(jù)庫時可填NULL。3.2 識別并剔除「偽詞條」清洗完基本格式后還有一個隱蔽問題PDF 詞匯表里除了真正的術語還會混入章節(jié)標題、表格注腳、頁碼和目錄條目。比如「數(shù)量分析方法」「Equity」這類是學科章節(jié)名不是術語。用規(guī)則過濾def is_valid_entry(en, cn): if not en or not cn: return False if re.fullmatch(r[A-Za-z\s\-], en) is None: return False # 英文術語不應含中文字符或數(shù)字開頭 if len(en) 2 or len(cn) 1: return False return True df_filtered df[df.apply(lambda r: is_valid_entry(r[term_en], r[term_cn]), axis1)] df_filtered df_filtered.drop_duplicates(subset[term_en])re.fullmatch(r[A-Za-z\s\-], en)強制整個英文術語只包含字母、空格、連字符和撇號。像「ROE Return on Equity」這種帶等號的字符串會被過濾掉你可能會覺得誤傷但在 CFA 詞匯表里「ROE 」通常是公式說明而不是術語本身。drop_duplicates(subset[term_en])保留第一次出現(xiàn)的術語后續(xù)重復出現(xiàn)的同名術語比如在不同章節(jié)都有解釋會被丟棄。3.3 學科分類的自動推斷原始 PDF 如果沒有提供分類欄位可以用人工劃分的章節(jié)頁范圍來做。每本 CFA 詞匯 PDF 的術語排列順序基本和教材章節(jié)一致道德在開頭組合管理在結尾。切分方法是在解析循環(huán)里記錄每個術語的source_page再按頁號打標簽subject_ranges [ (5, 40, Ethics), # 道德 (41, 70, Quantitative),# 數(shù)量 (71, 120, Economics), # 經(jīng)濟學 (121, 200, FRA), # 財報分析 # 實際頁數(shù)按你的 PDF 調(diào)整 ] def assign_subject(page): for start, end, name in subject_ranges: if start page end: return name return Uncategorized df_filtered[subject] df_filtered[source_page].apply(assign_subject)這段代碼的隱含假設是詞匯表在 PDF 內(nèi)部按學科章節(jié)連續(xù)排列。如果發(fā)現(xiàn)某學科的術語散落在互不相鄰的頁區(qū)間就在subject_ranges里加多個區(qū)間同一個學科可以出現(xiàn)兩次循環(huán)會依次匹配。這個方法的準確率主要取決于你對原書目錄的熟悉程度但屬于成本最低的自動分類方案。4. 把清洗結果庫化SQLite 存儲與向量化索引4.1 建表與冪等導入對幾百上千條術語CSV 夠用但要支持條件查詢、按學科聚合和后續(xù)擴展字段SQLite 更合適。建表時把term_en設為唯一索引重復導入不會產(chǎn)生臟數(shù)據(jù)CREATE TABLE IF NOT EXISTS cfa_vocab ( id INTEGER PRIMARY KEY AUTOINCREMENT, term_en TEXT UNIQUE NOT NULL, term_cn TEXT NOT NULL, POS TEXT, definition TEXT, subject TEXT DEFAULT Uncategorized, source_page INTEGER, frequency INTEGER DEFAULT 0, last_reviewed DATE ); CREATE INDEX IF NOT EXISTS idx_subject ON cfa_vocab(subject);字段里frequency和last_reviewed是后來加的用于記錄詞條在教材語料里出現(xiàn)的次數(shù)和個人復習進度。UNIQUE約束在詞匯表清洗完后可能引發(fā)插入沖突所以導入邏輯要寫成「存在則跳過不存在則插入」import sqlite3 conn sqlite3.connect(cfa_vocab.db) cur conn.cursor() for _, row in df_filtered.iterrows(): cur.execute( INSERT INTO cfa_vocab (term_en, term_cn, POS, definition, subject, source_page) VALUES (?, ?, ?, ?, ?, ?) ON CONFLICT(term_en) DO NOTHING , (row[term_en], row[term_cn], row.get(POS), row[definition], row[subject], row[source_page])) conn.commit() conn.close()ON CONFLICT(term_en) DO NOTHING是 SQLite 3.24.0 之后的 UPSERT 語法比先 SELECT 再 INSERT 快得多而且保留了表里已有詞的復習進度字段不會被重新導入的清數(shù)據(jù)覆蓋。4.2 用全文檢索做模糊查詞很多場景下用戶輸入的不是嚴格術語比如「什么是異常收益」你需要匹配term_cn里的子串。SQLite 自帶的LIKE在幾百條數(shù)據(jù)上沒問題但術語庫擴展到幾千條、釋義也有幾百字時建 FTS5 虛擬表更專業(yè)CREATE VIRTUAL TABLE IF NOT EXISTS cfa_fts USING fts5( term_en, term_cn, definition, contentcfa_vocab, content_rowidid ); INSERT INTO cfa_fts(rowid, term_en, term_cn, definition) SELECT id, term_en, term_cn, definition FROM cfa_vocab;查詢時注意 FTS5 默認按分詞匹配英文按空格切分中文要用unicode61的默認規(guī)則它對漢字是逐字切分還是整體切分取決于 SQLite 編譯配置。穩(wěn)妥做法是用LIKE兜底search_term 異常 cursor.execute( SELECT term_en, term_cn, subject FROM cfa_vocab WHERE term_en LIKE ? OR term_cn LIKE ? , (f%{search_term}%, f%{search_term}%))這里沒走 FTS5 而是用LIKE原因是中文子串匹配在 FTS5 里對配置敏感與其在分詞器上調(diào)半天不如直接在原始表上跑模糊查詢。數(shù)據(jù)量萬條以內(nèi)LIKE性能毫無壓力。4.3 生成 Anki 導入用的 TSV詞庫的價值在復用。從 SQLite 生成 Anki 卡組時Anki 桌面版支持從 TSV 文件導入每行是一張卡??媸怯⑽男g語背面是中文釋義和學科標簽with open(cfa_anki.tsv, w, encodingutf-8) as f: for row in conn.execute( SELECT term_en, term_cn, POS, subject FROM cfa_vocab ORDER BY subject, term_en ): en, cn, pos, subject row back f{cn}{ [ pos ] if pos else }{subject} f.write(f{en}\t{back}\n)TSV 里每行兩列第一列卡片正面第二列背面。這個文件的換行符在 Windows 上打開 Excel 可能不兼容Anki 導入時無礙。做完這一步你可以把同一個庫導出成 JSON 喂給前端做自測頁也可以只保留 SQLite 文件作為后續(xù)知識圖譜構建的數(shù)據(jù)源。5. 三個聯(lián)動場景Anki 熱詞加權、術語共現(xiàn)網(wǎng)絡、回填教材頁碼5.1 統(tǒng)計教材語料的術語頻次回寫權重這是進階玩法里比較實用的一種。把 CFA 官方教材或 Notes 的文本拉下來逐條統(tǒng)計核心詞匯在教材中出現(xiàn)的頻次寫回 SQLite 的frequency字段。高頻術語優(yōu)先復習低頻術語降低權重import collections import re def count_terms(text_path: str, conn): with open(text_path, encodingutf-8) as f: corpus f.read() counters collections.Counter() for (en,) in conn.execute(SELECT term_en FROM cfa_vocab): pattern r\b re.escape(en) r\b counters[en] len(re.findall(pattern, corpus, flagsre.IGNORECASE)) for en, freq in counters.items(): conn.execute(UPDATE cfa_vocab SET frequency? WHERE term_en?, (freq, en)) conn.commit()\b...\b是單詞邊界確保匹配的是完整單詞而不是子串IGNORECASE讓「return」同時匹配「Return」和「RETURN」。這里有個坑像「risk」這種短詞在語料里幾乎無處不在分開統(tǒng)計后頻率曲線會嚴重右偏建議最后把頻次做 log 歸一化再用于排序。5.2 術語共現(xiàn)網(wǎng)絡找出跨學科樞紐詞CFA 各學科不是孤立的「duration」同時出現(xiàn)在固收和組合管理里「beta」橫跨權益和衍生品。利用 SQLite 里的subject字段可以快速看一個術語橫跨幾個學科SELECT term_en, COUNT(DISTINCT subject) AS subj_cnt FROM cfa_vocab GROUP BY term_en HAVING subj_cnt 1 ORDER BY subj_cnt DESC;這個查詢輸出的就是跨學科樞紐詞。把它導出成節(jié)點列表喂給 NetworkX 畫圖得到的是知識結構圖而不僅僅是詞表。如果你愿意多做一步把每個術語的definition拿去做 Jieba 分詞再把分詞結果和所有術語取交集「術語共現(xiàn)矩陣」就出來了。5.3 把source_page映射成帶超鏈接的復習頁面最后一個使用技巧是把 SQLite 里的source_page回填到生成好的 HTML 復習頁面里點擊術語可以跳回原 PDF 對應頁for row in conn.execute(SELECT term_en, source_page FROM cfa_vocab): link fcfa.pdf#page{row[source_page]} print(fa href{link}{row[term_en]}/a)瀏覽器打開帶#pageN的本地 PDF 鏈接時Chrome 和 Edge 會直接跳到指定頁面這比在 PDF 閱讀器里手翻頁碼快得多。生成完整個 HTML 后你就擁有一個帶定位、帶學科標簽、帶復習狀態(tài)的詞匯工作臺而這一切的起點只是那份看似靜態(tài)的《CFA核心詞匯.pdf》。本文還有配套的精品資源點擊獲取