文章目录
前言
以下是 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);