?好吧,我承認我是個標題黨!(不這樣你會點進來享受這篇 ' 通俗易懂 ' 的好文章嗎?)?
正經標題:文本預處理全流程:從基礎到實踐
(屏幕前的你,帥氣低調有內涵,美麗大方很優雅…
所以,求個點贊、收藏、關注唄~)
前言
伊索寓言里,農夫沒理順葡萄藤就猛澆水,藤蔓纏成一團,果子又小又澀。?
這像極了做自然語言處理 —— 有開發者直接把爬來的文本喂給模型,結果 “差點沒贏” 被認成輸,“好得不得了” 成了三個無關詞。?
原始文本就像亂麻般的葡萄藤:亂碼是野草,重復語氣詞是多余卷須,近義詞異寫是纏繞枝蔓。不先梳理干凈,再聰明的模型也結不出 “準果子”。?
本文跟著寓言思路,拆解預處理全流程:?
- 剪除 “野草”(清亂碼)?
- 剪掉 “卷須”(去冗余)?
- 理順 “枝蔓”(統一表述)?
新手入門、老手優化,做好這步,NLP 的 “葡萄藤” 才能結甜果。跟著詩人啊_開始整理藤蔓吧
目錄
前言
文本預處理
1 認識文本預處理
1.1 核心作用
1.2 關鍵環節
1.3 語言適配
2 文本處理的基本方法
2.1 分詞
示例(定制化文本)
工具:jieba(Python 主流分詞庫)
2.2 命名實體識別(NER)
示例(定制化文本延伸)
作用
工具推薦
2.3 詞性標注
示例(定制化文本)
作用
2.4 小結
3 文本張量表示方法
3.1 核心目標
3.2 One - Hot 編碼
示例(定制化詞匯表)
實現代碼
優缺點
3.3 Word2Vec 模型
示例(用?fasttext?實現)
工具優勢
3.4 Word Embedding(詞嵌入)
實現(PyTorch 示例)
核心價值
3.5 小結
4 文本數據分析
4.1 核心作用
4.2 分析維度
(1)標簽分布(以分類任務為例)
(2)句子長度分布
(3)詞頻統計與詞云
4.3 小結
5 文本特征處理
5.1 核心目標
5.2 N - Gram 特征
示例(定制化文本)
實現代碼
5.3 文本長度規范
實現(Keras 示例)
5.4 小結
6 文本數據增強
6.1 核心目標
6.2 回譯增強法
實現(調用有道翻譯 API 示例)? # 這個被封了看個思路舊縣..現在直接用GTP
6.3 同義詞替換
實現(jieba?+ 同義詞詞林)
總結
文本預處理
在自然語言處理(NLP)任務中,文本預處理是模型訓練的基石。高質量的預處理能讓模型 “讀懂” 文本,直接影響最終效果。本章系統拆解文本預處理核心環節,從基礎概念到代碼實操,幫你構建完整知識體系。
1 認識文本預處理
1.1 核心作用
將原始文本轉化為模型可理解的格式(如張量、規范長度的序列),同時通過分析數據分布,指導后續流程(如超參數選擇、數據增強策略),最終提升模型評估指標(準確率、F1 值等)。
1.2 關鍵環節
文本預處理是一套 “流水線”,包含以下遞進步驟:
- 文本處理基礎方法:分詞、詞性標注、命名實體識別(拆解文本語義單元)。
- 文本張量表示:將詞轉化為數值向量(如 One - Hot、Word2Vec),讓模型可計算。
- 文本數據分析:統計標簽分布、句子長度等,發現數據問題(如樣本不平衡)。
- 文本特征處理:增強有效特征(如 N - Gram)、規范數據格式(長度補齊 / 截斷)。
- 文本數據增強:擴充數據集,提升模型泛化能力。
1.3 語言適配
本章方法覆蓋中文 + 英文(最常用語言),實操中可靈活擴展到其他語種。
2 文本處理的基本方法
2.1 分詞
定義:將連續文本拆分為詞(或字)序列的過程。
- 英文依賴空格分詞,中文需算法(如統計、深度學習)識別詞邊界。
示例(定制化文本)
原始文本:
詩人啊程序員,是我學習路上的引路人,幫我解開代碼與創作的雙重謎題!
分詞結果(jieba
精確模式):
['詩人', '啊', '程序員', ',', '是', '我', '學習', '路上', '的', '引路人', ',', '幫', '我', '解開', '代碼', '與', '創作', '的', '雙重', '謎題', '!']
工具:jieba
(Python 主流分詞庫)
- 安裝:
pip install jieba
- 核心模式:
- 精確模式(默認):適合文本分析,優先精準切分。
import jieba content = "詩人啊程序員,是我學習路上的引路人..." result = jieba.lcut(content, cut_all=False) print(result)
- 全模式:速度快,但會切出冗余組合(適合初步探索)。
result = jieba.lcut(content, cut_all=True) # 輸出含冗余詞:['詩人', '啊', '程序', '程序員', ...]
- 搜索引擎模式:對長詞二次切分(適合搜索場景)。
result = jieba.lcut_for_search(content) # 輸出更細粒度:['詩人', '啊', '程序', '程序員', '學習', '路上', ...]
- 自定義詞典:添加專業詞匯(如 “詩人啊程序員”),提升切分準確率。
jieba.load_userdict("custom_dict.txt") # 詞典格式:詞語 詞頻 詞性 result = jieba.lcut(content) # 輸出可能包含:['詩人啊程序員', ...]
- 精確模式(默認):適合文本分析,優先精準切分。
2.2 命名實體識別(NER)
定義:識別文本中的專有名詞(人名、地名、機構名、時間、數字等)。
示例(定制化文本延伸)
詩人啊程序員中的“詩性代碼”理念,像李白的浪漫與圖靈的嚴謹融合,在人工智能峰會引發熱議。
識別結果(簡化示意):
- 人名:
李白
- 機構名:
人工智能峰會
- 專有概念:
詩性代碼
作用
為情感分析、信息抽取、知識圖譜提供關鍵實體,讓模型聚焦核心信息。
工具推薦
- 中文:
jieba
(基礎版)、BERT - NER
(深度學習版,需訓練 / 加載模型)。 - 英文:
spaCy
、NLTK
。
2.3 詞性標注
定義:標記文本中每個詞的語法屬性(如名詞、動詞、形容詞)。
示例(定制化文本)
我在學習路上與程序員交流人工智能創意
標注結果(jieba.posseg
):
[pair('我', 'rr'), pair('在', 'p'), pair('學習', 'v'), pair('路上', 'n'), ...]
# rr:人稱代詞;p:介詞;v:動詞;n:名詞
作用
輔助模型理解語法結構,為句法分析、文本生成(如詩歌創作)打基礎。
2.4 小結
- 分詞是文本理解的 “第一步”,
jieba
是中文場景的高效工具。 - 命名實體識別和詞性標注,進一步拆解文本語義與語法,為高階任務(如情感分析、知識圖譜)提供支撐。
3 文本張量表示方法
3.1 核心目標
將詞 / 文本轉化為數值張量(如向量、矩陣),讓模型通過數學運算 “理解” 語義。
3.2 One - Hot 編碼
原理:用長度等于 “詞匯表大小” 的向量表示詞,僅對應詞的位置為1
,其余為0
。
示例(定制化詞匯表)
詞匯表:["詩人啊程序員", "學習路上", "引路人", "代碼謎題"]
One - Hot 表示:
"詩人啊程序員" → [1, 0, 0, 0]
"學習路上" → [0, 1, 0, 0]
實現代碼
from tensorflow.keras.preprocessing.text import Tokenizer # 1. 構建詞匯表
vocabs = ["詩人啊程序員", "學習路上", "引路人", "代碼謎題"]
tokenizer = Tokenizer()
tokenizer.fit_on_texts(vocabs) # 2. 生成 One - Hot 編碼
for word in vocabs: seq = tokenizer.texts_to_sequences([word])[0] # 詞轉索引 one_hot = [0] * len(vocabs) one_hot[seq[0] - 1] = 1 # 索引從 1 開始,需減 1 print(f"{word}: {one_hot}") # todo: 輸出結果
'''
詩人啊程序員: [1, 0, 0, 0]
學習路上: [0, 1, 0, 0]
引路人: [0, 0, 1, 0]
代碼謎題: [0, 0, 0, 1]
'''
優缺點
- 簡單直觀,易實現。
- 詞匯表大時向量極度稀疏,且無法表達詞間語義關聯(如 “詩人” 和 “程序員” 的關聯性)。
3.3 Word2Vec 模型
原理:通過無監督訓練,將詞映射為稠密向量(語義相關的詞,向量距離更近)。
- 模式:
CBOW
(用上下文預測目標詞)、Skip - Gram
(用目標詞預測上下文)。
示例(用?fasttext
?實現)
import fasttext# 1. 訓練詞向量(可替換為自定義語料)
model = fasttext.train_unsupervised("corpus.txt", model="skipgram", dim=100, minCount=1)# 2. 查看詞向量
vec = model.get_word_vector("詩人啊程序員")
print(f"詞向量維度:{vec.shape}") # 輸出 (100,)# 3. 找相似詞
similar_words = model.get_nearest_neighbors("程序員")
print(f"相似詞:{similar_words}")# 輸出結果:
'''
詞向量維度:(100,)
相似詞:[(0.10706065595149994, '</s>'), (0.10659360885620117, '我在學習過程中,感受到程序員的代碼智慧與詩人的創作靈感交融。'), (-0.00556528102606535, '詩人啊程序員,是我學習路上的好朋友,總能幫我解答疑惑。'), (-0.03436730429530144, '編程如同寫詩,需要邏輯的嚴謹和創意的迸發,程序員和詩人有相似的思維火花。')]
'''
工具優勢
- 捕捉詞間語義關聯(如 “程序員” 和 “開發者” 向量相近)。
- 支持生僻詞處理(通過子詞分詞)。
3.4 Word Embedding(詞嵌入)
原理:神經網絡中可訓練的 “詞向量層”,隨模型訓練動態優化,更貼合任務需求。
實現(PyTorch 示例)
import torch
import torch.nn as nn# 1. 構建詞匯表(假設已分詞)
vocab = ["詩人", "程序員", "學習", "路上", ...]
vocab_size = len(vocab)
embedding_dim = 8# 2. 定義 Embedding 層
embedding = nn.Embedding(vocab_size, embedding_dim)# 3. 查看詞向量(需先將詞轉索引)
word_index = {"詩人": 0, "程序員": 1}
word_vec = embedding(torch.tensor(word_index["詩人"]))
print(f"詩人的詞向量:{word_vec.detach().numpy()}")# todo: 輸出結果'''
詩人的詞向量:[ 1.8813473 0.35883304 -0.34900337 -0.96565574 -0.15248121 1.4000998-1.0328294 0.48301077]
'''
核心價值
- 為特定任務定制詞向量(如情感分析中,“驚喜” 和 “失望” 的向量會隨訓練優化)。
- 可通過?
TensorBoard
?可視化詞向量,輔助分析語義關聯。
3.5 小結
- One - Hot 適合小詞匯表,Word2Vec 適合無監督語義挖掘,Word Embedding 適合任務定制。
- 選擇方法時,需權衡語料規模、任務需求、計算成本。
4 文本數據分析
4.1 核心作用
通過統計分析,發現數據規律與問題(如樣本不平衡、句子長度異常),指導后續預處理策略(如數據增強、長度規范)。
4.2 分析維度
(1)標簽分布(以分類任務為例)
目標:檢查樣本是否平衡(如情感分析中 “正面”“負面” 樣本比例)。
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt # 導入matplotlib用于顯示圖表# 模擬數據
data = pd.DataFrame({"text": ["詩人啊程序員不行", "代碼創作頂呱呱", "學習感悟幾乎沒有", "程序員是詩人", "代碼創作不行"],"label": [0, 1, 0, 1, 0] # 0: 負面,1: 正面
})# 設置中文字體,避免中文亂碼
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]# 繪制分布
sns.countplot(x="label", data=data)# 添加標題和標簽
plt.title("情感標簽分布")
plt.xlabel("標簽類型")
plt.ylabel("樣本數量")# 替換x軸刻度為有意義的文本
plt.xticks([0, 1], ["負面 (0)", "正面 (1)"])# 顯示圖表(這一步是關鍵,沒有它圖表不會會顯示圖表)
plt.show()
圖表:
問題處理:若樣本不平衡(如 1:9),可通過數據增強(回譯、同義詞替換)或采樣(過采樣少數類、欠采樣多數類)調整。
(2)句子長度分布
目標:統計文本長度范圍,為 “長度規范” 提供依據。
import pandas as pd # 導入 pandas 庫,用于數據處理和分析
import jieba # 導入 jieba 庫,用于中文分詞# 導入數據
# 使用 pandas 的 read_csv 函數從 'data/train.csv' 文件中讀取數據
# 'utf-8' 編碼確保正確讀取中文字符'''
train.csv 文件數據結構如下:label,text1,選擇珠江花園的原因就是方便,有電動扶梯直接到達海邊,周圍餐館、食廊、商場、超市、攤位一應俱全。酒店裝修一般,但還算整潔。 泳池在大堂的屋頂,因此很小,不過女兒倒是喜歡。 包的早餐是西式的,還算豐富。 服務嗎,一般1,15.4寸筆記本的鍵盤確實爽,基本跟臺式機差不多了,蠻喜歡數字小鍵盤,輸數字特方便,樣子也很美觀,做工也相當不錯0,房間太小。其他的都一般。。。。。。。。。
'''
# 我們可以看到',' 作為列與列分隔符,所以sep = ',',將原本一列的label和text分成了兩列
data = pd.read_csv('data/train.csv', encoding='utf-8', sep=',')# 打印數據的前 2 行,查看數據的基本情況
print("前2行數據:\n", data.head(2),data.head().shape)# 計算句子長度
# 使用 apply 函數和 lambda 表達式計算 'text' 列中每個句子的長度
# 將長度值存儲在新的 'length' 列中
data['length'] = data['text'].apply(lambda x: len(x))
# 打印數據的前 2 行,查看句子長度計算的結果
print('新前2行數據:\n', data.head(2))# todo: 運行結果
前2行數據:label text
0 1 選擇珠江花園的原因就是方便,有電動扶梯直接到達海邊,周圍餐館、食廊、商場、超市、攤位一應俱全...
1 1 15.4寸筆記本的鍵盤確實爽,基本跟臺式機差不多了,蠻喜歡數字小鍵盤,輸數字特方便,樣子也很... (5, 2)
新前2行數據:label text length
0 1 選擇珠江花園的原因就是方便,有電動扶梯直接到達海邊,周圍餐館、食廊、商場、超市、攤位一應俱全... 106
1 1 15.4寸筆記本的鍵盤確實爽,基本跟臺式機差不多了,蠻喜歡數字小鍵盤,輸數字特方便,樣子也很... 56
實操建議:
- 若 90% 文本長度 < 100,可將最大長度設為 100(截斷 / 補齊)。
- 若存在極端長文本(如 1000 字),需人工核驗是否為無效數據。
(3)詞頻統計與詞云
目標:發現高頻詞、分析文本主題。
import jieba.posseg as pseg
import pandas as pd
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt# 詞云生成
def word_cloud(data_good, data_bad):# 生成好評詞云# 1. 實例化一個詞云對象wordcloud_good = WordCloud(font_path='C:/Windows/Fonts/simhei.ttf', width=1000, height=800, background_color='white',max_words=12163, max_font_size=100, random_state=42, scale=2)# 2. 生成詞云wordcloud_good.generate(' '.join(data_good))# 3. 畫圖plt.imshow(wordcloud_good, interpolation='bilinear')plt.axis('off') # 隱藏坐標軸plt.title("好評詞云", fontsize=18, fontproperties='simhei') # 設置標題plt.show() # 顯示圖像# 生成差評詞云# 1. 實例化一個詞云對象wordcloud_bad = WordCloud(font_path='C:/Windows/Fonts/simhei.ttf', width=1000, height=800, background_color='white',max_words=12163, max_font_size=100, random_state=42, scale=2)# 2. 生成詞云wordcloud_bad.generate(' '.join(data_bad))# 3. 畫圖plt.imshow(wordcloud_bad, interpolation='bilinear')plt.axis('off') # 隱藏坐標軸plt.title("差評詞云", fontsize=18, fontproperties='simhei') # 設置標題plt.show() # 顯示圖像# 生成好評與差評混合詞云# 1. 實例化一個詞云對象wordcloud_mixed = WordCloud(font_path='C:/Windows/Fonts/simhei.ttf', width=1000, height=800, background_color='white',max_words=1000, max_font_size=100, random_state=42, scale=2)# 2. 生成詞云wordcloud_mixed.generate(' '.join(data_good + data_bad))# 3. 畫圖plt.imshow(wordcloud_mixed, interpolation='bilinear')plt.axis('off') # 隱藏坐標軸plt.title("好評與差評混合詞云", fontsize=18, fontproperties='simhei') # 設置標題plt.show() # 顯示圖像# 測試
if __name__ == '__main__':data = pd.read_csv('./data/train.csv', sep=',')# process_data(data)print(f'數據總量---> {len(data)}條')data_t = data[data['label'] == 1]['text']print(f'好評數據量---> {len(data_t)}條')data_f = data[data['label'] == 0]['text']print(f'差評數據量---> {len(data_f)}條')list_t = []for line in data_t:for word, flag in pseg.lcut(line):if flag == 'a':list_t.append(word)print(f'好評形容詞---> {len(list_t)}個')list_f = []for line in data_f:for word, flag in pseg.lcut(line):if flag == 'a':list_f.append(word)print(f'差評形容詞---> {len(list_f)}個')word_cloud(list_t, list_f)# todo: 輸出結果
'''
好評數據量---> 4799條
差評數據量---> 4801條
好評形容詞---> 16368個
差評形容詞---> 12163個'''
詞云圖像:
價值:若高頻詞與任務無關(如 “的”“了”),需考慮停用詞過濾。
4.3 小結
- 數據分析是 “預處理的預處理”,能幫你避開數據分布不均、無效數據等坑。
- 核心工具:
pandas
(統計)、seaborn
(可視化)、wordcloud
(詞云)。
5 文本特征處理
5.1 核心目標
- 增強有效特征:如 N - Gram(捕捉詞的相鄰關系)。
- 規范數據格式:統一文本長度(截斷 / 補齊),適配模型輸入。
5.2 N - Gram 特征
定義:提取文本中連續 n 個詞的組合(如 2 - Gram:“詩人 啊”“啊 程序員”),補充語義信息。
示例(定制化文本)
分詞列表:["詩人", "啊", "程序員", "是", "引路人"]
2 - Gram 特征:("詩人", "啊"), ("啊", "程序員"), ("程序員", "是"), ("是", "引路人")
實現代碼
def create_ngram_set(input_list, n=2):return set(zip(*[input_list[i:] for i in range(n)]))# 調用
words = ["詩人", "啊", "程序員", "是", "引路人"]
ngrams = create_ngram_set(words)
print(f"2 - Gram 特征:{ngrams}")# todo: 輸出結果
# 2 - Gram 特征:{('程序員', '是'), ('詩人', '啊'), ('啊', '程序員'), ('是', '引路人')}
價值:讓模型捕捉 “詞序關聯”(如 “詩人” 常和 “創作” 搭配)。
5.3 文本長度規范
需求:模型輸入需固定長度(如 RNN、Transformer 要求等長序列)。
實現(Keras 示例)
from tensorflow.keras.preprocessing.sequence import pad_sequences # 模擬數據(數值化后的文本序列)
sequences = [[1, 2, 3], [4, 5], [6, 7, 8, 9]] # 規范長度(最大長度 3,補齊用 0)
padded = pad_sequences(sequences, maxlen=3, padding="post", truncating="post")
print(padded)
# 輸出:
# [[1 2 3]
# [4 5 0]
# [6 7 8]]
策略:
padding="post"
:在序列末尾補齊。truncating="post"
:超長時截斷末尾。
5.4 小結
- N - Gram 補充詞序信息,適合捕捉短語、搭配。
- 長度規范是模型輸入的 “必修課”,需結合數據分析結果(如 90% 文本長度)設置?
maxlen
。
6 文本數據增強
6.1 核心目標
擴充數據集,緩解樣本不平衡問題,提升模型泛化能力(讓模型見更多 “變種文本”)。
6.2 回譯增強法
原理:利用翻譯工具,將文本譯為其他語言(如中文→英文→中文),生成 “語義相似但表述不同” 的新樣本。
實現(調用有道翻譯 API 示例)? # 這個被封了看個思路舊縣..現在直接用GTP
import requests def back_translate(text): # 中文→英文 url = "http://fanyi.youdao.com/translate" data = { "from": "zh", "to": "en", "i": text, "doctype": "json" } res = requests.post(url, data).json() en_text = res["translateResult"][0][0]["tgt"] # 英文→中文 data["from"] = "en" data["to"] = "zh" data["i"] = en_text res = requests.post(url, data).json() return res["translateResult"][0][0]["tgt"] # 調用
text = "詩人啊程序員,是我學習路上的引路人"
new_text = back_translate(text)
print(f"原文本:{text}\n新文本:{new_text}")
# 輸出示例:
# 原文本:詩人啊程序員,是我學習路上的引路人
# 新文本:詩人啊程序員,是我學習道路上的引路人
優化:
- 多語言接力翻譯(如中→日→英→中),降低與原文本重復率。
- 控制翻譯次數(≤3 次),避免語義失真。
6.3 同義詞替換
原理:用同義詞替換文本中的詞(如 “好”→“優秀”),生成變體。
實現(jieba
?+ 同義詞詞林)
import jieba
from synonyms import near synonyms # 需安裝:pip install synonyms def replace_synonyms(text): words = jieba.lcut(text) new_words = [] for word in words: syns = near synonyms(word) if syns and len(syns[0]) > 1: # 存在同義詞 new_words.append(syns[0][0]) # 選第一個同義詞 else: new_words.append(word) return "".join(new_words) # 調用
text = "詩人啊程序員,幫我解開代碼謎題"
new_text = replace_synonyms(text)
print(f"原文本:{text}\n新文本:{new_text}")
# 輸出示例:
# 原文本:詩人啊程序員,
總結
文本預處理這幾步看似瑣碎,卻是 NLP 的 “地基”。把數據 “洗” 干凈,模型才能少踩坑、出效果~
覺得有用?點個關注~
系列文章持續更新中, 欲知后事如何,且聽下回分解~
下一集鏈接---->?
文本預處理:NLP 版 “給數據洗澡” 指南-CSDN博客