как исправить орфографические ошибки (опечатки) при извлечении сущностей в Rasa NLU?

У меня мало намерений в моем обучающем наборе (файл nlu_data.md) с достаточным количеством обучающих примеров для каждого намерения. Ниже приведен пример,

##intent: SEARCH_HOTEL
- find good [hotel](place) for me in Mumbai

Я добавил несколько таких предложений. На момент тестирования все предложения в обучающем файле работают нормально. Но если какой-либо входной запрос содержит орфографическую ошибку, например, hotol / hetel / hotele для ключевого слова hotel, то Rasa NLU не может извлечь его как объект.

Я хочу решить эту проблему. Мне разрешено изменять только данные обучения, а также запрещается писать для этого какие-либо специальные компоненты.


person Nikhil Cheke    schedule 03.09.2020    source источник


Ответы (4)


Чтобы справиться с такими орфографическими ошибками в объектах, вам следует добавить эти примеры к своим обучающим данным. Так что-то вроде этого:

##intent: SEARCH_HOTEL
 - find good [hotel](place) for me in Mumbai 
 - looking for a [hotol](place) in Chennai
 - [hetel](place) in Berlin please

После того, как вы добавите достаточно примеров, модель должна иметь возможность делать выводы из структуры предложения.

Если вы еще не используете его, также имеет смысл использовать уровня персонажа CountVectorFeaturizer. Это должно быть в конвейере по умолчанию, описанном на этой странице. уже

person Akela Drissner    schedule 08.09.2020

Я настоятельно рекомендую вам использовать таблицы поиска с нечетким соответствием. Если у вас ограниченное количество объектов (например, названий стран), справочные таблицы работают довольно быстро, а нечеткое сопоставление выявляет опечатки, когда этот объект существует в вашей справочной таблице (поиск вариантов опечаток для этих объектов). Об этом есть целая статья в блоге: на Rasa. Есть рабочая реализация fuzzy wuzzy как настраиваемого компонента:

class FuzzyExtractor(Component):
    name = "FuzzyExtractor"
    provides = ["entities"]
    requires = ["tokens"]
    defaults = {}
    language_list  ["en"]
    threshold = 90

    def __init__(self, component_config=None, *args):
        super(FuzzyExtractor, self).__init__(component_config)

    def train(self, training_data, cfg, **kwargs):
        pass

    def process(self, message, **kwargs):

        entities = list(message.get('entities'))

        # Get file path of lookup table in json format
        cur_path = os.path.dirname(__file__)
        if os.name == 'nt':
            partial_lookup_file_path = '..\\data\\lookup_master.json'
        else:
            partial_lookup_file_path = '../data/lookup_master.json'
        lookup_file_path = os.path.join(cur_path, partial_lookup_file_path)

        with open(lookup_file_path, 'r') as file:
            lookup_data = json.load(file)['data']

            tokens = message.get('tokens')

            for token in tokens:

                # STOP_WORDS is just a dictionary of stop words from NLTK
                if token.text not in STOP_WORDS:

                    fuzzy_results = process.extract(
                                             token.text, 
                                             lookup_data, 
                                             processor=lambda a: a['value'] 
                                                 if isinstance(a, dict) else a, 
                                             limit=10)

                    for result, confidence in fuzzy_results:
                        if confidence >= self.threshold:
                            entities.append({
                                "start": token.offset,
                                "end": token.end,
                                "value": token.text,
                                "fuzzy_value": result["value"],
                                "confidence": confidence,
                                "entity": result["entity"]
                            })

        file.close()

        message.set("entities", entities, add_to_output=True)

Но я не реализовал его, он был реализован и проверен здесь: Rasa forum Затем вы просто передадите его своему конвейеру NLU в файле config.yml.

person Merve Noyan    schedule 12.09.2020

Это странная просьба, чтобы они просили вас не изменять код и не создавать пользовательские компоненты.

Подход, который вам придется предпринять, будет заключаться в использовании синонимов сущностей. Небольшое изменение предыдущего ответа:

 ##intent: SEARCH_HOTEL
 - find good [hotel](place) for me in Mumbai 
 - looking for a [hotol](place:hotel) in Chennai
 - [hetel](place:hotel) in Berlin please

Таким образом, даже если пользователь введет опечатку, будет извлечена правильная сущность. Если вы хотите, чтобы это было надежно, я не рекомендую вручную редактировать намерения. Используйте какой-нибудь автоматизированный инструмент для генерации обучающих данных. Например. Создавать слова с ошибками (опечатки)

person Thusitha    schedule 14.09.2020

Прежде всего, добавьте образцы для наиболее частых опечаток в ваших объектах, как рекомендовано здесь

Помимо этого, вам понадобится проверка орфографии.

Я не уверен, есть ли одна библиотека, которую можно использовать в конвейере, но если нет, вам нужно создать собственный компонент. В противном случае работать только с данными обучения невозможно. Вы не можете создавать образцы для каждой опечатки. Использование Fuzzywuzzy - один из способов, обычно он медленный и не решает всех проблем. Универсальный кодировщик - еще одно решение. Вариантов исправления орфографии должно быть больше, но вам все равно придется писать код.

person John    schedule 28.09.2020