2024山东大学创新项目实训_02

文档加载

针对pdf文件

1. 安装第三方库 pypdf:

!pip install -q pypdf

2.  使用PyPDFLoader对PDF文件进行读取和加载

from langchain.document_loaders import PyPDFLoader
loader = PyPDFLoader("xx.pdf")
pages = loader.load()

3. 此时通过对pages进行操作可以得到与该PDF文件相关的内容,比如文件的总页数可以通过len(pages)得到。pages是一个List类型的数据,其中就是每一个page。输出page.page_content[0:100]就可以输出该page的前一百个字符。输出page.metadata就可以得到该page的来源(来自于哪一个PDF文件,以及是这个文件的第几个page,从0开始计数)。

针对网页文档

这一节指的是处理一个网页链接。

1. 使用WebBaseLoader来加载网页

from langchain.document_loaders import WebBaseLoader
url = ""
header = {'User-Agent': 'python-requests/2.27.1', 
          'Accept-Encoding': 'gzip, deflate, br', 
          'Accept': '*/*',
          'Connection': 'keep-alive'}
loader = WebBaseLoader(web_path=url,header_template=header)
pages = loader.load()

与PDF文件类似,我们可以得到这个网页的长度,其中某一页的数据以及元数据。

类似的,也可以用来加载Notion文档

文档分割

Langchain 中文本分割器都根据 chunk_size (块大小)和 chunk_overlap (块与块之间的重叠大小)进行分割。

  • chunk_size 指每个块包含的字符或 Token (如单词、句子等)的数量

  • chunk_overlap 指两个块之间共享的字符数量,用于保持上下文的连贯性,避免分割丢失上下文信息

借助 LangChain 提供的 RecursiveCharacterTextSplitter 和 CharacterTextSplitter 工具可以实现基于字符的分割。

使用chunk_size = 20 可以用来设置块大小,chunk_overlap = 10 可以用来设置块重叠大小。前者严格按照我们设置的这两个参数进行分割。而后者基于字符分割,需要设置一个分隔符(默认是换行符),使用后者分割可能会出现分割长度大于块大小的情况。后者可以设置一个分隔符列表,按优先级依次分割,在前面的优先级较高一些。

分割markdown文件

headers_to_split_on = [
    ("#", "Header 1"),
    ("##", "Header 2"),
    ("###", "Header 3"),
]

markdown_splitter = MarkdownHeaderTextSplitter(
    headers_to_split_on=headers_to_split_on
)#message_typemessage_type
md_header_splits = markdown_splitter.split_text(markdown_document)

print("第一个块")
print(md_header_splits[0])
print("第二个块")
print(md_header_splits[1])
#加载数据库中的markdown文件:
loader = NotionDirectoryLoader("")
docs = loader.load()
txt = ' '.join([d.page_content for d in docs])#拼接文档

headers_to_split_on = [
    ("#", "Header 1"),
    ("##", "Header 2"),
]
#加载文档分割器
markdown_splitter = MarkdownHeaderTextSplitter(
    headers_to_split_on=headers_to_split_on
)

md_header_splits = markdown_splitter.split_text(txt)#分割文本内容

print(md_header_splits[0])#分割结果

Embeddings

Embeddings(嵌入)是一种将类别数据,如单词、句子或者整个文档,转化为实数向量的技术。这些实数向量可以被计算机更好地理解和处理。嵌入背后的主要想法是,相似或相关的对象在嵌入空间中的距离应该很近。

使用:

from langchain.embeddings.openai import OpenAIEmbeddings
import numpy as np
embedding = OpenAIEmbeddings()
sentence1_chinese = "一个语句"
sentence2_chinese = "另一个语句"
embedding1_chinese = embedding.embed_query(sentence1_chinese)
embedding2_chinese = embedding.embed_query(sentence2_chinese)
np.dot(embedding1_chinese, embedding2_chinese)

该值越大说明两个语句越相似 

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值