Замените строковые значения в кадре данных, используя словарь - PullRequest
2 голосов
/ 18 октября 2019

У меня есть Dataframe со столбцом 'cleaned_tweet'. Этот столбец состоит из твитов с несколькими сокращениями, и я хочу заменить эти сокращения на правильные английские слова. Для этого я подготовил словарь под названием «сленги», где сокр. это ключ и нужная английская фраза / слово в качестве значения, и я хочу заменить все вхождения этих сокращений. со своими значениями в словаре. Я искал несколько других решений для stackoverflow, но ни одно из них, похоже, не работает. Вот что я попробовал. Я использую вложенный цикл for, и я считаю, что я довольно близок к решению, но я делаю что-то не так, что я не могу понять.

Вот вложенный цикл:

for i in range(len(train_test_set)):
    for j in slangs:
        train_test_set['cleaned_tweet'][i] = train_test_set['cleaned_tweet'][i].replace(j, slangs[j])

, когда я выполнил этот код и напечатал print(train_test_set['cleaned_tweet][0]), я получил неожиданный вывод, подобный этому:

"#mopanthank whyour | hi | years oldwhyour | hi | years oldhesitationospecial editekissas insekissperience wall hacken whyour | hi | years oldunited statesing a hallwhyour | hi | years olducinogenic drwhyour | hi | years olduglwhyour | hi | years oldung ladye rainbowhwhy | would whyour | hi | years olduohesitationents | rapper from atalk later | ekissperience wall hacken whyour | hi | years oldunited statesing a hallwhyour | hi | years olducinogenic drwhyour | hi | years olduglwhyour | hi | years oldung ladye rainbowhwhy | would whyour | hi | years olduoue loversatileionwhyes | yeah | yes | your | hi | years oldu | team leaderantaonwhysomethingop it | somethingwhyour | hi | years oldupid idiotake careal edwhyour | hi | years olducatekissas insekissperience wall hacken whyour | hi | years oldunited statesing a hallwhyour | hi | years olducinogenic drwhyour | hi | years olduglwhyour | hi | years oldung ladye..."

Кажетсямногие нежелательные значения добавляются в ячейки. Размер вывода действительно большой, поэтому я не могу скопировать все это здесь. Вот структура моего набора данных и словаря перед выполнением кода:

enter image description here

enter image description here

Может кто-нибудь сказать мне, что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Я предлагаю использовать метод Series.str.replace, который поддерживает вызываемый элемент в качестве аргумента замены.

Сначала определите словарь, в котором ключами являются выражения поиска, а значениями являются тексты для замены на:

slangs = { 'lng1': 'val1', 'lng2': 'val2' }

Затем используйте

rx = r'\b(?:{})\b'.format("|".join(slangs.keys())
train_test_set['cleaned_tweet'] = train_test_set['cleaned_tweet'].str.replace(rx), lambda x: slangs[x.group()])

Здесь rx будет динамически сформированным регулярным выражением типа \b(?:abc|def|ghi|...)\b, где \b - границы слов. Это будет работать, если у вас есть поисковые слова, которые состоят из букв, цифр или символов подчеркивания. См. другие варианты этого динамического построения шаблона, чтобы охватить больше сценариев. Как только найдено совпадение, оно передается лямбда-выражению и lambda x: slangs[x.group()] возвращает значение словаря для найденного ключа.

Если у вас есть тысячи элементов словаря, используйте это решение , чтобыпостроить регулярное выражение.

0 голосов
/ 18 октября 2019

Вы можете попробовать использовать словарь вместе с функцией map (). Примерно так:

slangs = {'abbr1': 'word1', .........}
train_test_set['cleaned_tweet'] = train_test_set['cleaned_tweet'].map(slangs)

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

# define the dictionary with the words as the keys and the lists of the respective abbreviations as the values
slangs = {'word1': ['abbr11', 'abbr12', ....], 'word2': ['abbr21', 'abbr22',..]}
#swap keys in slangs: http://stackoverflow.com/a/31674731/2901002
d = {k: oldk for oldk, oldv in slangs.items() for k in oldv}
train_test_set['cleaned_tweet']  = train_test_set['cleaned_tweet'].map(slangs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...