Регулярное выражение для принятия всех символов тайского языка и английских букв в python
Мне нужно векторизовать текстовые документы на тайском языке (например, Bag of Words, doc2vec).
Сначала я хочу просмотреть каждый документ, опуская все, кроме символов тайского языка и английских слов (например, без знаков препинания, без цифр и других специальных символов, кроме апострофов).
Для английских документов я использую это регулярное выражение:[^a-zA-Z' ]|^'|'$|''
Для тайских документов я не могу найти правильное регулярное выражение для использования. Я знаю, что блок Unicode для тайского - это u0E00–u0E7F. Я старался [^ก-๛a-zA-Z' ]|^'|'$|''
и много других комбинаций, но они не преуспевают.
Например: я хочу
"ทรูวิชั่นส์ ประกาศถ่ายทอดสดศึก ลีก ลีก อังกฤษ ทุก ทุกนัด เวลา เวลา เวลา 3 ฤดูกาล ตั้งแต่ฤดูกาล 2016/2017 - 2018/2019 ฤดูกาล ฤดูกาล ฤดูกาล ลีก ลีก ลา สเปน กัลโช กัลโช กัลโช เรี เรี และ และ เอิ เอิ เอิ เอิ, ฝรั่งเศส ภายใต้แพ็กเกจสุดคุ้ม ทั้งผ่านมือถือ และโทรทัศน์ некоторые английские слова здесь! Abc123"
быть:
ท รู วิชั่น ส์ ประกาศ ถ่ายทอด ศึก ศึก ลีก ลีก ลีก อังกฤษ ทุกนัด นัด ปี ปี ตั้งแต่ สเปน สเปน สเปน สเปน สเปน สเปน สเปน สเปน สเปน สเปน เก เก English ผ่าน มือ ถือ และ โทรทัศน์ некоторые английские слова здесь abc"
5 ответов
Я буду использовать несколько списков, чтобы делать то, что мне нужно.
Сначала давайте создадим шаблон:
pattern = re.compile(r"[^\u0E00-\u0E7Fa-zA-Z' ]|^'|'$|''")
Я буду использовать строку с именем test_string
, содержащий ваш пример:
test_string="ทรูวิชั่นส์ ประกาศถ่ายทอดสดศึกฟุตบอล พรีเมียร์ ลีก อังกฤษ ครบทุกนัดเป็นเวลา 3 ปี ตั้งแต่ฤดูกาล 2016/2017 - 2018/2019 พร้อมด้วยอีก 5 ลีกดัง อาทิ ลา ลีกา สเปน, กัลโช เซเรีย เอ อิตาลี และลีกเอิง ฝรั่งเศส ภายใต้แพ็กเกจสุดคุ้ม ทั้งผ่านมือถือ และโทรทัศน์ some, English words here! abc123"
Во-первых, давайте получим символы для удаления в списке:
char_to_remove = re.findall(pattern, test_string)
Затем давайте создадим список, составленный из символа из нашей исходной строки, без этих символов:
list_with_char_removed = [char for char in test_string if not char in char_to_remove]
Мы преобразуем этот список в строку, и все готово.
result_string = ''.join(list_with_char_removed)
Результат:
'ทรูวิชั่นส์ ประกาศถ่ายทอดสดศึกฟุตบอล พรีเมียร์ ลีก อังกฤษ ครบทุกนัดเป็นเวลา ปี ตั้งแต่ฤดูกาล พร้อมด้วยอีก ลีกดัง อาทิ ลา ลีกา สเปน กัลโช เซเรีย เอ อิตาลี และลีกเอิง ฝรั่งเศส ภายใต้แพ็กเกจสุดคุ้ม ทั้งผ่านมือถือ และโทรทัศน์ some English words here abc'
Если у вас есть какой-либо более понятный способ сделать какие-либо шаги / любые вопросы, не стесняйтесь!
В Python 3
s = "ทรูวิชั่นส์ ประกาศถ่ายทอดสดศึกฟุตบอล พรีเมียร์ ลีก อังกฤษ ครบทุกนัดเป็นเวลา 3 ปี ตั้งแต่ฤดูกาล 2016/2017 - 2018/2019 พร้อมด้วยอีก 5 ลีกดัง อาทิ ลา ลีกา สเปน, กัลโช เซเรีย เอ อิตาลี และลีกเอิง ฝรั่งเศส ภายใต้แพ็กเกจสุดคุ้ม ทั้งผ่านมือถือ และโทรทัศน์ some, English words here! abc123"
pattern = re.compile(r"(?:[^\d\W]+)|\s")
for each in pattern.findall(s): print(each, end="")
Выводы это:
ทรวชนส ประกาศถายทอดสดศกฟตบอล พรเมยร ลก องกฤษ ครบทกนดเปนเวลา ป ตงแตฤดกาล พรอมดวยอก ลกดง อาท ลา ลกา สเปน กลโช เซเรย เอ อตาล และลกเอง ฝรงเศส ภายใตแพกเกจสดคม ทงผานมอถอ และโทรทศน some English words here
Акценты удаляются, так что это не идеальный ответ. В настоящее время я смотрю вокруг, чтобы понять, почему это происходит.
РЕДАКТИРОВАТЬ: Используя диапазон символов из ответа HolyDanna, вы можете сохранить акценты. Интересно, что простое использование слова не сохраняет акценты (это, вероятно, связано с тем, как кодовые точки Unicode добавляют акценты в качестве еще одной кодовой точки после акцентированного символа, но это похоже на ошибку). Это также имеет побочный эффект удаления символов из других языков. Просто замените строку компиляции HolyDanna:
pattern = re.compile(r"[\u0E00-\u0E7Fa-zA-Z' ]")
Вы можете избавиться от апостроф (и т. Д.), Если вы этого не хотите.
К сожалению, не так много библиотек регулярных выражений с хорошей поддержкой Unicode и Python re
библиотека является одним из них. Oniguruma имеет надлежащую поддержку Unicode, и я считаю, что она имеет привязки Python, а встроенные регулярные выражения Perl имеют хорошую поддержку Unicode.
Обычно я не предлагаю, чтобы люди переключали языки, но в этом случае вы сэкономите много хлопот, используя Perl (и для справки, у меня есть золотой значок Python, и я не трогал Perl в последнее десятилетие!). Вот пример того, как это просто (должно быть то же самое в Oniguruma, который, опять же, я думаю, имеет привязки Python):
[^\p{Latin}\p{Thai}]+
Вот пример кода Perl:
#!/usr/bin/perl -w
use utf8;
$_ = "ทรูวิชั่นส์ ประ...abc123";
s/[^\p{Latin}\p{Thai}]+/ /g;
print;
print "\n";
Вот вывод:
ท รู วิชั่น ส์ ประกาศ สดศึกฟุตบอล อังกฤษ อังกฤษ อังกฤษ อังกฤษ ทุกนัดเป็น ตั้งแต่ ตั้งแต่ ตั้งแต่ ตั้งแต่ พร้อม อีก ลีก ดัง สเปน สเปน สเปน กัลโช เอิแพ็ก English ถือ และโทรทัศน์ некоторые английские слова здесь abc
В Java вы можете сопоставить комбинацию тайского и английского языков с:
^[\\p{L}\\p{javaUnicodeIdentifierPart}\\p{Blank}\\p{P}]*$
Авария:
-
\\p{L}
это "нормальная" буква -
\\p{javaUnicodeIdentifierPart}
соответствует тайской букве -
\\p{Blank}
соответствует пробелу -
\\p{P}
соответствует пунктуации.
Я не специалист в тайском языке (кроме того, что я его узнаю), но без соответствия пунктуации строка не соответствует.
Самое простое решение — использовать пакет regex.
Пакет Regex обратно совместим с re.
pip install regex
import regex
m = regex.match('[\p{Latin}\p{Thai}]+', 'ทรูวิชั่นส์asdf')
m.captures() # == ['ทรูวิชั่นส์asdf']