Как заменить несколько слов в каждой строке столбца, содержащего полные предложения? - PullRequest
2 голосов
/ 13 июля 2020

У меня есть фрейм данных (назовем его «маленький текст»), в котором есть столбец с предложениями в каждой строке. У меня также есть еще одна таблица (назовем ее «littledict»), которую я хотел бы использовать в качестве справочника для поиска и замены слов и / или фраз в каждой строке «маленького текста».

Вот мои два фрейма данных. Я жестко кодирую их в этом примере, но загружу их как файлы csv в «реальной жизни»:

raw_text = {
    "text": ["Hello, world!", "Hello, how are you?", "This world is funny!"],
    "col2": [0,1,1]}

littletext = pd.DataFrame(raw_text, index = pd.Index(['A', 'B', 'C'], name='letter'), columns = pd.Index(['text', 'col2'], name='attributes'))


raw_dict = {
    "key": ["Hello", "This", "funny"],
    "replacewith": ["Hi", "That", "hilarious"]}

littledict = pd.DataFrame(raw_dict, index = pd.Index(['a','b','c'], name='letter'), columns = pd.Index(['key', 'replacewith'], name='attributes'))


print(littletext) # ignore 'col2' since it is irrelevant in this discussion

                   text  col2
A         Hello, world!     0
B   Hello, how are you?     1
C  This world is funny!     1

print(littledict)
     key replacewith
a  Hello          Hi
b   This        That
c  funny   hilarious

Я хотел бы изменить 'littletext', как показано ниже, при этом Python будет смотреть на более одного слова в каждом предложении моей таблицы «маленький текст» (фрейм данных) и заменить несколько слов, воздействуя на все строки. Окончательный результат должен заключаться в том, что «Hello» было заменено на «Hi» в строках A и B, а «That» было заменено на «This», а «funny» было заменено на «hilarious», оба в строке C:

                   text      col2
A         Hi, world!            0
B   Hi, how are you?            1
C  That world is hilarious!     1

Вот две попытки, которые я пробовал, но ни одна из них не сработала. Они не генерируют ошибок, они просто не изменяют «маленький текст», как я описал выше. Попытка №1 «технически» работает, но она неэффективна и, следовательно, бесполезна для крупномасштабных работ, потому что мне придется предвидеть и программировать каждое возможное предложение, которое мне нужно будет заменить другим предложением. Попытка №2 просто ничего не меняет.

Две мои НЕработающие попытки:

Попытка №1: это бесполезно, потому что для ее использования мне пришлось бы программировать целые предложения для замены других предложений, что бессмысленно:

littltext['text'].replace({'Hello, world!': 'Hi there, world.', 'This world is funny!': 'That world is hilarious'})

Попытка № 1 возвращает:

Out[125]: 
0           Hi there, world.
1        Hello, how are you?
2    That world is hilarious
Name: text, dtype: object

Попытка № 2: эта попытка ближе к отметке, но не возвращает никаких изменений :

for key in littledict:
    littletext = littletext.replace(key,littledict[key])

Попытка №2 возвращает:

                   text  col2
0         Hello, world!     0
1   Hello, how are you?     1
2  This world is funny!     1

Я просмотрел inte rnet, включая Youtube, Udemy и др. c., Но безрезультатно. Многочисленные «обучающие» сайты охватывают только отдельные примеры текста, а не целые столбцы предложений, как в примере, который я показываю, и поэтому бесполезны при масштабировании до проектов промышленного масштаба. Я надеюсь, что кто-то сможет любезно пролить свет на это, поскольку подобные манипуляции с текстом являются обычным явлением во многих отраслях промышленности.

Мои скромные благодарности и признательность всем, кто может помочь !!

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

dict littledict, чтобы вы могли сгенерировать регулярное выражение и использовать регулярное выражение в .replace.str() для замены необходимых символов следующим образом:

s=dict(zip(littledict.key,littledict.replacewith))
littletext['text'].str.replace('|'.join(s), lambda x: s[x.group()])

0                  Hi, world!
1            Hi, how are you?
2    That world is hilarious!
Name: text, dtype: object
0 голосов
/ 14 июля 2020

вы были довольно близки с первой попыткой. Вы можете создать словарь из littledict с ключом в индексе и использовать regex = True.

print (littletext['text']
          .replace(littledict.set_index('key')
                             ['replacewith'].to_dict(), 
                   regex=True)
      )
0                  Hi, world!
1            Hi, how are you?
2    That world is hilarious!
Name: text, dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...