использование str.findall для извлечения точного соответствия из словаря

#python #pandas #string #dictionary

Вопрос:

У меня есть следующий словарь

 dictionary = {"car":1234, "light-blue":112, "orange":34, "blue":1, "cargo yellow":35}
 

И следующий фрейм данных

 df_data = {"sentence": ["the summarine is a cargo yellow and orange", "the sky was an amazing light-blue, you should have seen it", "the grass is green", "why you face is purple?", "Light blue as you! HAHA", "Have you ever use the Jungle exploration?"], "extra":['a','b','c','d', 'e', 'f'] }  
df = pd.DataFrame(df_data)
 

Основываясь на предыдущем заданном мною вопросе, я использовал этот код:

 df['new_col'] = df.sentence.str.extract(pat = f"({'|'.join(dictionary.keys())})")[0]
 

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

 df.sentence.str.findall(f"|".join(dictionary.keys())).apply(", ".join)
 

Что приводит к этому:

 0    car, orange
1     light-blue
2               
3               
4           blue
5     
 

Но все равно у меня проблема с машиной, а в данном случае еще и с синим. Вместо этого я хотел бы иметь вот это:

 0  cargo yellow, orange
1            light-blue
2                   nan  
3                   nan   
4                   nan
5                   nan
 

Кроме того, у вас есть какие-либо предложения о том, как я мог бы изменить код, чтобы вместо этого получить этот результат:

 0  cargo yellow, orange
1            light-blue
2                   nan  
3                   nan   
4            light blue
5                   nan
 

ИЗМЕНИТЬ: Я попробовал следующий код:

 for i in dictionary.keys():
    print(i,"n",df.sentence.str.findall(rf'bW?{i}W?b'))
 

И в этом случае ключ «автомобиль» не извлекается, но не очень эффективен, учитывая, что в моем словаре 3000 ключей/значений.

Спасибо!

Комментарии:

1. Добавьте также несколько строк ваших выборочных данных.

2. Извините, данные были записаны без пробела от«, и поэтому они были скрыты. Добавлен

3. blue очевидно , будет совпадать Light blue , говоря о car том, что я не вижу этого в результирующей строке.

4. С кодом, который я предоставил? Я попытался снова запустить код после очистки ядра, но все равно получил результат car.

5. Это как — то не здесь, с моей стороны, но это также ожидается, так car как содержится в cargo

Ответ №1:

Подготовка входных данных:

 data = {27695: 'I am legit happy because of these news.',
        143703: "Something seems suspicious.I can't recognize that...",
        ...
        48645: 'lol.',
        185265: 'Maybe there is a chance the infinity war sets are next'}

df = pd.DataFrame({"sentence": data.values()}, index=data.keys())
 

Найдите полные слова:

 out = df.sentence.str.findall('|'.join([fr'b{w}b' for w in dictionary.keys()])) 
                     .apply(lambda l: ','.join(l))
 

Отображать только совпадающие результаты:

 >>> out[out != '']
56082      blue,orange
134801            blue
102078            blue
106617            blue
204968            blue
139796    cargo yellow
Name: sentence, dtype: object
 

Комментарии:

1. В небольшом наборе данных, который я вам предоставляю, это работает. Но когда я попытался запустить исходную версию, у меня возникла эта ошибка sequence item 0: expected str instance, tuple found

2. Попробуйте удалить .apply(lambda l: ','.join(l)

3. Да, я сделал это, и результат примерно такой [(, , , , , , , , , , , , , , , , , , , )] : я думаю о том, в чем проблема. В качестве входных данных у меня есть некоторая строка, поэтому она должна работать

4. @Ибрагим. Вы решили свою проблему с входными данными? Не забудьте принять и/или озвучить ответ, если он вам помог?

5. Я не решил проблему, и я не знаю, почему. Вы правы, я собираюсь дать вам принять ваш ответ, потому что на небольших данных ваше решение работает