文章目錄
- 前言
- 一、文本預處理核心步驟
- 二、MATLAB 實現示例
- 三、高級預處理技術
- 四、預處理流程整合
- 五、性能優化與注意事項
- 六、實戰案例:IMDB 影評預處理
前言
以下是 MATLAB 自然語言處理 (NLP) 工具箱的文本預處理教程,涵蓋核心步驟、代碼實現及最佳實踐。
一、文本預處理核心步驟
文本清理:去除 HTML 標簽、特殊字符、數字等
分詞:將文本拆分為單詞或子詞
大小寫統一:通常轉換為小寫
停用詞過濾:移除無實際意義的高頻詞
詞干提取 / 詞形還原:將詞還原為基本形式
拼寫檢查與校正
向量化:將文本轉換為數值表示
二、MATLAB 實現示例
- 文本數據導入與基本清理
% 導入文本數據
documents = importdata('text_data.txt');% 創建文本表格
tbl = table(documents, 'VariableNames', {'Text'});% 清理HTML標簽
tbl.Text = replace(tbl.Text, '<[^>]+>', '');% 移除URL
tbl.Text = replace(tbl.Text, 'http\S+', '');% 移除特殊字符和數字
tbl.Text = replace(tbl.Text, '[^a-zA-Z]', ' ');% 統一大小寫
tbl.Text = lower(tbl.Text);
- 分詞與停用詞過濾
% 分詞
tokenizedData = tokenizedDocument(tbl.Text);% 移除停用詞
stopWords = stopwords('english');
cleanTokens = removeWords(tokenizedData, stopWords);% 移除短詞(長度<3)
cleanTokens = removeShortWords(cleanTokens, 3);
- 詞干提取與詞形還原
% 詞干提取(Porter算法)
stemmedTokens = stemWords(cleanTokens);% 詞形還原(更精確但計算開銷大)
lemmatizer = trainDocumentlemmatizer(cleanTokens);
lemmatizedTokens = lemmatize(lemmatizer, cleanTokens);
- 拼寫檢查與校正
% 創建拼寫檢查器
speller = spellChecker('text', cleanTokens);% 校正拼寫錯誤
correctedTokens = correctWords(speller, cleanTokens);
- 向量化表示
% 詞袋模型(BOW)
bag = bagOfWords(correctedTokens);% TF-IDF特征
tfidf = tfidf(bag);% 詞嵌入表示
embedding = wordEmbedding(correctedTokens, 'NumDimensions', 100);
docVectors = transform(embedding, correctedTokens);
三、高級預處理技術
- 詞性標注 (Part-of-Speech Tagging)
% 訓練詞性標注器
posTagger = trainPOSTagger(correctedTokens);% 對文本進行詞性標注
taggedTokens = posTag(posTagger, correctedTokens);% 僅保留名詞和動詞
nounsAndVerbs = selectByPOS(taggedTokens, {'NN', 'NNS', 'VB', 'VBD', 'VBG'});
- 命名實體識別 (NER)
% 加載預訓練NER模型
nerNet = nerNetwork('english');% 識別命名實體
entities = recognizeNamedEntities(nerNet, tbl.Text);% 提取人名和組織名
persons = entities(contains(entities.Type, 'PERSON'), :);
organizations = entities(contains(entities.Type, 'ORG'), :);
- 情感分析預處理
% 保留情感相關標點符號
tbl.Text = replace(tbl.Text, '[^a-zA-Z!?.]', ' ');% 擴展縮寫詞
tbl.Text = replace(tbl.Text, "can't", 'can not');
tbl.Text = replace(tbl.Text, "won't", 'will not');
% 更多縮寫詞替換...
四、預處理流程整合
function processedData = preprocessText(rawText)% 文本清理cleanedText = replace(rawText, '<[^>]+>', '');cleanedText = replace(cleanedText, 'http\S+', '');cleanedText = replace(cleanedText, '[^a-zA-Z]', ' ');cleanedText = lower(cleanedText);% 分詞tokens = tokenizedDocument(cleanedText);% 停用詞過濾stopWords = stopwords('english');tokens = removeWords(tokens, stopWords);% 詞干提取tokens = stemWords(tokens);% 拼寫校正speller = spellChecker('text', tokens);tokens = correctWords(speller, tokens);processedData = tokens;
end% 應用預處理到整個數據集
tbl.ProcessedText = preprocessText(tbl.Text);
五、性能優化與注意事項
大規模數據處理:
% 使用內存映射文件處理超大數據
tds = tabularTextDatastore('large_data.csv', 'TreatAsMissing', 'nan');
while hasdata(tds)tbl = read(tds);processedTbl = preprocessText(tbl);% 保存或進一步處理
end并行計算加速:
matlab
% 使用并行池加速預處理
parpool;
processedData = zeros(size(tbl, 1), 1);parfor i = 1:size(tbl, 1)processedData(i) = preprocessText(tbl.Text(i));
end常見問題處理:
中文 / 非英文文本:使用tokenizedDocument時指定語言,如'Language', 'chinese'
領域特定停用詞:擴展默認停用詞列表,添加領域無關詞匯
內存不足:分批處理數據,使用datastore對象
六、實戰案例:IMDB 影評預處理
% 加載IMDB影評數據集
tbl = readtable('imdb_reviews.csv');% 預處理文本
tbl.ProcessedText = preprocessText(tbl.Review);% 創建詞袋模型
bag = bagOfWords(tbl.ProcessedText);% 移除低頻詞(出現次數少于5)
bag = removeInfrequentWords(bag, 5);% 創建訓練集和測試集
cv = cvpartition(height(tbl), 'HoldOut', 0.2);
idxTrain = training(cv);
idxTest = test(cv);% 訓練分類器
classifier = trainDocumentClassifier(bag(idxTrain), tbl.Sentiment(idxTrain), ...'Classifier', 'svm', ...'TextRepresentation', 'tfidf');% 評估性能
YPred = classify(classifier, bag(idxTest));
accuracy = mean(YPred == tbl.Sentiment(idxTest));
fprintf('情感分析準確率: %.2f%%\n', accuracy*100);