NLP:使用 SciKit Learn 的文本矢量化方法

news2024/10/6 23:40:41

一、说明

        本文是使用所有 SciKit Learns 预处理方法生成文本数字表示的深入解释和教程。对于以下每个矢量化器,将给出一个简短的定义和实际示例:one-hot、count、dict、TfIdf 和哈希矢量化器。

        SciKit Learn 是一个用于机器学习项目的广泛库,包括多种分类器和分类算法、训练和指标收集方法以及预处理输入数据的方法。在每个 NLP 项目中,文本都需要矢量化才能被机器学习算法处理。矢量化方法包括独热编码、计数器编码、频率编码和词向量或词嵌入。其中一些方法在 SciKit Learn 中也可用。

本文的技术相关资源是 Python v3.11scikit-learn v1.2.2。所有示例也应该适用于较新的版本。这篇文章最初出现在塞巴的博客 admantium.com。

二、要求和使用的 Python 库

        本文是有关使用 Python 进行 NLP 的博客系列的一部分。在我之前的文章中,我介绍了如何创建一个维基百科文章爬虫,它将以文章名称作为输入,然后系统地下载所有链接的文章,直到达到给定的文章总数或深度。爬虫生成文本文件,然后由 WikipediaCorpus 对象进一步处理,WikipediaCorpus 对象是在 NLTK 之上自行创建的抽象,可以方便地访问单个语料库文件和语料库统计信息,例如句子、段落和词汇的数量。在本文中,WikipediaCorpus 对象仅用于加载特定文章,这些文章作为应用 Sci-Kit 学习预处理方法的示例。

三、基本示例

        以下代码片段展示了如何使用 WikipediaCorpus 对象从机器学习和人工智能开始抓取 200 个页面。

reader = WikipediaReader(dir = "articles3")
reader.crawl("Artificial Intelligence", total_number = 200)
reader.crawl("Machine Learning")
reader.process()

在此基础上,创建语料库对象:

corpus = WikipediaPlaintextCorpus('articles3')
corpus.describe()
#{'files': 189, 'paras': 15039, 'sents': 36497, 'words': 725081, 'vocab': 32633, 'max_words': 16053, 'time': 4.919918775558472}

最后,创建一个 SciKit Learn 管道,该管道将对文本进行预处理(忽略所有非文本字符和停用词)并进行标记化。

pipeline = Pipeline([
    ('corpus', WikipediaCorpusTransformer(root_path='./articles3')),
    ('preprocess', TextPreprocessor(root_path='./articles3')),
    ('tokenizer', TextTokenizer()),
])

这将生成以下数据框,以下各节将在其上应用进一步的处理步骤:

四、One-Hot 矢量化器

        独热编码是一种稀疏矩阵,其中行表示文档,列表示词汇表中的单词。每个单元格的值为 0 或 1,以指示文档中是否出现单词。

       从 SciKit 了解到OneHotEncoder,它是处理 Pandas 数据框对象中包含的数据最难获得的方法之一,因为它被设计为处理表示为元组的序号数据。因此,需要首先将包含预处理令牌的 Pandas 系列对象转换为矩阵,并提出将列数填充和修剪到合理值的特殊挑战。帮助程序方法如下:

def to_matrix(series, padding_value):
    matrix = []
    for vec in np.nditer(series.values,flags=("refs_ok",)):
        v = vec.tolist()
        pad = ['' for i in range(0, padding_value)]
        matrix.append([*v, *pad][:padding_value])

    return matrix

下面是应用于人工智能文章时生成的数据结构(包括填充)的示例:

x_t = to_matrix(X['tokens'], 10000)
#['a.i', '.', 'artificial', 'intelligence', 'simply', 'a.i', '.', '2001', 'american', 'science', #'fiction', 'film', 'directed', 'steven', 'spielberg', '.', 'the', 'screenplay', 'spielberg', #'screen', 'story', 'ian', 'watson', 'based', '1969', 'short', 'story', 'supertoys', 'last',
# ... '', ''

以下示例演示如何将 one-hot-encode 应用于填充的令牌列表:

from sklearn.preprocessing import OneHotEncoder

vectorizer = OneHotEncoder(handle_unknown='ignore')
x_train = vectorizer.fit_transform(np.array(x_t).reshape(-1, 1))

print(type(x_train))
#scipy.sparse._csr.csr_matrix

print(x_train)
#  (0, 7) 1.0
#  (1, 8) 1.0
#  (2, 87) 1.0
#  (3, 64) 1.0
#  (4, 5) 1.0
#  (5, 80) 1.0
#  (6, 42) 1.0

