这个问题最初是关于训练管道中可能存在的一个bug,与解析器(见下文)有关。但现在我认为提出初步问题更为合适:
- 是否可以创建一个完全自定义分词器,它不定义自定义规则和一些方法,而只是重新定义主要的
__call__
方法? - 在这种情况下,我在哪里可以找到关于如何在分词时使用词汇表API为词汇表提供内容的文档?
一些背景信息
在讨论阿拉伯语支持时,评论我愿意为阿拉伯语(SMA)原型化一个spaCy语言模型,我报告了选择一个训练集以及使用原生spaCy 分词器获得的令人不满意的训练结果。然后,我报告了将另一个替代分词器的集成/适应,其输出根据调试数据命令的打印输出显示出与训练集中的标记更好的对齐(在对训练集本身进行小修改后)。
在随后的评论中,在同一讨论中,我报告了以下内容:
- 当使用与调试数据相同的数据和配置执行train命令时,由spaCy训练软件中的一个与解析器相关的模块引发的异常;
- 使用减少的配置(排除解析器)获得的非常糟糕的结果(整体得分低)。
以下是与该异常相关的Traceback(点1)。您可以在我提到的讨论中找到完整的Traceback。
⚠ Aborting and saving the final best model. Encountered exception:
KeyError("[E900] Could not run the full pipeline for evaluation. If you
specified frozen components, make sure they were already initialized and
trained. Full pipeline: ['tok2vec', 'tagger', 'morphologizer',
'trainable_lemmatizer', 'parser']")
Traceback (most recent call last):
File "C:\language310\lib\site-packages\spacy\training\loop.py", line 298, in evaluate
scores = nlp.evaluate(dev_corpus(nlp))
File "C:\language310\lib\site-packages\spacy\language.py", line 1459, in evaluate
for eg, doc in zip(examples, docs):
File "C:\language310\lib\site-packages\spacy\language.py", line 1618, in pipe
for doc in docs:
File "C:\language310\lib\site-packages\spacy\util.py", line 1685, in _pipe
yield from proc.pipe(docs, **kwargs)
File "spacy\pipeline\transition_parser.pyx", line 255, in pipe
File "C:\language310\lib\site-packages\spacy\util.py", line 1704, in raise_error
raise e
File "spacy\pipeline\transition_parser.pyx", line 252, in spacy.pipeline.transition_parser.Parser.pipe
File "spacy\pipeline\transition_parser.pyx", line 345, in spacy.pipeline.transition_parser.Parser.set_annotations
File "spacy\pipeline\_parser_internals\nonproj.pyx", line 176, in spacy.pipeline._parser_internals.nonproj.deprojectivize
File "spacy\pipeline\_parser_internals\nonproj.pyx", line 181, in spacy.pipeline._parser_internals.nonproj.deprojectivize
File "spacy\strings.pyx", line 160, in spacy.strings.StringStore.__getitem__
KeyError: "[E018] Can't retrieve string for hash '8206900633647566924'. This usually refers to an issue with the `Vocab` or `StringStore`."
The above exception was the direct cause of the following exception:
(omissis)
我的环境
- 操作系统:Windows 11
- 使用的Python版本:3.10
- 使用的spaCy版本:3.7
3条答案
按热度按时间w41d8nur1#
第三个问题:
pprl5pva2#
根据讨论阿拉伯语支持中的第#7146(评论),现在我使用修改后的自定义分词器(暂时用Cython编写)训练了一个减少的管道*(排除了解析器),分数有了显著提高。具体如下:
这是打印输出的一部分:
然而,与解析器训练相关的问题仍然存在,因此我无法训练完整的管道。有人能帮我解决这个问题吗?
更一般地说,我需要关于如何将自定义分词器集成到spaCy的建议。
nkkqxpd93#
我决定使用Cython,尽管我没有使用过它。然后,通过大量的谷歌搜索,我并没有完全理解parser问题,但找到了一些有用的线索,并用一个补丁解决了这个问题。
这个bug似乎与以下事实有关:在某些语言中经常发生的情境中,解析器代码会向依赖关系注解添加一些标签,这些标签并不存在于训练集中,以便将其他难以管理的依赖关系树"projectivize";然而,它忘记了将这些标签输入到词汇表中。参考#7282和https://support.prodi.gy/t/e018-when-fine-tuning-parser/4650。
目前,对我来说唯一起作用的是将
config.cfg
中的解析器部分的min_action_freq参数更改为1(min_action_freq = 1
)。我在这里附上train输出打印结果:与使用原生spaCy 分词器进行的训练(参见讨论阿拉伯语支持)相比,整体得分从0.66提高到了0.83(+0.17),但所有部分得分都以不同的程度得到了改善。