Как исправить слова в сленге, используя python или Nltk?
У меня есть какой-то текст, полученный из Интернета, но люди написали их в коротких формах, таких как универ для университетов, а также для awsm и т. Д., Но я могу угадать списки этих слов. Но как исправить их с помощью Python? Я попробовал следующее, но это не сработало.
APPOSTOPHES= {"'s": "is", "'re":"are"}
s= " i luv my iphone, you're awsm apple. DisplayisAwesome, Sooooo happppppy"
words = s.split()
rfrm=[APPOSTOPHES[word] if word in APPOSTOPHES else word for word in words]
rfrm= " ".join(rfrm)
print(rfrm)
i luv my iphone, you're awsm apple. DisplayisAwesome, Sooooo happppppy
Но он печатает одно и то же предложение. Это ничего не изменило.
2 ответа
У вас есть несколько вещей, происходящих с вашим кодом, первая из которых заключается в том, что вы не соответствуете ни одной из замен ваших кандидатов в вашем APPOSTOPHES[word]
проверять.
Я разбил код на очень четкие порции и внес небольшую поправку в ваш APPOSTROPHES
словарь - обратите внимание на пространство, которое теперь находится в значении. Остальная часть описания в комментариях к коду:
APPOSTOPHES= {"'s": " is", "'re":" are"}
test_string = " i luv my iphone, you're awsm apple. DisplayisAwesome, Sooooo happppppy"
# split the words based on whitespace
sentence_list = test_string.split()
# make a place where we can build our new sentence
new_sentence = []
# look through each word
for word in sentence_list:
# look for each candidate
for candidate_replacement in APPOSTOPHES:
# if our candidate is there in the word
if candidate_replacement in word:
# replace it
word = word.replace(candidate_replacement, APPOSTOPHES[candidate_replacement])
# and pop it onto a new list
new_sentence.append(word)
rfrm = " ".join(new_sentence)
print(rfrm)
# i luv my iphone, you are awsm apple. DisplayisAwesome, Sooooo happppppy
редактировать: как гласит комментарий Алексис, замена слова / сокращения приведет к проблемам, если вы попытаетесь применить один и тот же шаблон для всего. Я пошел с этим подходом, потому что имя вашей переменной близко к слову "апострофы" - и это то, что мы меняем. Его предложение использовать метод токена nltk является хорошим; если вы собираетесь основывать свой подход на библиотеке, определенно изучите ее предпочтительные методы.
Мой ответ предназначен для того, чтобы преодолеть ваше непосредственное препятствие и показать, почему вы получили ту же строку предложения в ответ.
Ваш код ничего не заменил, потому что вы сопоставляете полные слова, но написано в приложении к предыдущему слову. Если вы взломаете решение для апострофов, вы скоро обнаружите, что ваш код также не подходит для слов, близких к пунктуации. Например, ... luv, susan."
Так как вы отметили это nltk
, просто используйте токенизатор nltk вместо split()
:
>>> s = " i luv my iphone, you're awsm apple. DisplayisAwesome, Sooooo happppppy"
>>> nltk.word_tokenize(s)
['i', 'luv', 'my', 'iphone', ',', 'you', "'re", 'awsm', 'apple', '.', 'DisplayisAwesome', ',', 'Sooooo', 'happppppy']
Теперь вы - полный токен, и ваш код будет работать так, как задумано. (Это также изменится John's dog
в John is dog
, но это присуще вашему подходу).
Кстати, обратите внимание, что заключение договоров является и не является "сленгом". Он используется во всех видах текстов.