【大语言模型】基础:如何处理文章,向量化与BoW

news2024/11/23 8:42:02

词袋模型(BoW)是自然语言处理(NLP)和机器学习中一种简单而广泛使用的文本表示方法。它将文本文档转换为数值特征向量,使得可以对文本数据执行数学和统计操作。词袋模型将文本视为无序的单词集合(或“袋”),忽略语法和单词顺序但保留重数。

我们研究两种类型的词袋向量:

  • 原始计数:实际计算文本中每个单词出现的次数
  • TF-IDF:调整原始计数,以偏好那些在少数文档中大量出现的单词,而不是那些在所有文档中广泛出现的单词

定义

文档语料库

  • 文档是您用例的最小文本单位
  • 语料库是您的文档集合
  • 用例:考虑您正在寻找答案的典型问题
  • 查询:您将用来在语料库中搜索的文本

分词器

分词器是一个程序,它接收文本并将其拆分成更小的单元。一本书可以被拆分成章节、段落、句子、单词。这些都是分词过程的例子。

一旦文本被分词成句子,您就可以将句子分词成单词。

句子

在自然语言中,文本由多个句子组成,句子之间通过如.这样的标点符号分隔。然而,将文本拆分成句子仍然是一个挑战,因为一些.表示缩写,例如。

单词

任何文本都是由单词组成的。有时它们通过空格或标点符号很好地分隔开来。如同句子一样,有些单词包含标点符号,比如U.S.A.to court-martial

词汇表:语料库中使用的独特单词列表。

下面我们用一些实例来演示如何讲一篇长文章进行分割并且将其中的单词向量化等。

import numpy as np
import math
import pandas as pd

1. 下载语料库

我们将使用某些来自阿瑟·柯南·道尔爵士的《波希米亚的丑闻》这一福尔摩斯故事的短片段。

我们将从这本书的第一段开始。

语料库(Corpus):《波希米亚的丑闻》中的所有句子

文档(Document):书中的1个句子

import requests

r = requests.get('https://sherlock-holm.es/stories/plain-text/scan.txt')

assert r.status_code == 200

with open('scandal_in_bohemia.txt', 'w') as out:
    out.write(r.content.decode('utf-8'))
lines = [txt for txt in open('scandal_in_bohemia.txt') if len(txt.strip()) > 0]

print(lines[:20])

# First Paragraph
par = ' '.join([x.strip() for x in lines[7:25]])

import textwrap
print(textwrap.fill(par, width=80))

2. 引入NLK库

import nltk
nltk.download('punkt')

3. 引入sentence tokenizer讲一篇文章分割成句子

from nltk.tokenize import sent_tokenize
nltk_sentences = sent_tokenize(par)
nltk_sentences

3. 引入word tokenizer讲一个句子分割成单词

from nltk.tokenize import word_tokenize
nltk_tokens = word_tokenize(nltk_sentences[0])
nltk_tokens

我们也可以利用SpaCy进行类似的转换,代码如下:

import spacy
nlp = spacy.load('en_core_web_sm')
doc = nlp(par)

spacy_sentences = list(doc.sents)
spacy_sentences

spacy_tokens = [x for x in spacy_sentences[0]]
spacy_tokens

4. 向量化

下面我们来定义一个function用来显示文章中的单词,方法的输入为向量器,可以是CountVectorizer :

#文字向量化
from sklearn.feature_extraction.text import CountVectorizer

def show_vocabulary(vectorizer):
    words = vectorizer.get_feature_names_out()

    print(f'Vocabulary size: {len(words)} words')

    # we can print ~10 words per line
    for l in np.array_split(words, math.ceil(len(words) / 10)):
        print(''.join([f'{x:<15}' for x in l]))

count_small = CountVectorizer(lowercase=False) #没有将单词转化成小写
count_small.fit(nltk_sentences)
show_vocabulary(count_small)


输出结果:

  • words = vectorizer.get_feature_names_out(): 此行在向量器对象上调用方法 get_feature_names_out()。此方法返回向量器从数据中学到的特征名称(单词或符号)的数组。这些名称代表转换后的特征矩阵中的列。
  • 循环 for l in np.array_split(words, math.ceil(len(words) / 10)):words 数组分割成较小的块,目标是每块大约10个单词。np.array_split 是一个来自NumPy的函数,用于将数组划分成多个子数组。
  • math.ceil(len(words) / 10) 通过将单词总数除以10并向上取整来计算块的数量,以确保即使总数不是10的完美倍数也包括所有单词
  • ''.join([f'{x:<15}' for x in l]): 在循环内部,列表推导为块 l 中的每个单词生成一个格式化字符串。格式说明符 {x:<15} 为单词 x 添加填充,确保它至少占用15个字符,使输出整齐地排列成列。
  • ''.join(...) 将列表中的所有格式化字符串连接成一个字符串,然后打印。这导致每个单词块被打印在新行上,每个单词之间间隔均匀。

如果我们将lowercase=Ture,讲所有大写转化成小写;输出结果为:

count_small = CountVectorizer(lowercase=True)
count_small.fit(nltk_sentences)
show_vocabulary(count_small)

