Манипулирование строками в python с использованием списка

У меня есть несколько твитов, которые содержат некоторые сокращенные тексты, такие как ur,bcz и т. Д. Я использую словарь для сопоставления правильных слов. Я знаю, что мы не можем изменять строки в Python. Поэтому после замены на правильное слово я сохраняю копию в новом списке. Работает. Я сталкиваюсь с проблемой, если у любого твита есть больше чем один сокращенный текст.

Мой код заменяет одно слово за раз. Как я могу заменить слова несколько раз в одной строке. Вот мой код

# some sample tweets
tweet = ['stats is gr8', 'india is grt bcz it is colourfull', 'i like you','your movie is grt', 'i hate ur book of hatred' ]

short_text={
    "bcz" : "because",
    "ur" : "your",
    "grt" : "great",
    "gr8" : "great",
    "u" : "you"
        }

import re

def find_word(text,search):
    result = re.findall('\\b'+search+'\\b',text,flags=re.IGNORECASE)
    if len(result) > 0:
        return True
    else:
        return False


corrected_tweets=list()
for i in tweet:
    tweettoken=i.split()
    for short_word in short_text:
        print("current iteration")
        for tok in tweettoken:
            if(find_word(tok,short_word)):
                print(tok)
                print(i)
                newi = i.replace(tok,short_text[short_word])
                corrected_tweets.append(newi)       
            print(newi)

мой вывод

['stats is great',
 'india is grt because it is colourfull',
 'india is great bcz it is colourfull',
 'your movie is great',
 'i hate your book of hatred']

То, что мне нужно, это твиты 2 и 3 должны быть добавлены один раз со всеми исправлениями. Я новичок в питоне. Любая помощь будет отличной.

3 ответа

Решение

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

tweet = ['stats is gr8', 'india is grt bcz it is colourfull', 'i like you','your movie is grt', 'i hate ur book of hatred' ]

short_text={
    "bcz" : "because",
    "ur" : "your",
    "grt" : "great",
    "gr8" : "great",
    "u" : "you"
        }

import re

changed = [re.sub(r"\b(\w+)\b",lambda m:short_text.get(m.group(1),m.group(1)),x) for x in tweet]

результат:

['stats is great', 'india is great because it is colourfull', 'i like you', 'your movie is great', 'i hate your book of hatred']

этот подход очень быстрый, потому что он имеет O(1) поиск по каждому слову (не зависит от длины словаря)

Преимущество пере + слово границы против str.split заключается в том, что это работает, когда слова разделяются с помощью знаков препинания.

Вы можете использовать список комп для этого:

[' '.join(short_text.get(s, s) for s in new_str.split()) for new_str in tweet]

результат:

In [1]: tweet = ['stats is gr8', 'india is grt bcz it is colourfull', 'i like you','your movie is grt', 'i hate ur book of hatred' ]
   ...:

In [2]: short_text={
   ...:     "bcz" : "because",
   ...:     "ur" : "your",
   ...:     "grt" : "great",
   ...:     "gr8" : "great",
   ...:     "u" : "you"
   ...:         }

In [4]: [' '.join(short_text.get(s, s) for s in new_str.split()) for new_str in tweet]
Out[4]:
['stats is great',
 'india is great because it is colourfull',
 'i like you',
 'your movie is great',
 'i hate your book of hatred']

Вы можете попробовать этот подход:

tweet = ['stats is gr8', 'india is grt bcz it is colourfull', 'i like you','your movie is grt', 'i hate ur book of hatred' ]

short_text={
    "bcz" : "because",
    "ur" : "your",
    "grt" : "great",
    "gr8" : "great",
    "u" : "you"
        }

for j,i in enumerate(tweet):
    data=i.split()
    for index_np,value in enumerate(data):
        if value in short_text:
            data[index_np]=short_text[value]

    tweet[j]=" ".join(data)

print(tweet)

выход:

['stats is great', 'india is great because it is colourfull', 'i like you', 'your movie is great', 'i hate your book of hatred']
Другие вопросы по тегам