【如何用大语言模型快速深度学习系列】从n-gram到TFIDF

news2024/9/28 7:25:11

感谢上一期能够进入csdn“每日推荐看”,那必然带着热情写下第二期《从n-gram到TFIDF》,这里引入一本《Speach and Language Processing》第三版翻译版本(语音与语言处理(SLP)),前半部分写的很好!里面连编辑距离(海明距离)都讲了,所以算很详细的了。那本期末尾留一个坑,利用编辑距离计算文本相似度!

上一节精彩回顾 原文链接

  1. 我们学习了词袋模型,并且仅使用了jieba库就完成了两段文本的相似度的比较

上一节todo

  1. 做jieba的详细介绍。目标:能制作自己需要的词典,让jieba能根据自身需求进行“改变”。

第二节 n-gram

基本概念

概念
后者的举例确实生动形象一些。

理解

将我的理解通俗易懂的讲解一波:理解n-gram,那必然得从1-gram,2-gram,3-gram开始入手,1-gram就是指one by one,一个词一个词的统计,我们接着用上一节的举例:

1-gram

  • 我喜欢看电影
    用单词出现次数来表示:【“我”:1.“喜欢”:1,“看”:1,“电影”,1】
  • 我喜欢看电影尤其好看的电影(为了方便演示,我去了标点)
    用单词出现次数来表示:【“我”:1,“喜欢”:1,“看”:1,“电影”:2,“尤其”:1,“好看的”:1】

对于中文,其实这个词的概念是模糊的,英文中,for 循环就能轻易做到,而我们恰恰多出来的,就是前文中用jieba库让它分成词(特指:自然语言处理的最小单位)

2-gram(Bigram)

  • 我喜欢看电影。
    用2-词片段出现次数来表示:【“我喜欢”:1.“喜欢看”:1,“看电影”:1】
  • 我喜欢看电影尤其好看的电影。
    用2-词片段出现次数来表示:【“我喜欢”:1,“喜欢看”:1,“看电影”:1,“电影尤其”:1,”尤其好看的”:1,“好看的电影”:1】

显然,在以两个词为切片的情况下,“看电影”与“好看的电影”从有一半相似,变成了完全不同的两个内容,思考一下,这合理吗?

  1. 从语法层面,一个是动词词组,一个是名词词组,分成两个完全不同的内容是合理的”。
  2. 从语义层,“看电影”与“好看的电影”仿佛又有千丝万缕的关系。

n-gram练习

input 一段文本
input n
output n-gram切片后的文本

#todo 

大模型给的参考案例:

import jieba  # 导入jieba库

def generate_2grams(words):  # 定义一个名为generate_2grams的函数,用于生成2-gram序列
    ngrams = []  # 初始化一个空列表ngrams,用于存储2-gram序列
    for i in range(len(words) - 1):  # 对于单词列表中的每个单词,执行以下操作
        ngrams.append((words[i], words[i+1]))  # 将当前单词和下一个单词组成一个元组,并将其添加到ngrams列表中
    return ngrams  # 返回生成的2-gram序列
text = "我爱自然语言处理技术"  # 定义要进行分词的文本
words = jieba.lcut(text)  # 使用jieba库对文本进行分词,并将结果存储在变量words中
ngrams = generate_2grams(words)  # 调用generate_2grams函数生成2-gram序列,并将结果存储在变量ngrams中
print(list(ngrams))  # 将2-gram序列转换为列表类型并打印出来

inscode给的案例

import jieba

text = "今天天气很好,适合出去散步"
tokens = list(jieba.cut(text))  # 使用jieba的分词工具对文本进行分词,并将结果转换为列表
trigrams = zip(tokens, tokens[1:], tokens[2:])  # 使用zip函数将列表中三个连续元素组成一个三元组
for trigram in trigrams:
    print(trigram)

应用

应用场景
应用

easy项目案例(哈哈哈哈,自创easy项目)

鲁迅风格的一句话补全。

准备:一个txt文件,n-gram基础知识(上文)

参考:
输入:世上本没有路
输出:世上本没有路,走的人多了也便成了路。

#todo 下午写

大模型给的代码案例,可以读一个文件夹中的所有txt文件等,等于把easy项目做成了easy大项目咯!

