chatchat-space / Langchain-Chatchat

Langchain-Chatchat(原Langchain-ChatGLM)基于 Langchain 与 ChatGLM, Qwen 与 Llama 等语言模型的 RAG 与 Agent 应用 | Langchain-Chatchat (formerly langchain-ChatGLM), local knowledge based LLM (like ChatGLM, Qwen and Llama) RAG and Agent app with langchain
Apache License 2.0
31.82k stars 5.55k forks source link

分词器相关问题 #2920

Closed qianma819 closed 8 months ago

qianma819 commented 9 months ago

1.我准备的文件如图示,打算用\n\n进行分割,段和段直接都用双空行进行了分割。 2.采用ali_text_splitter的分词器,我看里面可以直接双空行分割。代码如下 def split_text(self, text: str) -> List[str]:

use_document_segmentation参数指定是否用语义切分文档,此处采取的文档语义分割模型为达摩院开源的nlp_bert_document-segmentation_chinese-base,论文见https://arxiv.org/abs/2107.09278

    # 如果使用模型进行文档语义切分,那么需要安装modelscope[nlp]:pip install "modelscope[nlp]" -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html
    # 考虑到使用了三个模型,可能对于低配置gpu不太友好,因此这里将模型load进cpu计算,有需要的话可以替换device为自己的显卡id
    if self.pdf:
        text = re.sub(r"\n{3,}", r"\n", text)
        text = re.sub('\s', " ", text)
        **text = re.sub("\n\n", "", text)**

3.为了最大程度用双行分割,将单段文本最大长度设置成了1000,重复设置成了0. 结果: 未发现实际按照双空行进行分割,还是按照1000字进行的分割。 这是什么原因呢?如果我就是想要按照双空行进行段落切分,要怎样实际修改呢?

data jieguo
dosubot[bot] commented 9 months ago

🤖

您的问题出在AliTextSplitter类的split_text方法中。具体来说,以下几行代码导致了问题:

if self.pdf:
    text = re.sub(r"\n{3,}", r"\n", text)
    text = re.sub('\s', " ", text)
    text = re.sub("\n\n", "", text)

在这些行中,文本被处理的方式是删除了双换行符。第一行将任何连续三个或更多的换行符替换为单个换行符。第二行将所有空白字符(包括换行符)替换为一个空格。第三行删除了所有双换行符的出现。

如果您希望分词器按双换行符分割文本,您应该删除或修改这些行。例如,您可以更改第三行,将双换行符替换为一个唯一的字符串,然后按此字符串分割文本。以下是您可以这样做的方式:

if self.pdf:
    text = re.sub(r"\n{3,}", r"\n", text)
    text = re.sub('\s', " ", text)
    text = re.sub("\n\n", "<DOUBLE_NEWLINE>", text)
sent_list = [i for i in text.split("<DOUBLE_NEWLINE>") if i]

此代码将按双换行符分割文本,只要AliTextSplitter实例的pdf属性设置为True。如果pdfFalse,则不会以这种方式处理文本。

关于pdf属性的作用,它在Langchain-Chatchat代码库中的AliTextSplitter类中用于确定输入文本是否为PDF文档。如果pdf设置为Truesplit_text方法将对输入文本进行额外的预处理,以删除PDF文档中常见的过多的换行符和空格。这个预处理包括替换三个或更多连续的换行符为一个换行符,替换所有的空白字符为一个空格,以及删除所有连续两个换行符的出现。

这个预处理步骤是必要的,以确保文本处于适合后续文档分割任务的格式。

参考源代码:

Sources


This response is meant to be useful and save you time. It is not meant to be a precise solution, but rather a starting point for your own research.

Help me be more useful! Please leave a 👍 if this is helpful and 👎 if it is irrelevant.

If you want to continue the conversation, start your reply with @dosu-bot.

qianma819 commented 9 months ago

TEXT_SPLITTER_NAME = "ChineseRecursiveTextSplitter"这个修改为: TEXT_SPLITTER_NAME = "AliTextSplitter" def init(self, pdf: bool = False, kwargs):修改为: def init(self, pdf: bool = True, kwargs): 怎么ali_text_splitter.py这个文件压根就没运行到,还需要修改什么呢?