文本特征处理是自然语言处理中的一个重要步骤,它直接影响机器学习模型的性能。除了上述提到的常见特征处理技术,n-gram 特征和文本长度规范也是常见且有用的特征提取方法。以下是它们的详细介绍:
1. 添加 N-gram 特征
1.1 定义
N-gram 是文本分析中用于表示文本片段的连续单词序列。通过考虑多个连续的词,N-gram 能够捕捉更丰富的上下文信息。
1-gram(unigram):单个词。
2-gram(bigram):两个连续的词。
3-gram(trigram):三个连续的词。
1.2 优缺点
优点:
可以捕捉词汇之间的上下文关系,增强信息的表达力。
适用于处理一些特定任务,如文本分类、情感分析等,能够提高模型的性能。
缺点:
随着 N 的增加,特征维度会迅速增大,需要更多的计算资源和内存。
在稀疏数据中容易导致过拟合。
1.3 示例代码
1.3.1 使用 n-gram 特征提取(方法1)
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
# 示例文本
documents = [
"I love programming.",
"Programming is fun.",
"I love fun."
]
# 创建n-gram特征,n=2表示bigram
vectorizer = CountVectorizer(ngram_range=(1, 2)) # 1-gram和2-gram
X = vectorizer.fit_transform(documents)
# 转换为数组
print(X.toarray())
# 使用 get_feature_names() 方法
print(vectorizer.get_feature_names())
1.3.2 使用 n-gram 特征提取(方法2)
def create_ngram_set(input_list,ngram_range):
"""
# ⼀般n-gram中的n取2或者3, 这⾥取2为例
description: 从数值列表中提取所有的n-gram特征
:param input_list: 输⼊的数值列表, 可以看作是词汇映射后的列表,
⾥⾯每个数字的取值范围为[1, 25000]
:return: n-gram特征组成的集合
eg:
>>> create_ngram_set([1, 4, 9, 4, 1, 4])
{(4, 9), (4, 1), (1, 4), (9, 4)}
"""
return set(zip(*[input_list[i:] for i in range(ngram_range)]))
input_list = [1, 3, 2, 1, 5, 3]
res = create_ngram_set(input_list,2)
print(res)
2. 文本长度规范
2.1 定义
文本长度规范是指对文档或句子的长度进行标准化处理,以便提取与长度相关的特征。这一过程可以帮助模型理解文本的结构特征,以及识别短文本和长文本之间的差异。
2.2 常用的文本长度处理方法
长度标准化:将文本长度(单词数或字符数)标准化为均值和方差,以适应模型的要求。
长度分段:根据文本长度将文本分为不同的段并进行编码,比如短文本、中等文本和长文本。这可以通过简单的计数或离散化方法实现。
序列数据处理方法:为了让所有序列具有相同的长度,通常使用填充方法,将短于最大长度的序列填充为最大长度,使之适应批量处理
2.3 优缺点
优点:
提高模型对文本长度信息的理解,可能有助于改善分类性能。
有助于处理长文本和短文本的特征差异,减少由文本长度引起的偏差。
2.4 示例代码
2.4.1 计算文本长度特征
import pandas as pd
# 示例文本数据
data = {
'text': [
"I love programming.",
"Programming is fun.",
"I love fun.",
"Text data processing is interesting."
]
}
# 创建 DataFrame
df = pd.DataFrame(data)
# 计算每个文本的长度(以单词为单位)
df['length'] = df['text'].apply(lambda x: len(x.split()))
# 显示结果
print(df)
2.4.2 序列数据处理
from keras.preprocessing import sequence
# cutlen根据数据分析中句⼦⻓度分布,覆盖90%左右语料的最短⻓度.
# 这⾥假定cutlen为10
cutlen = 10
def padding(x_train):
"""
description: 对输⼊⽂本张量进⾏⻓度规范
:param x_train: ⽂本的张量表示, 形如: [[1, 32, 32, 61], [2, 54, 21, 7,
19]]
:return: 进⾏截断补⻬后的⽂本张量表示
"""
# 使⽤sequence.pad_sequences即可完成
return sequence.pad_sequences(x_train, cutlen)
# 假定x_train⾥⾯有两条⽂本, ⼀条⻓度⼤于10, ⼀天⼩于10
x_train = [[1, 23, 5, 32, 55, 63, 2, 21, 78, 32, 23, 1],
[2, 32, 1, 23, 1]]
res = padding(x_train)
print(res)
3. 总结
N-gram 特征:使模型能够理解文本中的上下文和序列信息,适合许多文本分类场景。而要注意特征维度爆炸问题。
文本长度规范:使模型更好地理解文本的结构特征,可用于提高分类器的性能。
结合使用这些特征处理方法,可以为机器学习模型提供更多信息,从而提高模型的效果。