在做本地知识库时,对文本存储会首先对文本进行分割保存,这样是因为太长的文本不方便做AI的上下文。得到分割好的小段文本集后,再做向量计算,存入向量数据库后,就做好了前期准备。
实现文本分割器倒不算难,但也有几个坑,主要是对中文的支持。读取文本时必须使用encoding='gbk'
,否则分割不了。
文本分割
pip install langchain # 依赖
from langchain.text_splitter import CharacterTextSplitter
from langchain.document_loaders import TextLoader
loader = TextLoader('./russia.txt', encoding='gbk') #中文必须带 encoding='gbk'
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
# chunk_size=1000表示每次读取或写入数据时,数据的大小为1000个字节, 约500个汉字 (实际约1000字)
docs = text_splitter.split_documents(documents)
print(112, docs)
//// 得到的结果如下:
[Document(page_content='2022年1月10号到13号,俄罗斯分别与美国和北约开展对话,要求美国和北约就排除进一步东扩的可能性,提供法律保障,但是没有取得实质性的成果。\n\n2022年2月2号....、承诺不吸纳乌克兰为成员国,美国不在非北约成员国的原苏联加盟共和国领土上建立军事基地。', metadata={'source': './russia.txt'}), Document(page_content='2022年1月26日,美国和北约分别向俄罗斯递交有关安全保证建议的书面回复,拒绝不吸纳乌克兰、不在俄罗斯边境附近部署.....Azovstal 的几名捍卫者返回了家园,其中包括马里乌波尔巡逻警察的负责人 Mikhail Vershinin 和来自 Azov 的军医 Ekaterina Polishchuk,其呼号为“Bird”。', metadata={'source': './russia.txt'}), Document(page_content='近期,俄罗斯瓦格纳私营军事公司实际控制人普里戈任在社交媒体上发表声明,讽刺白宫将瓦格纳认定为“国际犯罪组织”,一时间瓦格纳集团又成了美西方媒体关注的热点。俄乌冲突爆发至今已一年有余,冲突期间,美西方和俄罗斯的私营军事公司在战场上表现异常活跃,美西方的私营军事公司为乌军提供后勤保障、技战术培训,...呼吁采取外交手段解决俄乌冲突,通过谈判实现持久和平。有示威者打出“停止北约和美国在乌克兰的战争”标语。', metadata={'source': './russia.txt'})]
# 另一种实现方法
from langchain.text_splitter import RecursiveCharacterTextSplitter
with open('./russia.txt', encoding='gbk') as f:
state_of_the_union = f.read()
text_splitter = RecursiveCharacterTextSplitter(
chunk_size = 1000,
chunk_overlap = 0,
length_function = len,
)
texts = text_splitter.create_documents([state_of_the_union])
print(123, texts)
注: 这两种方法实现的结果都差不多!
知识库的前期工作完成了一半,后面就是向量计算啰,改天再传上来!