Я работаю над нормализацией имен ингредиентов из набора данных рецепта с использованием Python и Spacy. Моя цель состоит в том, чтобы извлечь только соответствующие ингредиенты и игнорировать измерительные единицы, фракции и другие ненужные детали. Например, если у меня есть струна, как: «5 столовых ложек, разделенное». Я хочу извлечь «масло» в качестве нормализованного ингредиента. However, i struggle to parse the string "8 cups broccoli florets" - it loses "broccoli" and outputs only "floret". Другие струны, такие как «3 чашки куриного бульона», работают нормально и вывод «куриный бульон».`def normalize_ingredient(ingredient_text):
doc = nlp(ingredient_text)
# Set of measurement units to exclude
measurement_units = {
"cup", "teaspoon", "tablespoon", "tablespoons", "gram", "ounce", "pound", "can",
"clove", "pinch", "dash", "quart", "liter", "milliliter", "gallon",
"stick", "rib", "head", "package", "inch", "piece", "fluid", "container",
"jar", "loaf", "bottle", "pack", "pint", "cube", "stalk", "slice", "bulb",
"strip", "packet", "envelope", "box", "bag", "carton", "sprig", "leaf",
"half", "purpose", "pound", "ounce", "gram", "milliliter", "liter", "gallon",
"quart", "pint", "dash", "pinch", "clove", "can", "package", "container",
"jar", "loaf", "bottle", "pack", "cube", "stalk", "bulb", "strip", "packet",
"envelope", "box", "bag", "carton", "sprig", "leaf", "fluid", "inch", "piece", "cup",
"bite", "size", "bunch", "cups","all", "sized", "chunks"
}
# Set of fractions to exclude
fractions = {'½', '¼', '¾', '⅓', '⅔', '⅛', '⅜', '⅝', '⅞', '⅙', '⅚', '®'}
# List to store relevant terms
relevant_terms = []
for token in doc:
# Skip numbers, fractions, and measurement units
if (token.like_num or
token.text in fractions or
token.lemma_.lower() in measurement_units):
continue
# Focus on nouns, proper nouns, and adjectives that modify nouns
if token.pos_ in {"NOUN", "PROPN", "ADJ"}:
if token.pos_ == "ADJ" and token.head.pos_ in {"NOUN", "PROPN"}:
relevant_terms.append(token.lemma_.lower())
elif token.pos_ in {"NOUN", "PROPN"}:
relevant_terms.append(token.lemma_.lower())
return " ".join(relevant_terms)`
< /code>
Это пропускает «брокколи» по неизвестным для меня причинах (это единственная и единственная неправильно разборная строка на данный момент).
Я также попробовал этот подход с соединениями: < /strong> < /p>
`if token.pos_ in {"NOUN", "PROPN", "ADJ"}:
if token.pos_ == "ADJ" and token.head.pos_ in {"NOUN", "PROPN"}:
relevant_terms.append(f"{token.lemma_.lower()} {token.head.lemma_.lower()}")
elif token.pos_ in {"NOUN", "PROPN"}:
compound = [t for t in token.children if t.dep_ == "compound"]
if compound:
combined = " ".join([t.lemma_.lower() for t in compound] + [token.lemma_.lower()])
relevant_terms.append(combined)
else:
relevant_terms.append(token.lemma_.lower())`
Это испортило всю логику и не исключило некоторых измерений. if token.pos_ in {"NOUN", "PROPN", "ADJ"} or token.lemma_.lower() == "broccoli":
if token.pos_ == "ADJ" and token.head.pos_ in {"NOUN", "PROPN"}:
relevant_terms.append(token.lemma_.lower())
elif token.pos_ in {"NOUN", "PROPN"} or token.lemma_.lower() == "broccoli":
relevant_terms.append(token.lemma_.lower())
Подробнее здесь: https://stackoverflow.com/questions/795 ... n-noun-cas
Как нормализовать имена ингредиентов в наборе данных рецепта и обрабатывать существительные + существительные, используя ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение