一、問題的提出
在日常語言學習與教學中,語料庫是一個不可或缺的工具。它可以幫助我們查找高頻詞,獲取搭配信息、例句信息、關鍵詞信息等。由于建庫過程操作步驟多,有時還要用到圖片識別、格式轉化、文本清理等技巧,很多人往往都止步在第一個環節。
今天我們就一步一步來學習建立一個四級語料庫,用于四級考試的備考和教學。我們手頭已經準備好一些四級考試的真題 Word 版,需要將它們從一個個文件夾中提取出來,清理加工后,以 txt 格式保存在一個文件夾下面。這個過程中,我們可能會遇到下面的問題:
- 文件夾里層級過多,不便于統一管理;
- 文件名不規范,夾雜著多余的信息或無關的符號;
- 文本內部存在冗余,如段首段尾空格、大量空行等;
手工處理文本耗時耗力,如果用多個工具處理又可能導致軟件之間的不兼容性而產生誤差,影響后面的數據分析結果。這時,我們完全可以借助 Python 這個“瑞士軍刀”來批量處理這些問題,可以讓語料庫建設更高效、更專業。本文將結合實踐,介紹如何用 Python 的 pathlib 和正則表達式來完成:
- 批量收集 Word 文本并轉化為 txt;
- 清理語料文本的冗余信息;
- 自動化重命名文件,保持一致性和可讀性。
二、批量收集、轉化和清理 Word 文件
在語料庫建設中,我們常常需要將 docx 轉化為 txt 進行存儲,以便進行后續的分詞、詞頻統計。現在的情況是四級真題在多個子目錄當中,且與試題解析、真題 PDF 文件混在一起,我們現在就要把一個個真題 docx 文件提取、轉化、清理、保存。
四級真題文件夾
現在有了 DeepSeek 等大模型的加持,我們只需詳細描述我們的要求,就可以輕松讓 DeepSeek 生成我們想要的代碼,比如我們給出了下面的提示詞:
Python 代碼,用 pathlib,遍歷 backup 文件夾下的目錄和子目錄,提取其中的 docx 文件,文件名包括【四級】這個關鍵詞,但不包括【解析】這個關鍵詞,提取到當前四級 word 文件夾下,再轉化為 txt 同名文件,清除其中的段前空格,段尾空格,空段等內容。
提示詞展示
大模型給我們很快展示出一串代碼,我們可以復制、下載到本地,粘貼到四級真題文件夾下面,運行這段程序,Python 會遍歷 backup 文件夾及其子目錄,提取包含“四級”,但不包含“解析”的 docx 格式文件,輸出到【四級 word】文件夾下面,并轉化為 txt 格式,在轉化過程中順便刪除了段前段尾的空格、空段,進行初步的文本整理。代碼展示如下:
from pathlib import Path
from docx import Documentdef clean_text(text: str) -> str:"""去除段前段尾空格"""return text.strip()def docx_to_txt(docx_path: Path, txt_path: Path):"""將 docx 轉換為 txt"""try:doc = Document(docx_path)lines = []for para in doc.paragraphs:cleaned = clean_text(para.text)if cleaned: # 去掉空行lines.append(cleaned)txt_content = "\n".join(lines)with open(txt_path, "w", encoding="utf-8") as f:f.write(txt_content)print(f"轉換成功: {docx_path.name} -> {txt_path.name}")except Exception as e:print(f"轉換失敗: {docx_path} 錯誤: {e}")def main():base_dir = Path("backup") # 要遍歷的根目錄out_dir = Path("四級word") # 輸出目錄out_dir.mkdir(exist_ok=True)# 遍歷所有子目錄for docx_file in base_dir.rglob("*.docx"):name = docx_file.nameif "四級" in name and "解析" not in name:txt_path = out_dir / (docx_file.stem + ".txt")docx_to_txt(docx_file, txt_path)if __name__ == "__main__":main()
一段代碼可以完成多個流程的操作,大大節省了我們的時間,避免復制粘貼過程中的誤操作。效果展示如下:
代碼運行展示
三、文件名的規范統一
在收集到所有四級真題文本的 txt 格式后,我們發現文件名不統一,需要進行統一的修改,如果一個人工改很容易出題,此時我們仍然可以借助大模型生成 Python 代碼來解決。比如,我們想刪除所有文件名中【英語】這個詞,就可以采用下面大模型生成的代碼:
from pathlib import Path
def rename_txt_files():for txt_file in Path(".").glob("*.txt"):old_name = txt_file.stem # 不帶后綴new_name = old_name.replace("英語", "") # 去掉關鍵詞“四級”new_file = txt_file.with_name(new_name + txt_file.suffix)if txt_file != new_file:txt_file.rename(new_file)print(f"{txt_file.name} -> {new_file.name}")
if __name__ == "__main__":
rename_txt_files()
建成的初步效果如下:
又如,我們還想把不規則的日期 2020 年 12 月試卷.txt 統一改成 2020.12 試卷.txt。我們仍然向大模型清楚地表達我們的要求,得到了如下代碼,輕松實現文件夾的遍歷,文件名的批量修改,文件的最終保存,最終形成命名規范、格式統一的小型四級真題語料庫。
import re
from pathlib import Path
def rename_txt_files():for txt_file in Path(".").glob("*.txt"):old_name = txt_file.stem# 去掉英文new_name = re.sub(r"[A-Za-z]", "", old_name)# 替換“2020年12月”成“2020.12”new_name = re.sub(r"(\d{4})年(\d{1,2})月",lambda m: f"{m.group(1)}.{int(m.group(2)):02d}",new_name)new_file = txt_file.with_name(new_name + txt_file.suffix)if txt_file != new_file:txt_file.rename(new_file)print(f"{txt_file.name} -> {new_file.name}")if __name__ == "__main__":rename_txt_files()
文件名統一
程序運行后效果展示:
四、語料庫文本的清洗
收集到文本后,我們下一步還要繼續清理每一個文本,此時可以用 Emeditor 或者 EditPad 來進行正則替換,也可以繼續使用 Python 來清理文本。
文本內容展示
比如:我要清除每一個文本中以中文開頭的一行,因為這一行往往是中文文件名,然后清理以【溫馨提示】開頭的段落。于是,就有了下面的提問:
文本格式清理
給出的代碼如下,可以看出人工智能通過 re 正則模塊實現了文本批量清理,我們甚至連一行代碼都不需要寫,就可以完成這項任務。
from pathlib import Path
import re
def clean_txt_file(txt_path: Path):"""清理文本文件"""lines = []with open(txt_path, "r", encoding="utf-8") as f:for line in f:stripped = line.strip()if not stripped:continue # 跳過空行# 如果以中文開頭,跳過這一行if re.match(r"^[\u4e00-\u9fff]", stripped):continue# 如果以【溫馨提示】開頭,跳過這一行if stripped.startswith("溫馨提示"):continuelines.append(stripped)# 寫回文件with open(txt_path, "w", encoding="utf-8") as f:f.write("\n".join(lines))
def main():folder = Path("四級word")for txt_file in folder.glob("*.txt"):clean_txt_file(txt_file)print(f"已清理: {txt_file.name}")
if __name__ == "__main__":main()
通過這個案例可以看到,在大模型的輔助下,我們可以編寫高效的 Python 代碼輔助我們進行文本的收集、清理和歸檔等操作,全程不需要其它軟件的介入。有些步驟甚至可以一次性完成,無需拆分操作。
文件在經過 Python 腳本處理后,層級更清晰、命名更規范,段落緊湊,適合直接進入語料庫工具進行分析。
整個過程自動化,研究者只需準備描述自己的請求,明確操作的對象、位置、任務信息,就可以一次運行腳本,就能完成大量繁瑣的手工工作。
這正體現了 Python 在翻譯技術和語料庫建設中的價值:讓研究者把精力放在語言和翻譯問題本身,而不是文件管理的細枝末節。
讓我們摒棄編程難學的偏見,積極擁抱技術,提升我們語言學習和教學中的信息素養!
關注我,一起學習 Python 在語言學習和翻譯教學中的應用!