自然语言处理中的文本分类、回归与序列建模
立即解锁
发布时间: 2025-09-01 01:32:16 阅读量: 7 订阅数: 7 AIGC 

# 自然语言处理中的文本分类、回归与序列建模
## 1. 文本分类与回归的常用模型
### 1.1 朴素贝叶斯(Naïve Bayes)
朴素贝叶斯得名于其特征相互独立的假设,它会基于特征值来估计类别的概率。虽然从语言学和常识来看,单词并非相互独立,但朴素贝叶斯仍是文本分类中常用的基线模型。其计算的概率与TF.IDF类似,公式如下:
\[P(class|term_1, term_2, \ldots, term_N) = \frac{P(class) \prod_{i = 1}^{N} P(term_i|class)}{\sum_{k = 1}^{K} P(class_k) \prod_{i = 1}^{N} P(term_i|class_k)}\]
若某个词在所有类别中都很常见,它对该值的贡献不大;若某个词是特定类别文档所独有的,则对朴素贝叶斯来说是重要特征,这与IDF降低常见词重要性的方式类似。
### 1.2 线性模型(Linear Models)
线性回归和逻辑回归等线性模型假设预测变量相互独立。在高维空间中,查看交互作用的方法并不适用。若使用线性模型,需在特征工程上投入更多精力,更积极地减少特征数量。
### 1.3 决策/回归树(Decision/Regression Trees)
决策树和回归树能学习非线性关系,且对特征独立性无假设。但稀疏特征会对其产生不利影响,信息增益等分裂准则更倾向于选择固有熵较小(相对不常见的词)的变量进行分裂,同时文档频率较高(方差较大)的词也更受青睐。可通过更积极地去除停用词来缓解这些问题。基于树的模型的一大优点是易于解释模型输出,便于检查学习算法是否构建了合理的模型。
### 1.4 深度学习算法(Deep Learning Algorithms)
神经网络擅长学习复杂函数,但需要大量数据,且所需数据量会随参数数量快速增加。若使用词袋法,第一层的参数数量将是词汇表大小乘以第一个隐藏层的大小,这会导致学习单词的中间表示耗时过长,还可能引发过拟合。使用词嵌入是个不错的选择,可减少分类或回归模型需要学习的参数数量。
在进行自然语言处理或机器学习时,要明确对数据的期望。训练和部署深度学习模型通常比传统机器学习模型更复杂,应先尝试最简单的方法。
## 2. 文本分类与回归的迭代流程
### 2.1 迭代流程步骤
文本分类或回归项目中,迭代周期至关重要,具体步骤如下:
1. **获取数据**:这通常是项目中最耗时的部分,无论数据是否维护良好、文档完善,都必须对其进行验证。
2. **查看数据**:处理结构化或非结构化数据时,一般都需对数据进行预处理。对于结构化数据,常需去除无效值或对字段进行归一化;对于文本数据,情况更复杂,可能需根据业务逻辑设定最小或最大长度,或根据元数据移除某些文档。此外,要检查文档编码并转换为通用编码(如UTF - 8),同时创建一个保留集,即使使用交叉验证而非训练 - 测试分割,保留一个完全未使用过的保留集也很重要,因为文本数据容易过拟合。
3. **处理数据**:与查看数据类似,需对数据进行预处理,包括去除无效值、归一化、处理文本数据的业务逻辑、检查编码和创建保留集等。
4. **特征工程**:数据处理完成后,可创建特征向量。创建特征后,应对特征进行基本的探索性分析,如查看词汇分布,也可使用主题模型(后续会详细介绍),它能为模型创建提供见解并帮助发现错误。由于自然语言处理的特征工程通常比结构化数据的特征工程更复杂,应将特征工程阶段与建模放在同一管道中,以优化模型超参数和特征工程参数。
5. **建模**:需选择合适的算法,并设定基线。文本分类和回归问题常用的基线模型有逻辑回归、朴素贝叶斯和决策树。确定特征和算法后,即可训练模型。
6. **评估**:查看数据和指标都很重要,应使用交叉验证或在专用验证集上进行迭代,保留集需留到准备投入生产时再使用。
7. **审查**:尽可能让更多人审查整个流程:
- **审查代码**:若他人不熟悉数据,数据处理代码可能难以审查,此时详细的文档很重要。
- **审查数据**:可与主题专家一起审查数据,也可让完全不熟悉数据的人参与。
- **审查特征**:创建的特征应合理,可与领域专家一起审查;若特征过于抽象,可与有类似模型构建经验的人一起审查特征背后的理论。
- **审查模型**:在建模项目中,容易陷入细节,因此审查所选算法的原理和输出很重要。
- **审查指标**:应能清晰解释指标,尤其是用于业务决策的指标。若难以找到合适的指标,可能说明问题的解决方法不够理想,有时将分类问题转化为排序问题可能更好。
- **审查文档**:确保整个流程有良好的文档记录,以保证可重复性。
验证基线模型后,需判断其是否适合投入生产。若合适,可部署;否则,需重新查看数据,开始改进指标。
### 2.2 示例代码
以下是一个使用朴素贝叶斯分类器预测文档所属新闻组的示例代码:
```python
train, test = texts.randomSplit([0.8, 0.2], seed=123)
stopwords = set(StopWordsRemover.loadDefaultStopWords("english"))
sw_remover = StopWordsRemover() \
.setInputCol("normalized") \
.setOutputCol("filtered") \
.setStopWords(list(stopwords))
count_vectorizer = CountVectorizer(inputCol='filtered',
outputCol='tf', minDF=10)
idf = IDF(inputCol='tf', outputCol='tfidf', minDocFreq=10)
text_processing_pipeline = Pipeline(stages=[
assembler,
sentence,
tokenizer,
lemmatizer,
normalizer,
finisher,
sw_remover,
count_vectorizer,
idf
])
from pyspark.ml.feature import IndexToString, StringIndexer
from pyspark.ml.classification import *
from pyspark.ml.tuning import *
from pyspark.ml.evaluation import *
label_indexer = StringIndexer(inputCol='newsgroup', outputCol='label').fit(texts)
naive_bayes = NaiveBayes(featuresCol='tfidf')
prediction_deindexer = IndexToString(inputCol='prediction', outputCol='pred_newsgroup',
labels=label_indexer.labels)
pipeline = Pipeline(stages=[
text_processing_pipeline, label_indexer, naive_bayes, prediction_deindexer
])
model = pipeline.fit(train)
train_predicted = model.transform(train)
test_predicted = model.transform(test)
evaluator = MulticlassClassificationEvaluator(metricName='f1')
print('f1', evaluator.evaluate(train_predicted))
print('f1', evaluator.evaluate(test_predicted))
```
从输出结果来看,训练数据的F1分数为0.946056760284357,测试数据的F1分数为0.6508170558
0
0
复制全文
相关推荐









