haystack 将分词添加到预处理器中

gwo2fgha  于 4个月前  发布在  其他
关注(0)|答案(7)|浏览(56)

你的需求是否与问题相关?请描述。

  • 作为一个用户,我想根据一个token限制来拆分我的文档。我希望使用HuggingFace的tokenizers、Sentence Transformers和OpenAI的tokenizers。我希望避免基于尝试使用单词或句子设置这个值的try/catch。
  • 我想使用正则表达式替换字符串,并用空格替换换行符
    描述你想要的解决方案

允许使用任何Hugging Face tokenizer、Sentence Transformers或OpenAI tokenizer。用户将选择模式tokens,设置tokenizer类型(hf、sbert或OpenAI),模型名称。其余的PreProcessor函数将保持不变。

描述你考虑过的替代方案

保持原样,每个用户都将对其单词/句子拆分长度进行实验。

附加上下文

这只是个元代码(从我们内部代码库导出),但它可能是这样的:

def __init__(
        self,
        mode: SplitMode = "words",
        tokenizer: Optional[TokenizerMode] = None,
        tokenizer_model: Optional[str] = None,
        language: Optional[str]=None,
        clean_whitespace: Optional[bool] = None,
        clean_header_footer: Optional[bool] = None,
        clean_empty_lines: Optional[bool] = None,
        remove_substrings: Optional[List[str]] = None,
        remove_substrings_regex: Optional[Union[List[Pattern],List[str]]] = None,
        replace_newlines: Optional[bool] = None,
        split_length: int = 180,
        split_overlap: int = 25,
        split_respect_sentence_boundary: bool = False,
        id_hash_keys: Optional[List[str]] = None,
    ) -> None:
wgxvkvu9

wgxvkvu91#

这个实现将与当前的预处理器和管道一起工作。代码已经过测试。
@ZanSara 给你打标签是因为 #4256

pw136qt2

pw136qt22#

嘿,@danielbichuetti,如果你已经有了一个可用的实现,我很乐意看看。
然而,让我警告你:预处理器几乎没有对边缘情况进行测试。我最后一次尝试引入它们时,发现了许多隐藏在实现中的错误,以至于我不得不放弃再次接触它的想法。所以...你计划添加任何测试吗?😅这可能比看起来要困难得多。
如果你确实打开了一个PR,请给我打个标签,我会尽力跟进。

nimxete2

nimxete23#

@ZanSara 我们可以为所有3种分词模式添加测试。或者你需要我为整个实现添加测试吗? 😅
说实话,这段节点代码看起来就像是我们有一栋房子,不断地添加功能和额外的建筑,适应一切。它已经建成了,但没有太多的规划哈哈哈哈哈,抱歉说得太过直白了。
我已经有一个可用的实现。我们导出了Haystack预处理器,并构建了一个文档处理器,将其转换为更类型化的结构,并添加了分词器。我可以进行反向操作,并将文档处理器适应当前的预处理器。
这种适应方式与当前的实现兼容。当然,如果我们改变为更优化的方式(如使用前尾计算进行分词),我们需要重构许多方法。而且你的担忧可能会成为问题。
这个实现使用了线性方法。

7vhp5slm

7vhp5slm4#

好的,这听起来很有趣!我很乐意看到DocumentProcessor。我不能保证我会有时间快速审查它,但我可以确保看看它,考虑一下它是否可以替代PreProcessor,至少在某些情况下。除非我发现一些巨大的问题,我相信我们可以在核心中使用它。
对于测试:从技术上讲,如果你添加了一个新的参数,你应该至少对其他几个进行测试...如果测试做得当,这些可能会已经暴露出问题。我不希望你为代码库的其他部分编写测试,不用担心😄
我得说实话。这个节点代码看起来就像我们有一栋房子,我们不断地添加功能和额外的建筑,适应一切。它是构建的,但没有太多的规划哈哈哈哈哈抱歉说得太过坦诚。
我完全同意你在这方面的观点😂让我分享一个轶事。PreProcessor有一个令人惊叹的功能,使它非常快:在分割时会丢失空白字符🙈而且基本上不可能修复这个丢失空白字符的bug而不让它慢下来大约2倍,因为显然不计算某些东西总是比计算某些东西更快,而PreProcessor目前以非常高效的方式丢失了这些空白字符。你可以想象当我发现这一点时的喜悦😅

pdtvr36n

pdtvr36n5#

@ZanSara 是的。我们第一次移植它的时候,就注意到了这个问题。接触原始的预处理器代码就像是:嘿,与其修改它,不如从头开始。我们尝试了一种非线性的方法来计算。但是接触旧代码就像一场噩梦。我能理解你过去的感觉。所以,我们决定采用线性计算方法。
我将使用与PreProcessor相同的名称,因为它已经是一个派生实现。而且,它确实是一个经过修改的PreProcessor,只是添加了一些功能。
我会打开一个PR,这样我们就可以探索一下了。

7gcisfzg

7gcisfzg7#

我需要这个,自己动手 :)将此需求移动到2.x版本的功能请求中。

相关问题