print(vectorizer.get_feature_names_out())
# ['x0_,' 'x0_.' 'x0_...' 'x0_1948' 'x0_1953' 'x0_1968' 'x0_1972' 'x0_2001'
# 'x0_a' 'x0_additionally' 'x0_after' 'x0_amazing' 'x0_arthur' 'x0_artwork'
# 'x0_background' 'x0_based' 'x0_bbc' 'x0_before' 'x0_both' 'x0_breaking'
# 'x0_c.' 'x0_carnon' 'x0_clarke' 'x0_collaboration' 'x0_comet' 'x0_comics'

print(len(vectorizer.get_feature_names_out()))
# 34853

编码器生成34853特征,并具有用于解码目的的特征名称。

五、计数矢量化器

        计数向量化器是一种可定制的 SciKit Learn 预处理器方法。它适用于开箱即用的任何文本,并自行应用预处理、标记化和停用词删除。这些任务可以定制,例如通过提供不同的标记化方法或停用词列表。 (这也适用于所有其他预处理器。)将计数向量化器应用于原始文本会创建一个 (document_id, tokens) 形式的矩阵,其中值是标记计数。

        这种矢量化方法无需任何配置,也无需直接对预处理的文本进行任何额外的转换:

from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer()
x_train = vectorizer.fit_transform(X['preprocessed'])

其应用如以下代码片段所示:

print(type(x_train))
#scipy.sparse._csr.csr_matrix

print(x_train.toarray())
# [[0 0 0 ... 0 0 0]
# [0 7 0 ... 0 0 0]
# [0 3 0 ... 0 0 0]
# ...
# [0 0 0 ... 0 0 0]
# [0 1 0 ... 0 0 0]
# [0 2 0 ... 0 0 0]]

print(vectorizer.get_feature_names_out())
# array(['00', '000', '0001', ..., 'zy', 'zygomaticus', 'zygote'],
#      dtype=object)

print(len(vectorizer.get_feature_names_out()))
# 32417

此矢量化器可检测32417特征,并且还具有可解码的特征名称。

六、Dict 矢量化器

        顾名思义,它将包含文本的字典对象转换为向量。因此,它不能在原始文本中工作,而是需要文本的频率编码表示,例如词袋表示。

        以下帮助程序方法提供标记化文本中的词袋表示形式。

from collections import Counter

def bag_of_words(tokens):
  return Counter(tokens)

X['bow'] = X['tokens'].apply(lambda tokens: bag_of_words(tokens))

生成的 DataFrame 如下所示:

机器学习文章的标题是这样的:

X['bow'][184]
# Counter({',': 418,
        #  '.': 314,
        #  'learning': 224,
        #  'machine': 124,
        #  'data': 102,
        #  'training': 49,
        #  'algorithms': 46,
        #  'model': 38,
        #  'used': 35,
        #  'set': 31,
        #  'in': 30,
        #  'artificial': 29,

以下代码演示如何将矢量化器应用于额外创建的词袋表示形式。

from sklearn.feature_extraction import DictVectorizer

vectorizer = DictVectorizer(sparse=False)
x_train = vectorizer.fit_transform(X['bow'])

print(type(x_train))
#numpy.ndarray

print(x_train)
#[[ 15.   0.  10. ...   0.   0.   0.]
# [662.   0. 430. ...   0.   0.   0.]
# [316.   0. 143. ...   0.   0.   0.]
# ...
# [319.   0. 217. ...   0.   0.   0.]
# [158.   0. 147. ...   0.   0.   0.]
# [328.   0. 279. ...   0.   0.   0.]]

print(vectorizer.get_feature_names_out())
# array([',', ',1', '.', ..., 'zy', 'zygomaticus', 'zygote'], dtype=object)

print(len(vectorizer.get_feature_names_out()))
# 34872

此矢量化器可检测# 34872特征,并且还具有可解码的特征名称。

七、TfIdf 矢量化器

        术语频率/反向文档频率是信息检索中众所周知的指标。它以这样一种方式对词频进行编码,以便对许多文档中出现的常见术语以及仅在少数文档中出现的不常见术语给予同等重视。该指标在大型语料库中具有很好的概括性,并改进了查找相关主题的能力。

        SciKit Learn 实现可以直接用于已预处理的文本。但请记住,其内部步骤(如预处理和标记化)可以根据需要进行定制。

        创建此矢量化器很简单:

from sklearn.feature_extraction.text import TfidfVectorizer

vectorizer = TfidfVectorizer()
x_train = vectorizer.fit_transform(X['preprocessed'])

以下是将矢量化器应用于语料库的结果。

print(type(x_train))
# scipy.sparse._csr.csr_matrix

print(x_train.shape)
# (189, 32417)

