Замена похожих строк одной единой строкой в ​​python - PullRequest
1 голос
/ 12 апреля 2020

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

В частности, это: Что готовит?

В наборе данных есть строки типа «средние яйца» , «большое яйцо свободного выгула» , «баклажаны» , «крупные яичные белки» , ' китайская яичная лапша ' и ' яйца '

Так что в этом случае я хотел бы найти и заменить все ' средние яйца ' и «большое яйцо свободного выгула» как просто «яйца» , в то время как такие строки, как «баклажаны» и «китайская яичная лапша» должны быть оставлены один. Мне также нужно заменить «большие яичные белки» на «яичные белки»

Другим случаем будет «бобы гарбанзо» и 'нут' , поскольку они ссылаются на один и тот же ингредиент.

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

Поскольку это проект классификации, код должен иметь возможность принимать потенциальные ингредиенты, такие как «маленькое яйцо», и все же понимать его как 'яйца'

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

В качестве частичного решения вы можете написать простую функцию, используя это:

import spacy

items = ['medium eggs', 'large free range egg', 'eggplants', 'large egg whites', 'chinese egg noodles', 'eggs']
clean = []
for i in items:
    doc = nlp(i)
    temp = ''
    for token in doc:
        #print(token.text , token.pos_)
        if token.pos_=='NOUN' or  token.pos_=='PROPN':
            temp += ' ' + token.text
    clean.append(temp)
print(clean)

Вывод: [' eggs', ' range egg', ' eggplants', ' egg whites', ' egg noodles', ' eggs']

ПРИМЕЧАНИЕ. Возможно, вам придется позаботиться о нескольких случаях, например 'фасоль гарбанзо' и 'нут' вручную

0 голосов
/ 12 апреля 2020

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

import re

def replace_eggs(string_to_replace, replacement_text, *query_strings):
  for query_string in query_strings:
    return re.sub(f"\s?{query_string}([\.,]?)\s?",replacement_text, string_to_replace)

ВНИМАНИЕ: Этот код очень плох. Это работает не очень хорошо, и у меня нет достаточно времени, чтобы это исправить. Я прошу прощения. Я бы посоветовал узнать о регулярных выражениях и группах по отлову, чтобы сделать это немного лучше. Простите, повторяю (ба-дум чинг!), Извините, но у меня много дел.

...