下面定义另外一个function用来显示向量化的结果:

import os
os.environ["FORCE_COLOR"] = "1"

#termcolor 是一个用于给终端文本上色的Python模块。
#此导入对于下面定义的输出函数的视觉方面至关重要。
from termcolor import colored

def show_bow(vectorizer, bow):
    words = vectorizer.get_feature_names_out()

    # we can print ~8 words + coefs per line
    for l in np.array_split(list(zip(words, bow)), math.ceil(len(words) / 8)):
        print(' | '.join([colored(f'{w:<15}:{n:>2}', 'grey') if int(n) == 0 else colored(f'{w:<15}:{n:>2}', on_color='on_yellow', attrs=['bold']) for w, n in l ]))

def show_bow_float(vectorizer, bow):
    words = vectorizer.get_feature_names_out()

    # we can print ~6 words + coefs per line
    for l in np.array_split(list(zip(words, bow)), math.ceil(len(words) / 6)):
        print(' | '.join([colored(f'{w:<15}:{float(n):>0.2f}', 'grey') if float(n) == 0 else colored(f'{w:<15}:{float(n):>0.2f}', on_color='on_yellow', attrs=['bold']) for w, n in l ]))


s = nltk_sentences[0]

print(f'Text: "{s}"')
bow = count_small.transform([s])
print(f'BoW Shape: {bow.shape}')
bow = bow.toarray()   # From sparse matrix to dense matrix (Careful with MEMORY)
print(f'BoW Vector: {bow}')

show_bow(count_small, bow[0])

函数 show_bow(vectorizer, bow)

  • 目的:显示整数计数的词袋向量。
  • 参数
    • vectorizer:一个向量器对象,具有 get_feature_names_out() 等方法,通常来自诸如scikit-learn(例如,CountVectorizer)的库。
    • bow:一个词袋向量(通常是一个稀疏数组或列表),包含由向量器确定的每个单词的频率计数。
  • 过程
    • 从向量器中检索词汇,并将每个单词与其在 bow 中对应的计数配对。
    • 将单词和计数配对在一起,然后将它们分成每行大约8对。
    • 打印每个单词及其计数,突出显示非零计数(用黄色加粗显示),以便它们在灰色显示的零计数中脱颖而出。

函数 show_bow_float(vectorizer, bow)

  • 目的:显示浮点系数的词袋向量(BoW),适用于如TF-IDF这样的情况,其中计数已标准化。
  • 参数
    • show_bow 类似,但预期 bow 向量包含浮点数。
  • 过程
    • show_bow 类似,但将数字格式化为浮点数,并调整显示以适应每行约6对的格式,因为浮点表示需要额外的空间。

运行结果:

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

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

相关文章

洛谷题单 -- 图论的简单入门

B3643 图的存储 链接 : 图的存储 - 洛谷 思路 : 这一题要考察图的存储方式 , 一般可以使用邻接矩阵 或 邻接表来存储 图的结点 和1 边的信息 &#xff0c;详情请看代码 : 代码 #include<bits/stdc.h> using namespace std;const int N 1010 ; int n , m ; int …

建造者模式:构造复杂对象的艺术

在面向对象的设计中&#xff0c;建造者模式是一种重要的创建型设计模式&#xff0c;专门用来构建复杂的对象。它主要目的是将对象的构造代码与其表示代码分离&#xff0c;使同样的构建过程可以创建不同的表示。本文将详细介绍建造者模式的定义、实现、应用场景以及优缺点&#…

VBA中如何对工作表进行排序

代码 在VBA中对工作表进行排序的最简单方法是直接使用Move方法来移动工作表。 Sub SortSheetsByNameDescending()Dim sheetsDim sheet As WorksheetDim i As Integer, j As IntegerDim sortedSheets() As Array 获取当前工作簿中的所有工作表Set sheets ThisWorkbook.Sheets…

【深入理解Java IO流0x09】解读Java NIO核心知识(下篇)

1. NIO简介 在开始前&#xff0c;让我们再简单回顾一下NIO。 在传统的 Java I/O 模型&#xff08;BIO&#xff09;中&#xff0c;I/O 操作是以阻塞的方式进行的。也就是说&#xff0c;当一个线程执行一个 I/O 操作时&#xff0c;它会被阻塞直到操作完成。这种阻塞模型在处理多…

【研发效能·创享大会-嗨享技术轰趴】-IDCF五周年专场

一、这是一场创新分享局&#xff01; 来吧&#xff0c;朋友们! 参加一场包含AIGC、BizDevOps、ToB产品管理、B端产品运营、平台工程、研发效能、研发度量、职业画布、DevOps国标解读的研发效能创享大会&#xff0c;会有哪些收益呢&#xff1f; 知识更新与技能提升&#xff1a;…

给现有rabbitmq集群添加rabbitmq节点

现有的&#xff1a;10.2.59.216 rabbit-node1 10.2.59.217 rabbit-node2 新增 10.2.59.199 rabbit-node3 1、分别到官网下载erlang、rabbitmq安装包&#xff0c;我得版本跟现有集群保持一致。 erlang安装包&#xff1a;otp_src_22.0.tar.gz rabbitmq安装包&#xff1…

