python-docx+ LangChain

python-docx

word概念

先了解几个概念:

  • Document:是一个 Word 文档 对象,不同于 VBA 中 Worksheet 的概念,Document 是独立的,打开不同的 Word 文档,就会有不同的 Document 对象,相互之间没有影响
  • Paragraph:是段落,一个 Word 文档由多个段落组成,当在文档中输入一个回车键,就会成为新的段落,输入 shift + 回车,不会分段
  • Run 表示一个节段,每个段落由多个 节段 组成,一个段落中具有相同样式的连续文本,组成一个节段,所以一个 段落 对象有个 Run 列表

python 安装 python-docx

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

啦啦啦

问题分析与解决

  1. 读取文档内容
  2. 发现文档规律
  3. 完成处理后将文档另存

LangChain 分割

word读取

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)

CharacterTextSplitter 按字符拆分

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)

RecursiveCharacterTextSplitter 递归按字符切分

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)

SpacyTextSplitter NLTK 的另一种替代方案是使用 Spacy文本分割器

你可能感兴趣的:(python,langchain,c#)