Подтвердить что ты не робот

Извлечение продуктов из предложений

Учитывая предложение:

У меня было арахисовое масло и желе сэндвич и чашка кофе для завтрак

Я хочу иметь возможность извлечь из него следующие продукты питания:

арахисовое масло и желе сэндвич

кофе

До сих пор, используя маркировку POS, я смог извлечь отдельные элементы питания, то есть

арахис, масло, желе, сэндвич, кофе

Но, как я уже сказал, мне нужно арахисовое масло и желе сэндвич вместо отдельных предметов.

Есть ли способ сделать это без наличия в бэкэнде корпуса или базы данных о продуктах питания?

4b9b3361

Ответ 1

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

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

Вы можете использовать spacy для разбора пар.. Здесь выведено смещение:

https://demos.explosion.ai/displacy/?text=peanut%20butter%20and%20jelly%20sandwich%20is%20delicious&model=en&cpu=1&cph=1

введите описание изображения здесь

введите описание изображения здесь

  • Вы можете использовать свободно доступные данные здесь или что-то получше: https://en.wikipedia.org/wiki/Lists_of_foods как набор для обучения создать базовый набор продуктов питания (гиперссылки в обходном дереве).
  • На основе анализа зависимостей ваших новых данных вы можете сохранить обогащение базовых данных. Например: если в вашем corpus и "арахисовое масло" - часто встречающаяся пара тоны, затем "арахис" и "арахисовое масло" также добавляются к корпус.
  • Тело может храниться в файле, который может быть загружен в память во время обработки или базы данных, такие как redis, аэроспейс и т.д.
  • Удостоверьтесь, что вы работаете с нормализованным, т.е. с небольшим корпусом, специальным символы очищены, слова lemmatized/stemmed, как в корпусе, так и в обработка данных. Это увеличит ваш охват и точность.

Ответ 2

Сначала извлеките все существительные фразы, используя NLTK Chunking (код скопирован из здесь):

import nltk
import re
import pprint
from nltk import Tree
import pdb


patterns="""
    NP: {<JJ>*<NN*>+}
    {<JJ>*<NN*><CC>*<NN*>+}
    {<NP><CC><NP>}
    {<RB><JJ>*<NN*>+}
    """

NPChunker = nltk.RegexpParser(patterns)

def prepare_text(input):
    sentences = nltk.sent_tokenize(input)
    sentences = [nltk.word_tokenize(sent) for sent in sentences] 
    sentences = [nltk.pos_tag(sent) for sent in sentences]
    sentences = [NPChunker.parse(sent) for sent in sentences]
    return sentences


def parsed_text_to_NP(sentences):
    nps = []
    for sent in sentences:
        tree = NPChunker.parse(sent)
        print(tree)
        for subtree in tree.subtrees():
            if subtree.label() == 'NP':
                t = subtree
                t = ' '.join(word for word, tag in t.leaves())
                nps.append(t)
    return nps


def sent_parse(input):
    sentences = prepare_text(input)
    nps = parsed_text_to_NP(sentences)
    return nps



if __name__ == '__main__':
    print(sent_parse('I ate peanut butter and beef burger and a cup of coffee for breakfast.'))

Это будет POS-тег для ваших предложений и использует парсер регулярных выражений для извлечения именных фраз.

1. Определите и уточните свое словосочетание regex

Вам нужно будет изменить регулярное выражение шаблоны, чтобы определить и уточнить ваши фразы-слова. Например, говорит парсер, чем NP, за которым следует координатор (CC), такой как '' и '', а другой NP сам является NP.

2.Измените с помощью теггера POS NLTK на теггер POS-терминалов в Стэнфорде

Также я отметил, что тег-маркер NLTK POS не работает очень хорошо (например, он считает, что арахис в виде глагольной фразы. Если вы хотите, вы можете изменить тег POS на Stanford Parser.

3. Измените более мелкие существительные:

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

4. Измените существительные фразы, которые ни одно из слов в пищевой лексике

вы получите существительные фразы, такие как школьный автобус. если ни одна из школ и автобусов не находится в пищевой лексике, которую вы можете компилировать из Википедии или WordNet, вы удаляете существительное. В этом случае удалите чашку и завтрак, потому что они не надеюсь, в вашей пищевой лексике.

Текущий код возвращает

['peanut butter and beef burger', 'peanut butter', 'beef burger', 'cup', 'coffee', 'breakfast']

для ввода

print(sent_parse('I ate peanut butter and beef burger and a cup of coffee for breakfast.'))

Ответ 3

Слишком много для комментария, но на самом деле не ответ:

Я думаю, вы, по крайней мере, подошли бы ближе, если бы у вас было два продукта без надлежащего разделителя и объединить их в одну пищу. Это даст арахисовое масло, желе сэндвич, кофе.

Если у вас правильный английский, вы можете обнаружить этот случай по счету/без учета. Исправление оригинала: "У меня было a арахисовое масло и желе сэндвич и чашка кофе на завтрак". Масло не считается, вы не можете иметь "масло", но у вас может быть "сэндвич". Таким образом, a должен применяться к бутерброду и, несмотря на то, что "арахисовое масло" и "желе-бутерброд" должны быть одним и тем же предметом - "арахисовое масло и желе сэндвич". Ваше ошибочное предложение будет разбирать другой путь, хотя!

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

Ответ 4

Вы можете искать n-граммы в тексте, где вы меняете значение n. Например, если n = 5, вы должны извлечь "арахисовое масло и желе сэндвич" и "чашку кофе на завтрак", в зависимости от того, где вы начинаете поиск в тексте для групп из пяти слов. Вам не понадобится корпус текста или база данных, чтобы заставить алгоритм работать.

Ответ 5

Здесь будет работать подход на основе правил с лексикой всех продуктов питания.

Вы можете использовать GATE для этого и использовать с ним правила JAPE.

В приведенном выше примере ваше правило jape будет иметь условие, чтобы найти все (np cc np) && & np в "FOOD LEIXCON"

Можно поделиться подробным jpe-кодом в случае, когда вы планируете пройти этот маршрут.