先了解几个概念:
Document
:是一个 Word 文档 对象,不同于 VBA 中 Worksheet 的概念,Document 是独立的,打开不同的 Word 文档,就会有不同的 Document 对象,相互之间没有影响Paragraph
:是段落,一个 Word 文档由多个段落组成,当在文档中输入一个回车键,就会成为新的段落,输入 shift + 回车,不会分段Run
表示一个节段,每个段落由多个 节段 组成,一个段落中具有相同样式的连续文本,组成一个节段,所以一个 段落 对象有个 Run 列表pip install python-docx
测试
from docx import Document
document = Document()
paragraph = document.add_paragraph('ai ')
prior_paragraph = paragraph.insert_paragraph_before('啦啦啦')
document.save(r"D:\test.docx")
用 Word 打开保存的 test.docx 就可以看到:
ai
啦啦啦
from langchain.document_loaders import UnstructuredFileLoader
loader = UnstructuredFileLoader(filepath, mode="single")
# loader = UnstructuredFileLoader('1.docx', mode="single") # 要素
# loader = UnstructuredFileLoader('1.docx', mode="elements") # 根据换行来切分
print(loader.load())
如果mode="elements"在word上是根据换行来切分 loader.load() 可以加载文档可视
如果经过上面文档加载成Document这种,使用loader.load_and_split(text_splitter)
或text_splitter.split_documents(loader)
如果是单纯的字符串string,使用text_splitter.split_text(text)
class ChineseTextSplitter(CharacterTextSplitter):
def __init__(self, pdf: bool = False, **kwargs):
super().__init__(**kwargs)
self.pdf = pdf
def split_text(self, text: str) -> List[str]:
if self.pdf: # 如果传入是pdf
text = re.sub(r"\n{3,}", "\n", text) # 将连续出现的3个以上换行符替换为单个换行符,从而将多个空行缩减为一个空行。
text = re.sub('\s', ' ', text) # 将文本中的所有空白字符(例如空格、制表符、换行符等)替换为单个空格
text = text.replace("\n\n", "") # 将文本中的连续两个换行符替换为空字符串
# sent_sep_pattern = re.compile(
# '([﹒﹔﹖﹗.。!?]["’”」』]{0,2}|(?=["‘“「『]{1,2}|$))') # 用于匹配中文文本中的句子分隔符,例如句号、问号、感叹号等
sent_sep_pattern = re.compile('同步与互斥')
sent_list = []
for ele in sent_sep_pattern.split(text):
if sent_sep_pattern.match(ele) and sent_list:
sent_list[-1] += ele
elif ele:
sent_list.append(ele)
return sent_list
textSplitter = ChineseTextSplitter(True)
loader = UnstructuredFileLoader('2.docx', mode="single")
docs= loader.load_and_split(textSplitter) # 这里进入.split_text()
print(docs)
from langchain.text_splitter import RecursiveCharacterTextSplitter
r_splitter = RecursiveCharacterTextSplitter(
chunk_size=10,
chunk_overlap=0,
separators=["同步与互斥"] # 自定义切分
)
loader = UnstructuredFileLoader('1.docx', mode="single")
dos = loader.load()
\# docs= loader.load_and_split(textSplitter) # 这里进入.split_text()
\# print(docs)
text = r_splitter.split_text(dos[0].page_content) # test没进过加载器
print(text)