ValueError: [E966] `nlp.add_pipe` при изменении правила сегментации предложения модели spaCy

Я использую Python 3.9.7 и библиотеку spaCy и хочу изменить то, как модель сегментирует данное предложение. Вот предложение и правило сегментации, которое я создал в качестве примера:

import spacy
nlp=spacy.load('en_core_web_sm')

doc2=nlp(u'"Management is doing the  right things; leadership is doing the right things." -Peter Drucker')

def set_custom_boundaries(doc):
    for token in doc[:-1]:
        if token.text= = ";":
            doc[token.i +1].is_sent_start=True
    return doc

nlp.add_pipe(set_custom_boundaries, before='parser')

Однако это приводит к следующему сообщению об ошибке:

ValueError                                Traceback (most recent call last)
C:\Users\SEYDOU~1\AppData\Local\Temp/ipykernel_21000/1705623728.py in <module>
----> 1 nlp.add_pipe(set_custom_boundaries, before='parser')

~\Anaconda3\lib\site-packages\spacy\language.py in add_pipe(self, factory_name, name, before, after, first, last, source, config, raw_config, validate)
    777             bad_val = repr(factory_name)
    778             err = Errors.E966.format(component=bad_val, name=name)
--> 779             raise ValueError(err)
    780         name = name if name is not None else factory_name
    781         if name in self.component_names:

ValueError: [E966] `nlp.add_pipe` now takes the string name of the registered component factory, not a callable component. Expected string, but got <function set_custom_boundaries at 0x000002520A59CCA0> (name: 'None').

- If you created your component with `nlp.create_pipe('name')`: remove nlp.create_pipe and call `nlp.add_pipe('name')` instead.
    
- If you passed in a component like `TextCategorizer()`: call `nlp.add_pipe` with the string name instead, e.g. `nlp.add_pipe('textcat')`.
    
- If you're using a custom component: Add the decorator `@Language.component` (for function components) or `@Language.factory` (for class components / factories) to your custom component and assign it a name, e.g. `@Language.component('your_name')`. You can then run `nlp.add_pipe('your_name')` to add it to the pipeline.

Я просмотрел некоторые решения в Интернете, однако я не смог решить проблему как новичок в Python. Как можно использовать собственное правило сегментации в конвейере spaCy?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Синтаксис nlp.add_pipe с пользовательской функцией указан здесь. Вы должны (1) объявить функцию компонента с помощью «декоратора» и (2) передать имя компонента/функции в виде строки. Так что это должно быть что-то вроде этого:

@Language.component("set_custom_boundaries")
def set_custom_boundaries(doc):
    for token in doc[:-1]:
        if token.text= = ";":
            doc[token.i +1].is_sent_start=True
    return doc



nlp.add_pipe("set_custom_boundaries", before='parser')

Примечание: ваша функция выполняет странную сегментацию предложений, в общем случае она не будет работать. Например, это не сработает, если предложение заканчивается на «.», «...» или «!» и т. д.

Другие вопросы по теме