Манипулирование строками в 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']