#python #regex
Вопрос:
Я хочу удалить повторяющиеся символы из предложения, но сделать так, чтобы слова все еще сохраняли свое значение (если оно у него есть). Например : I'm so haaappppyyyy about offline school
к I'm so happy about offline school
. Видишь, haaappppyyyy
стал happy
и offline amp; school
остаешься прежним, вместо того чтобы стать ofline amp; schol
Я пробовал два решения, используя RE и itertools, но ни одно из них не подходит для того, что я ищу
Использование Регулярного Выражения :
tweet = 'I'm so haaappppyyyy about offline school'
repeat_char = re.compile(r"(.)1{1,}", re.IGNORECASE)
tweet = repeat_char.sub(r"11", tweet)
tweet = re.sub("(.)\1{2,}", "\1", tweet)
выход :
I'm so haappyy about offline school #it makes 2 chars for every repating chars
использование итерационных инструментов :
tweet = 'I'm so happy about offline school'
tweet = ''.join(ch for ch, _ in itertools.groupby(tweet))
выход :
I'm so hapy about ofline schol
Как я могу это исправить? должен ли я составить список слов, которые я хочу исключить?
Кроме того, я хочу, чтобы он также мог сократить некоторые слова, содержащиеся в шаблоне, до базовой формы. Например :
wkwk (base form)
wkwkwkwk
wkwkwkwkwkwkwk
Я хочу превратить второе и третье слово в первое слово, базовую форму
Ответ №1:
Вы можете объединить регулярное выражение и NLP здесь, повторяя все слова в строке, и как только вы найдете одно с одинаковыми последовательными буквами, уменьшите их до 2 последовательных вхождений одних и тех же букв и запустите автоматическую проверку орфографии, чтобы исправить орфографию.
См. Пример кода на Python:
import re
from textblob import TextBlob
from textblob import Word
rx = re.compile(r'([^Wd_])1{2,}')
print( re.sub(r'[^Wd_] ', lambda x: Word(rx.sub(r'11', x.group())).correct() if rx.search(x.group()) else x.group(), tweet) )
# => "I'm so happy about offline school"
Код использует Textblob
библиотеку, но вы можете использовать любую, какую захотите.
Обратите внимание, что ([^Wd_])1{2,}
соответствует любым трем или более последовательным буквам, [^Wd_]
соответствует одной или нескольким буквам.
Ответ №2:
Ну, прежде всего вам нужен список (или набор) всех разрешенных слов для сравнения.
Я бы подошел к этому с предположением (которое может быть неверным), что ни одно слово не содержит последовательностей более чем из двух повторяющихся символов. Таким образом, для каждого слова создайте список всех потенциальных кандидатов, например, «haaappppppyyyy» даст вам [«haappyy», «счастливый», «счастливый» и т. Д.]. тогда остается только проверить, какое из этих слов действительно существует, сравнив его со списком разрешенных слов. Временная сложность этого довольно высока, поэтому, если это нужно сделать быстро, добавьте в него хэш-таблицу или что-то в этом роде