本文旨在探讨并解决在使用Python的`CountVectorizer`进行文本向量化时,默认行为会忽略数字前的正负号(如`+83`、`-193`)的问题。我们将深入分析`CountVectorizer`的默认分词机制,并提供一种基于自定义分词器的解决方案,通过结合正则表达式精确捕捉并保留带有符号的数字,从而生成更符合预期的词袋模型。
CountVectorizer是scikit-learn库中一个强大的文本特征提取工具,它通过将文本文档转换为词频矩阵(或称词袋模型,Bag of Words)来为机器学习模型准备数据。然而,在处理包含数字及其符号(如+83、-193)的文本时,用户可能会发现最终生成的特征列名称中,这些符号被意外地移除了。例如,+83和-193可能都被识别为83和193。
这种行为并非错误,而是CountVectorizer默认分词器设计的结果。默认情况下,CountVectorizer使用一个正则表达式来识别“词”(token)。这个默认的正则表达式通常旨在匹配字母数字字符序列,而会忽略标点符号和特殊字符,包括+和-。这意味着,当它遇到+83时,+会被视为分隔符或非词字符,而83则被识别为一个词。同理,-193中的-也会被忽略,只留下193。
例如,对于以下文本数据:
RepID, Txt 1, +83 -193 -380 +55 +901 2, -94 +44 +2892 -60 3, +7010 -3840 +3993
如果直接使用默认的CountVectorizer进行处理,其输出的特征名称将是83, 193, 380, 55等,而非+83, -193。
要解决CountVectorizer忽略数字符号的问题,核心在于提供一个自定义的分词器(tokenizer)。这个自定义分词器需要能够识别并保留数字前的正负号。我们可以利用Python的re模块和正则表达式来精确地实现这一点。
我们的自定义分词函数需要能够将输入字符串按照数字(包括其可选的正负号)进行分割,并确保每个数字(带符号)作为一个独立的词项被返回。
考虑使用re.split()函数,它可以通过正则表达式将字符串分割成列表。关键在于构建一个能够捕获数字及其符号的正则表达式,并利用括号将其作为分割结果的一部分保留。
import re
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
import numpy as np
def custom_tokenizer(text):
"""
自定义分词器,用于将文本分割成词项,同时保留数字前的正负号。
参数:
text (str): 输入的文本字符串。
返回:
list: 包含所有词项的列表,例如 ['+83', '-193']。
"""
# 正则表达式解释:
# ([+-]?\d+)
# [+-]? : 匹配一个可选的 '+' 或 '-' 符号。
# \d+ : 匹配一个或多个数字。
# () : 捕获组,确保匹配到的数字及其符号作为独立的词项被返回。
# re.split() 会在匹配到的模式处分割字符串,并因为捕获组的存在,将匹配到的模式也包含在结果列表中。
tokens = [token.strip() for token in re.split('([+-]?\d+)', text) if token.strip()]
return tokens
在这个custom_tokenizer函数中:
一旦定义了custom_tokenizer,就可以将其作为参数传递给CountVectorizer的tokenizer参数。
def BOW(df_txt_series):
"""
使用自定义分词器生成词袋模型DataFrame。
参数:
df_txt_series (pd.Series): 包含待处理文本的DataFrame列。
返回:
pd.DataFrame: 词袋模型DataFrame,特征列包含带符号的数字。
"""
# 实例化CountVectorizer,并指定自定义分词器
# 注意:这里CountVectorizer的输入应是Series,而不是整个DataFrame
CountVec = CountVectorizer(tokenizer=custom_tokenizer)
# 对文本数据进行拟合和转换
Count_data = CountVec.fit_transform(df_txt_series)
# 将稀疏矩阵转换为密集数组,并创建DataFrame
cv_dataframe = pd.DataFrame(
Count_data.toarray(),
columns=CountVec.get_feature_names_out(),
index=df_txt_series.index
)
# 转换为np.uint8以节省内存,如果计数不会超过255
return cv_dataframe.astype(np.uint8)
下面是一个完整的示例,演示如何应用上述解决方案来处理包含带符号数字的文本数据:
import re
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
import numpy as np
# 1. 定义自定义分词器
def custom_tokenizer(text):
"""
自定义分词器,用于将文本分割成词项,同时保留数字前的正负号。
"""
tokens = [token.strip() for token in re.split
('([+-]?\d+)', text) if token.strip()]
return tokens
# 2. 定义词袋模型生成函数
def BOW(df_txt_series):
"""
使用自定义分词器生成词袋模型DataFrame。
"""
CountVec = CountVectorizer(tokenizer=custom_tokenizer)
Count_data = CountVec.fit_transform(df_txt_series)
cv_dataframe = pd.DataFrame(
Count_data.toarray(),
columns=CountVec.get_feature_names_out(),
index=df_txt_series.index
)
return cv_dataframe.astype(np.uint8)
# 3. 准备测试数据
data = {'RepID': [1, 2, 3],
'Txt': ['+83 -193 -380 +55 +901', '-94 +44 +2892 -60', '+7010 -3840 +3993']}
df = pd.DataFrame(data)
# 4. 调用BOW函数并打印结果
result = BOW(df['Txt'])
print("使用自定义分词器后的词袋模型:")
print(result)
# 预期输出示例:
# 使用自定义分词器后的词袋模型:
# +2892 +380 +3993 +44 +55 +7010 +83 +901 -193 -3840 -60 -94
# 0 0 1 0 0 1 0 1 1 1 0 0 0
# 1 1 0 0 1 0 0 0 0 0 0 1 1
# 2 0 0 1 0 0 1 0 0 0 1 0 0通过上述方法,我们成功地解决了CountVectorizer在处理带符号数字时忽略符号的问题,确保了文本特征提取的准确性和完整性,这对于依赖数字符号含义的分析任务至关重要。
# word
# python
# 正则表达式
# 工具
# python函数
相关文章:
兔展官网 在线制作,怎样制作微信请帖?
东莞专业制作网站的公司,东莞大学生网的网址是什么?
公司网站的制作公司,企业网站制作基本流程有哪些?
如何快速启动建站代理加盟业务?
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
广州营销型建站服务商推荐:技术优势与SEO优化解析
已有域名和空间,如何快速搭建网站?
小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?
如何快速搭建个人网站并优化SEO?
如何正确下载安装西数主机建站助手?
如何通过主机屋免费建站教程十分钟搭建网站?
如何在七牛云存储上搭建网站并设置自定义域名?
简历在线制作网站免费,免费下载个人简历的网站是哪些?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析
非常酷的网站设计制作软件,酷培ai教育官方网站?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
Python文件管理规范_工程实践说明【指导】
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
Python多线程使用规范_线程安全解析【教程】
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
宝塔面板创建网站无法访问?如何快速排查修复?
简单实现Android验证码
上海网站制作开发公司,上海买房比较好的网站有哪些?
建站之星伪静态规则如何设置?
如何配置FTP站点权限与安全设置?
javascript中的try catch异常捕获机制用法分析
建站主机服务器选购指南:轻量应用与VPS配置解析
已有域名和空间如何快速搭建网站?
建站之星导航配置指南:自助建站与SEO优化全解析
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
长沙企业网站制作哪家好,长沙水业集团官方网站?
建站之星安装后如何配置SEO及设计样式?
如何用免费手机建站系统零基础打造专业网站?
上海网站制作网站建设公司,建筑电工证网上查询系统入口?
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
济南企业网站制作公司,济南社保单位网上缴费步骤?
沈阳制作网站公司排名,沈阳装饰协会官方网站?
广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?
Android滚轮选择时间控件使用详解
建站主机与服务器功能差异如何区分?
Android使用GridView实现日历的简单功能
nginx修改上传文件大小限制的方法
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
外贸公司网站制作哪家好,maersk船公司官网?
如何撰写建站申请书?关键要点有哪些?
制作证书网站有哪些,全国城建培训中心证书查询官网?
建站OpenVZ教程与优化策略:配置指南与性能提升
*请认真填写需求信息,我们会在24小时内与您取得联系。