print(x_train)
#  (0, 9744) 0.09089003669895346
#  (0, 24450) 0.0170691375156829
#  (0, 6994) 0.07291108016392849
#  (0, 6879) 0.05022416293169798
#  (0, 10405) 0.08425453878004373
#  (0, 716) 0.048914251894790796
#  (0, 32066) 0.06299157591377592
#  (0, 17926) 0.042703846745948786

print(vectorizer.get_feature_names_out())
# array(['00' '000' '0001' ... 'zy' 'zygomaticus' 'zygote'], dtype=object)

print(len(vectorizer.get_feature_names_out()))
# 32417

此矢量化器可检测特征,并且还具有可解码的特征名称。32417

八、散列矢量化器

        最终的预处理器同时是最通用且性能最高的。它创建一个包含 document_id x 标记的结构化矩阵,但这些值可以标准化为 L1(其值的总和)或 L2(所有平方向量值之和的平方根)。它还有其他好处,例如需要较低的内存并适合处理流式文档。

        HashingVector 在预处理的文本上按原样工作。

from sklearn.feature_extraction.text import HashingVectorizer

vectorizer = HashingVectorizer(norm='l1')
x_train = vectorizer.fit_transform(X['preprocessed'])

它产生以下结果:

print(type(x_train))
#scipy.sparse._csr.csr_matrix

print(x_train.shape)
#(189, 1048576)

print(x_train)
# (0, 11631) -0.006666666666666667
#  (0, 17471) -0.006666666666666667
#  (0, 26634) 0.006666666666666667
#  (0, 32006) -0.006666666666666667
#  (0, 42855) 0.006666666666666667
#  (0, 118432) 0.02666666666666667
#  (0, 118637) -0.006666666666666667

print(vectorizer.get_params())
#{'alternate_sign': True, 'analyzer': 'word', 'binary': False, 'decode_error': 'strict', 'dtype': <class 'numpy.float64'>, 'encoding': 'utf-8', 'input': 'content', 'lowercase': True, 'n_features': 1048576, 'ngram_range': (1, 1), 'norm': 'l1', 'preprocessor': None, 'stop_words': None, 'strip_accents': None, 'token_pattern': '(?u)\\b\\w\\w+\\b', 'tokenizer': None}

        此矢量化器检测文档中的特征。唉,它的功能名称无法解码。1048576

九、结论

        本文是 SciKit 学习内置文本矢量化方法的深入教程。对于以下每个矢量化器,您都看到了一个实际示例以及如何将它们应用于文本:one-hot、count、字典、TfIdf、哈希。所有矢量化器都使用默认的文本处理实用程序开箱即用,但您可以自定义预处理器、分词器和顶部单词。此外,它们可以处理原始文本本身,但字典除外,它需要文本的词袋表示,以及 one-hot 编码器,它需要手动将 Pandas 系列转换为带有标记填充的 Numpy 矩阵。

参考资料:

塞巴斯蒂安

NLP: Text Vectorization Methods with SciKit Learn | Admantium

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1233137.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

轻量封装WebGPU渲染系统示例<36>- 广告板(Billboard)(WGSL源码)

原理不再赘述&#xff0c;请见wgsl shader实现。 当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/BillboardEntityTest.ts 当前示例运行效果: WGSL顶点shader: group(0) binding(0) var<uniform> objMat :…

腾讯云CVM标准型S5性能如何?CPU采用什么型号?

腾讯云服务器CVM标准型S5实例具有稳定的计算性能&#xff0c;CVM 2核2G S5活动优惠价格280.8元一年自带1M带宽&#xff0c;15个月313.2元、2核4G配置748.2元15个月&#xff0c;CPU内存配置还可以选择4核8G、8核16G等配置&#xff0c;公网带宽可选1M、3M、5M或10M&#xff0c;腾…

维基百科文章爬虫和聚类【二】:KMeans

维基百科是丰富的信息和知识来源。它可以方便地构建为带有类别和其他文章链接的文章&#xff0c;还形成了相关文档的网络。我的 NLP 项目下载、处理和应用维基百科文章上的机器学习算法。 一、说明 在我的上一篇文章中&#xff0c;展示了该项目的轮廓&#xff0c;并奠定了其基础…

【JavaEE】Spring核心与设计思想(控制反转式程序演示、IoC、DI)

一、什么是Spring&#xff1f; 通常所说的 Spring 指的是 Spring Framework&#xff08;Spring 框架&#xff09;&#xff0c;它是⼀个开源框架&#xff0c;有着活跃⽽庞⼤的社区&#xff0c;这就是它之所以能⻓久不衰的原因。Spring ⽀持⼴泛的应⽤场景&#xff0c;它可以让 …

【机器学习】对比学习(contrastive learning)

