Можем ли мы обратиться к словарю, получить значение из ключа при замене в Python? - PullRequest
2 голосов
/ 17 октября 2019

У меня есть плоский файл с терминами и предложениями. Если в предложении найдется какой-либо термин, мне нужно добавить его идентификатор к термину (term | id). Сопоставление с образцом должно быть без учета регистра. Также нам нужно сохранить тот же случай, что и в предложении. Можно ли обратиться к словарю, чтобы получить значение, используя его ключ в вызове замены?

from pandas import DataFrame
import re

df = {'id':[11,12,13,14,15,16],
    'term': ['Ford', 'EXpensive', 'TOYOTA', 'Mercedes Benz', 'electric', 'cars'],
        'sentence': ['F-FORD FORD/FORD is less expensive than Mercedes Benz.' ,'toyota, hyundai mileage is good compared to ford','tesla is an electric-car','toyota too has electric cars','CARS','CArs are expensive.']
        }
#Dataframe creation
df = DataFrame(df,columns= ['id','term','sentence'])

#Dictionary creation
dict = {}
l_term = list(df['term'])
l_id = list(df['id'])

for i,j in zip(l_term,l_id):
    dict[str(i)] = j

#Building patterns to replace
pattern = r'(?i)(?<!-)(?<!\w)(?:{})(?!\w)'.format('|'.join(map(re.escape, sorted(df["term"],key=len,reverse=True))))

#Replace
df["sentence"].replace(pattern, r"\g<0>|present",, inplace=True,regex=True)

Вместо | настоящего мне нужно сослаться на словарь как | dict.get (\ g <0>)или есть другой подход для достижения этой цели? Также, если мы нашли автомобили дважды за 16,17. Мы можем добавить любой из них.

Ожидаемый результат -

F-FORD FORD|11/FORD|11 is less expensive|12 than Mercedes Benz|14.
toyota|13, hyundai mileage is good compared to ford|11
tesla is an electric|15-car
toyota|13 too has electric|15 cars|16
CARS|16
CArs|16 are expensive|12.

1 Ответ

1 голос
/ 17 октября 2019

Вы можете использовать небольшую модификацию текущего кода:

from pandas import DataFrame
import re

df = {'id':[11,12,13,14,15,16],
    'term': ['Ford', 'EXpensive', 'TOYOTA', 'Mercedes Benz', 'electric', 'cars'],
        'sentence': ['F-FORD FORD/FORD is less expensive than Mercedes Benz.' ,'toyota, hyundai mileage is good compared to ford','tesla is an electric-car','toyota too has electric cars','CARS','CArs are expensive.']
        }
#Dataframe creation
df = DataFrame(df,columns= ['id','term','sentence'])

#Dictionary creation
dct = {}
l_term = list(df['term'])
l_id = list(df['id'])

for i,j in zip(l_term,l_id):
    dct[str(i).upper()] = j

#Building patterns to replace
pattern = r'(?i)(?<!-)(?<!\w)(?:{})(?!\w)'.format('|'.join(map(re.escape, sorted(df["term"],key=len,reverse=True))))

#Replace
df["sentence"]=df["sentence"].str.replace(pattern, lambda x: "{}|{}".format(x.group(),dct[x.group().upper()]))

ПРИМЕЧАНИЯ :

  • dict является зарезервированным именем, неименные переменные dict, используйте dct
  • dct[str(i).upper()] = j - ключ в верхнем регистре добавляется в словарь для включения поиска без учета регистра по ключу в словаре
  • df["sentence"]=df["sentence"].str.replace(pattern, lambda x: "{}|{}".format(x.group(),dct[x.group().upper()])) является основным(последняя) строка, она использует Series.str.replace, что позволяет использовать вызываемый элемент в качестве аргумента замены, и как только шаблон соответствует, совпадение передается лямбда-выражению как x Объект соответствия, где извлекается значениес dct[x.group().upper()] и весь матч доступен с x.group().
...