Linux系统启动过程详解

启动过程是指计算机从开机自检到操作系统完全加载的一系列动作。深入理解启动过程对于有效解决启动问题、提升系统性能以及高效管理系统的启动组件至关重要。例如&#xff0c;可以帮助我们识别和处理在启动过程中可能出现的诸如硬件故障、配置错误等问题。例如帮助我们个性化定…

C语言之九九乘法表||素数||最小公倍数

一、九九乘法表 &#xff08;1&#xff09;思路 1、九九乘法表中存在三个变量&#xff0c;以 x1 ; x2 ; y 为例&#xff08;这里也可以使用两个变量&#xff0c;用x1和x2来表示y&#xff0c;方法一样&#xff09; 2、想好了变量之后&#xff0c;我们要想怎样将他实现呢&#x…

Robotstudio2024中从备份文件恢复和创建工作站的具体方法演示

Robotstudio2024中从备份文件恢复和创建工作站的具体方法演示 如下图所示,打开Robotstudio2024软件,有需要的可以从以下链接获取: ABB机器人编程仿真软件RobotStudio 2024.1-链接baiduyun 点击“新建”—工作站—创建, 如下图所示,点击“ABB模型库”,选择自己使用的机器…

二刷大数据(一)- Hadoop

目录 大数据4V Hadoop概念Hadoop大版本区别HDFS产生背景架构文件块大小写文件流程读数据流程NameNode & SecondNameNodeDataNode工作机制 YARNMapReduce为什么不适合实时核心思想切片与MapTask原理MapTask机制MapReduceApplicationMasterApplicationMaster shuffle机制Redu…

jenkins+sonar配置

安装插件 Sonar Scanner 用于扫描项目 配置sonar scanner jenkins集成sonar 1、sonar生成token 生成完保存好&#xff0c;刷新后无法查看 2、jenkins配置全局凭据 3、jenkins配置系统设置

扭蛋机小程序:线上扭蛋机模式发展空间有多大?

潮玩行业近几年的发展非常快&#xff0c;推动了扭蛋机市场的发展&#xff0c;越来越多的人加入到了扭蛋机赛道中&#xff0c;市场迎来了新的发展期。如今&#xff0c;我国的二次元文化的发展不断成熟&#xff0c;扭蛋机主打的二次元商品迎来了更多的商业机会。 一、互联网扭蛋机…

改变LoRA的初始化方式,北大新方法PiSSA显著提升微调效果

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 随着大模型的参数量日益增长&#xff0c;微调整个模型的开销逐渐变得难以接受。 为此&#x…

RestTemplate—微服务远程调用—案例解析

简介&#xff1a;总结来说&#xff0c;微服务之间的调用方式有多种&#xff0c;选择哪种方式取决于具体的业务需求、技术栈和架构设计。RESTful API和HTTP客户端是常见的选择&#xff0c;而Feign和Ribbon等辅助库可以简化调用过程。RPC和消息队列适用于特定的场景&#xff0c;如…

FPGA - 以太网UDP通信(三)

一&#xff0c;引言 前文链接&#xff1a;FPGA - 以太网UDP通信&#xff08;一&#xff09; FPGA - 以太网UDP通信&#xff08;二&#xff09; 在以上文章中介绍了以太网简介&#xff0c;以太网UDP通信硬件结构&#xff0c;以及PHY芯片RGMII接口-GMII接口转换逻辑&#xff0c…

Node.js从基础到高级运用】二十三、Node.js中自动重启服务器

引言 在Node.js开发过程中&#xff0c;我们经常需要修改代码后重启服务器来应用这些更改。手动重启不仅效率低下&#xff0c;而且会打断开发流程。幸运的是&#xff0c;有一些工具可以帮助我们自动化这个过程。本文将介绍如何使用nodemon来实现Node.js服务器的自动重启。 什么是…

清楚明了的凸松弛最优潮流!基于混合整数二阶锥规划的主动配电网最优潮流研究程序代码!

前言 最优潮流(optimal power flow&#xff0c;OPF)问题&#xff0c;是电力系统中最常见、最基础的一类优化问题。在满足基尔霍夫定律、线路容量约束以及运行安全约束等电力网络物理约束的前提下&#xff0c;OPF问题旨在寻找一个最优的潮流稳态工作点&#xff0c;使得在该工作…

【LAMMPS学习】八、基础知识(2.5)恒压器

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

WebSocket一篇讲清楚

文章目录 WebSocket简介WebSocket与HTTP的区别WebSocket的工作原理WebSocket的应用场景WebSocket的使用WebSocket 属性WebSocket 事件WebSocket 方法 WebSocket的心跳机制WebSocket 的安全性和跨域问题如何处理&#xff1f;有哪些好用的客户端WebSocket第三方库总结 WebSocket简…

代码随想录图论

1. 所有可能的路径 class Solution:def allPathsSourceTarget(self, graph: List[List[int]]) -> List[List[int]]:def dfs(graph, result, path, root): #result 返回结果, path记录路径, root记录遍历到了第几个节点if root len(graph) - 1: #如果遍历到最后…