对比学习是一种机器学习技术&#xff0c;算法学习区分相似和不相似的数据点。对比学习的目标是学习数据的表示&#xff0c;以捕捉不同数据点之间的基本结构和关系。 在对比学习中&#xff0c;算法被训练最大化相似数据点之间的相似度&#xff0c;并最小化不相似数据点之间的相似…

基于springboot实现大学生就业服务平台系统项目【项目源码】

基于springboot实现大学生就业服务平台系统演示 Java技术 Java是由SUN公司推出&#xff0c;该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称&#xff0c;也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具备了显著…

桌面运维。

Windows运行命令&#xff1a; color 01/02切换字符颜色cls 清屏ipconfig 设备的ip信息ipconfig /all 设备ip的所有信息 破解系统密码&#xff1a; 进PE系统&#xff0c;使用里面的工具破解 vmware workstation安装 网卡 网卡&#xff1a;ncpa.cpl window远程控制 mstsc …

Transformers库总体介绍

Transformers库是什么 Transformers 库是一个在自然语言处理&#xff08;NLP&#xff09;领域广泛使用的强大库&#xff0c;提供了一套全面的工具和预训练模型&#xff0c;用于执行各种 NLP 任务。以下是 transformers 库提供的主要功能&#xff1a; 1.预训练模型&#xff1a…

【开源】基于JAVA的社区买菜系统

项目编号&#xff1a; S 011 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S011&#xff0c;文末获取源码。} 项目编号&#xff1a;S011&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.1.1 数据中心模块2.1…

# 学习 Prolog 和 离散逻辑的16个等价公式:一趟有趣的逻辑之旅

Prolog 的语法很奇怪,需要一些时间来适应,所以我花了点时间,想用Prolot来表示和验证离散逻辑的16组等价公式。 1. 双重否定律 (Double Negation Law) A ⇔A 首先&#xff0c;我们来看看双重否定律。在 Prolog 中&#xff0c;我们可以这样验证它&#xff1a; fun1(A,Z):-membe…

【经验分享】Ubuntu如何设置swap交换

我的Linux小鸡内存只有512兆&#xff0c;经常爆内存&#xff0c;导致很多应用没有办法一直正常运行&#xff0c;可以通过设置swap来缓解一下&#xff0c;虽然和内存的速度无法媲美&#xff0c;但是能一定程度缓解一下问题 文章目录 1. 创建一个交换文件2. 设置正确的权限3. 设置…

程序员护城河 | 卓越的技术能力很重要,软实力同样不可或缺

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

新手教师如何迅速成长

对于许多新手教师来说&#xff0c;迈出教学的第一步可能会感到非常困难。不过&#xff0c;通过一些关键的策略和技巧&#xff0c;还是可以快速提升教学能力的&#xff0c;我将为大家提供一些实用的建议&#xff0c;帮助各位在教育领域迅速成长。 深入了解学科知识 作为一名老师…

【离散数学】——刷题题库(范式)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

python连接hive报错:TypeError: can‘t concat str to bytes

目录 一、完整报错 二、解决 三、 其他报错 一、完整报错 Traceback (most recent call last): File "D:/Gitlab/my_world/hive2csv.py", line 18, in <module> conn hive.Connection(hosthost, portport, usernameusername, passwordpassword, data…

腾讯云5年服务器2核4G和4核8G配置租用价格表

腾讯云百科整理五年云服务器优惠活动 txybk.com/go/txy 配置可选2核4G和4核8G&#xff0c;公网带宽可选1M、3M或5M&#xff0c;系统盘为50G高性能云硬盘&#xff0c;标准型S5实例CPU采用主频2.5GHz的Intel Xeon Cascade Lake或者Intel Xeon Cooper Lake处理器&#xff0c;睿频3…

什么是单片机?聊聊它的历史

前言 1946年2月15日&#xff0c;第一台电子数字计算机 ENIAC问世&#xff0c;这标志着计算机时代的到来。 ENIAC 是电子管计算机&#xff0c;时钟频率虽然仅有 100 kHz&#xff0c;但能在1s 的时间内完成 5000 次加法运算。与现代的计算机相比&#xff0c;ENIAC有许多不足&am…

人工智能对我们的生活影响有多大

随着科技的飞速发展&#xff0c;人工智能已经渗透到我们生活的方方面面&#xff0c;并且越来越受到人们的关注。从智能语音助手到自动驾驶汽车&#xff0c;从智能家居系统到医疗诊断&#xff0c;人工智能技术正在改变着我们的生活方式。那么&#xff0c;人工智能对我们的生活影…

Golang基础-面向过程篇

文章目录 基本语法变量常量函数import导包匿名导包 指针defer静态数组动态数组(slice)定义方式slice追加元素slice截取 map定义方式map使用方式 基本语法 go语言输出hello world的语法如下 package mainimport ("fmt""time" )func main() {fmt.Println(&…