NLP:文本特征处理

文本特征处理是自然语言处理中的一个重要步骤,它直接影响机器学习模型的性能。除了上述提到的常见特征处理技术,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 特征:使模型能够理解文本中的上下文和序列信息,适合许多文本分类场景。而要注意特征维度爆炸问题。
文本长度规范:使模型更好地理解文本的结构特征,可用于提高分类器的性能。

结合使用这些特征处理方法,可以为机器学习模型提供更多信息,从而提高模型的效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值