import jieba
from collections import Counter
import os

# 定义一个函数,用于从文件夹中获取文件列表
def get_file_list(path):
    file_list = []
    for root, dirs, files in os.walk(path):
        for file in files:
            if file.endswith('.txt'): # 只获取以。txt结尾的文件
                file_list.append(os.path.join(root, file))
    return file_list

# 定义一个函数,用于从文件中提取文本内容
def extract_text(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        text = f.read()
    return text

# 定义一个函数,用于生成n-gram序列并统计每个n-gram出现的次数
def generate_ngrams(text, n):
    ngram_sequences = list(ngrams(text.split(), n))
    ngram_counts = Counter(ngram_sequences)
    return ngram_counts

# 定义一个函数,用于找到出现次数最多的n-gram序列并补全缺失的单词
def complete_ngram(ngram, text):
    ngram_list = list(ngram)
    for i in range(len(ngram_list)-1):
        if ngram_list[i] not in text:
            ngram_list[i] = '*' # 用星号代替缺失的单词
    return tuple(ngram_list)

# 定义一个函数,用于将补全后的句子输出到控制台或文件中
def print_result(result, output_file=None):
    if output_file is not None:
        with open(output_file, 'w', encoding='utf-8') as f:
            f.write("补全后的句子: " + str(result) + "\n")
        print("补全后的句子已保存到文件中")
    else:
        print("补全后的句子:", result)



# 定义一个函数,用于读取鲁迅全集并生成文本内容和n-gram序列
def read_luxun_books():
    luxun_books_path = "path/to/luxun/books" # 请替换为实际路径
    ngrams = {} # 将所有书籍的文本内容和n-gram序列存储在一个字典中,方便后续处理和比较
    for book in os.listdir(luxun_books_path): # 对于每个书籍文件进行处理
        book_path = os.path.join(luxun_books_path, book) # 获取书籍文件的完整路径
        if book.endswith('.txt'): # 只获取以。txt结尾的文件
            text = extract_text(book_path) # 从文件中提取文本内容
            ngram_counts = generate_ngrams(text, n=3) # 生成3-gram序列并统计每个序列出现的次数
            ngrams[book] = (tuple(ngram), ngram_counts) # 将当前书籍的文本内容和3-gram序列存储在字典中,方便后续处理和比较

    max_count = max([v[1]['*'] for v in ngrams.values()]) # 找到出现次数最多的单词出现次数,即缺失单词最多的情况
    max_book = [k for k, v in ngrams.items() if v[1]['*'] == max_count][0] # 找到出现次数最多的单词所在的书籍名称,即缺失单词最多的书籍名称
    max_ngram = [v[0] for v in ngrams[max_book]] # 将缺失单词最多的书籍的所有3-gram序列存储在一个列表中,方便进行补全操作
    max_ngram.sort() # 对3-gram序列进行排序,以便后面的处理操作可以按照一定的顺序进行
    max_ngram = max([v for v in max_ngram if v != '*']) # 将所有用星号代替的单词删除,只保留需要补全的单词列表中的单词
    max_result = complete_ngram(tuple('*'.join(max_ngram)), text) # 将缺失单词列表中的单词按照原来的顺序组合成一个新的3-gram序列,然后调用complete_ngram函数进行补全操作,得到最终结果
    print("鲁迅全集中缺失单词最多的情况是:") # 在控制台输出提示信息
    print("缺失单词最多的书籍名称是:", max_book) # 在控制台输出缺失单词最多的书籍名称和对应的3-gram序列列表
    print("缺失单词最多的情况补全后的结果是:", max_result) # 在控制台输出补全后的结果
    print("将补全后的句子输出到控制台或文件中") # 在控制台输出提示信息,告诉用户可以将结果输出到控制台或文件中进行查看或保存操作

InsCode 提供的案例,深得我心!

import jieba
import random

# 读取文本内容
with open("input.txt", "r", encoding="utf-8") as f:
    corpus = f.read()

# 使用jieba分词对文本进行处理
tokens = list(jieba.cut(corpus))

# 定义n-gram模型的n值
n = 3

# 构建n-gram模型
ngrams = []
for i in range(len(tokens) - n + 1):
    ngrams.append("".join(tokens[i:i+n]))
    
# 定义隐马尔可夫模型的参数
states = ["路", "人"]
observations = list(set(ngrams))
start_probability = {"路": 1.0, "人": 0.0}
transition_probability = {
    "路": {"路": 0.5, "人": 0.5},
    "人": {"路": 0.5, "人": 0.5}
}
emission_probability = {}
for token in observations:
    probs = {
        "路": 1.0 if token.startswith("路") else 0.0,
        "人": 1.0 if token.startswith("人") else 0.0
    }
    emission_probability[token] = probs

# 生成鲁迅风格的一句话
result = "世上本没有路,走的人多了,"
while len(result) < 30:
    # 从当前状态出发,根据隐马尔可夫模型的参数随机生成下一个状态
    current_state = result[-1]
    next_state = random.choices(states, [transition_probability[current_state][s] for s in states])[0]
    
    # 从下一个状态出发,根据隐马尔可夫模型的参数随机生成下一个观测值
    next_token = random.choices(observations, [emission_probability[o][next_state] for o in observations])[0]
    
    # 将生成的观测值添加到结果中
    result += next_token[1:]

print(result)


第三节 tfidf

下午写

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

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

相关文章

软件测试的概念与过程---项目启动与需求评审

软件测试的概念与过程---项目启动与需求评审 1、项目启动参加的人员成员组成 2、需求评审 1、项目启动参加的人员 成员组成 项目经理: 为项目的成功策划和执行负总责的人产品经理: 根据市场的需求制定需求分析研发组长: 1.负责本小组的安全工作和日常研发工作 2.对组内人员…

High Performance Visual Tracking with Siamese Region Proposal Network(SiamRPN)

High Performance Visual Tracking with Siamese Region Proposal Network&#xff08;SiamRPN&#xff0c;CVPR2018&#xff09; 主要贡献&#xff1a; 提出了SiamRPN跟踪器&#xff0c;首次将端到端的离线训练方式&#xff0c;应用到了大尺度的图像跟踪任务上在在线跟踪过程…

Elasticsearch 分词器切词器分析器

normalization : 文档规范化 先切词,然后规范化. 规范化要规范哪些内容? 大小写; 标点符号; 时态; 复数; 规范化主要是为了匹配更精准 character filter : 字符过滤器. 标点符号 分词之前的预处理&#xff0c;过滤无用字符 HTML Strip Character Filter &#xff1a;htm…

【C3】内核模块,设备号,字符驱动,设备节点

文章目录 1.内核模块&#xff1a;必须包含module.h2.内核模块参数&#xff1a;权限位是用在sysfs文件系统里&#xff0c;只读权限用S_IRUGO设置2.1 extern&#xff1a;声明来自另一个模块 3.设备号&#xff1a;主设备号对应驱动程序&#xff0c;具有相同主设备号设备使用相同驱…

Android Studio Bot 下载使用

Android Studio Bot 下载使用 本文最新更新地址 https://gitee.com/chenjim/chenjimblog 下载 Android Studio Hedgehog 当前的新版本是 2023.1.1 Canary 10找到Studio Bot: View->Tool Windows->Studio Bot&#xff0c;或者下图 登录 Google 账号&#xff0c;注意当前限…

Echarts拼接折线图,左右两部分设置不同的样式及formatter的处理

option {tooltip: {trigger: axis,formatter: (params) > {console.log(params);if (params && params.length 2) {if (params[0].value ! -) {return 日期&#xff1a;${params[0].name}<br>${params[0].marker} ${params[0].value};} else {return 日期&a…

Spring Boot 中的分布式配置中心

Spring Boot 中的分布式配置中心 Spring Boot 是一个非常流行的 Java Web 开发框架&#xff0c;它提供了很多工具和组件来简化 Web 应用程序的开发。其中&#xff0c;分布式配置中心是 Spring Boot 中的一个非常重要的组件&#xff0c;它可以帮助我们管理应用程序中的配置信息…

Android---SQLite优化

SQLite 是一款轻型的数据库&#xff0c;是遵循 ACID 关系型数据库管理系统&#xff0c;它包含在一个相对小的 C 库中。它是 D.RichardHipp 建立的公有领域项目。它的设计目的是嵌入式的&#xff0c;而且目前已经在很多嵌入式产品中使用了它&#xff0c;它占用资源非常的低&…

日期时间~

1&#xff1a;Data类的概述 Data类的对象在Java中代表的是当前所在系统的此刻日期时间 2&#xff1a;Data的构造器 3&#xff1a;常用方法 2:SimpleDateFormat 可以对Date对象或时间毫秒值格式化成我们喜欢的时间形式。也可以把字符串的时间形式解析成日期对象 1&#xff1…

计算机网络编程 | 多路I/O转接服务器

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

大模型在银行业客服中心的应用

随着金融科技领域的不断发展&#xff0c;金融机构改变了传统方式&#xff0c;将更多服务从线下转移到线上&#xff0c;为了提升客户体验和效率&#xff0c;金融机构不断探索自然语言处理、机器学习等技术手段来优化客服服务&#xff0c;其中大模型技术被广泛应用&#xff0c;成…

python sorted函数多条件排序大量数据时出现错误排序

""" 求生日&#xff0c;我的理解是有四个排序条件&#xff0c;分别是&#xff0c;年月日&#xff0c;输入顺序 """ n int(input())person_list [[x for x in input().split()] for x in range(n)] print(person_list) # 给输入先后加入顺序 …

NSString 输出百分比 % 无法显示

通过 NSString 拼接显示半分比 % 符号的时候会遇到拼接了 % 但 UI 未能显示; 解决办法 在需要添加 % 处通过 %% 的表达方式即可成功输出. [NSString stringWithFormat:"%.f%%", deviceLevel * 100]; 以上便是此次分享的全部内容&#xff0c;希望能对大家有所帮助!

【TensorRT】基本介绍

TensorRT用于高效实现已经训练好的深度学习的模型的推理过程的SDK&#xff0c;能使DL模型有更快的推理速度和更高的吞吐量。官方提供Python和C两种接口&#xff0c;形式基本一致且相互对应。 1 ✨ TensorRT介绍 &#x1f35f;1.1 TensorRT的工作 分为两个时期&#xff08;构建…

flask socket版本问题

1、版本问题 问题解决 根据官方给定的兼容版本&#xff0c;从socket.io官网CDN下载最新的4.4.1版本js文件&#xff0c;https://cdn.socket.io/。 python-engineio使用版本。需要更新的javascript.socketio包&#xff0c;具体可对照官方文档Requirements部分末尾 https://flask-…

红帽宣布为RHEL 7延长4年生命周期

早前一段时间&#xff0c;红帽原本计划在2024年7月1日结束支持&#xff0c;但是Red Hat表示由于部分IT企业需要更长的时间部署和升级&#xff0c;宣布为Red Hat Enterprise Linux 7(RHEL 7)增加4年的扩展生命支持(ELS)。 据了解&#xff0c;RHEL 7于2014年发布&#xff0c;支持…

uniapp解决跨域问题

配置&#xff1a; "proxy": {"/api": {"target": "https://s2.lakala.com","changeOrigin": true,"pathRewrite": {"^/api": "/api"}}} 目标路径 https://s2.lakala.com/api/v3/labs/relat…

7.1.4 【Linux】与目录树的关系

每个文件&#xff08;不管是一般文件还是目录文件&#xff09;都会占用一个 inode &#xff0c; 且可依据文件内容的大小来分配多个 block 给该文件使用。道目录的内容在记录文件名&#xff0c; 一般文件才是实际记录数据内容的地方。 目录 当我们在 Linux 下的文件系统创建一…

STM32 创建工程(库函数)

1.新建CORE ,FWLIB,OBJ,SYSTEM,USER五个文件夹 2.新建工程选择软件包 3.OBJ文件用来存放编译中间文件 4.FWLIB官方固件库包 src 存放的是固件库的.c 文件&#xff0c;inc 存放的是对应的.h 文件 直接从模板中粘贴进即可 5.CORE 6.USER文件夹需要复制的6个文件 7. 加入上面加入…

爱玩粥的有福了,带图形界面的明日方舟皮肤的员工管理系统,数据结构期末实训满分。

&#x1f4af; 博客内容&#xff1a;复习数据结构 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前端&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&#xff01; &#x1f496; 欢迎大家&#xff1a;这里是CS…