Извлечение продуктов из предложений
Учитывая предложение:
У меня было арахисовое масло и желе сэндвич и чашка кофе для завтрак
Я хочу иметь возможность извлечь из него следующие продукты питания:
арахисовое масло и желе сэндвич
кофе
До сих пор, используя маркировку POS, я смог извлечь отдельные элементы питания, то есть
арахис, масло, желе, сэндвич, кофе
Но, как я уже сказал, мне нужно арахисовое масло и желе сэндвич вместо отдельных предметов.
Есть ли способ сделать это без наличия в бэкэнде корпуса или базы данных о продуктах питания?
Ответы
Ответ 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-кодом в случае, когда вы планируете пройти этот маршрут.