MATLAB NLP 工具箱 文本预处理教程

文章目录


前言

以下是 MATLAB 自然语言处理 (NLP) 工具箱的文本预处理教程,涵盖核心步骤、代码实现及最佳实践。


一、文本预处理核心步骤

文本清理:去除 HTML 标签、特殊字符、数字等
分词:将文本拆分为单词或子词
大小写统一:通常转换为小写
停用词过滤:移除无实际意义的高频词
词干提取 / 词形还原:将词还原为基本形式
拼写检查与校正
向量化:将文本转换为数值表示

二、MATLAB 实现示例

  1. 文本数据导入与基本清理
% 导入文本数据
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);
  1. 分词与停用词过滤
% 分词
tokenizedData = tokenizedDocument(tbl.Text);

% 移除停用词
stopWords = stopwords('english');
cleanTokens = removeWords(tokenizedData, stopWords);

% 移除短词(长度<3)
cleanTokens = removeShortWords(cleanTokens, 3);
  1. 词干提取与词形还原
% 词干提取(Porter算法)
stemmedTokens = stemWords(cleanTokens);

% 词形还原(更精确但计算开销大)
lemmatizer = trainDocumentlemmatizer(cleanTokens);
lemmatizedTokens = lemmatize(lemmatizer, cleanTokens);
  1. 拼写检查与校正
% 创建拼写检查器
speller = spellChecker('text', cleanTokens);

% 校正拼写错误
correctedTokens = correctWords(speller, cleanTokens);
  1. 向量化表示
% 词袋模型(BOW)
bag = bagOfWords(correctedTokens);

% TF-IDF特征
tfidf = tfidf(bag);

% 词嵌入表示
embedding = wordEmbedding(correctedTokens, 'NumDimensions', 100);
docVectors = transform(embedding, correctedTokens);

三、高级预处理技术

  1. 词性标注 (Part-of-Speech Tagging)
% 训练词性标注器
posTagger = trainPOSTagger(correctedTokens);

% 对文本进行词性标注
taggedTokens = posTag(posTagger, correctedTokens);

% 仅保留名词和动词
nounsAndVerbs = selectByPOS(taggedTokens, {'NN', 'NNS', 'VB', 'VBD', 'VBG'});
  1. 命名实体识别 (NER)
% 加载预训练NER模型
nerNet = nerNetwork('english');

% 识别命名实体
entities = recognizeNamedEntities(nerNet, tbl.Text);

% 提取人名和组织名
persons = entities(contains(entities.Type, 'PERSON'), :);
organizations = entities(contains(entities.Type, 'ORG'), :);
  1. 情感分析预处理
% 保留情感相关标点符号
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);
本文是转载文章,点击查看原文
如有侵权,请联系 lx@jishuguiji.net 删除。