Как исправить слова в сленге, используя 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, но это присуще вашему подходу).

Кстати, обратите внимание, что заключение договоров является и не является "сленгом". Он используется во всех видах текстов.

Другие вопросы по тегам