Смещение диакритических знаков / акцентов со строк в питоне - PullRequest
1 голос
/ 03 июля 2019

Я работаю над задачей НЛП, которая требует использования корпуса языка, называемого йоруба. Йоруба - это язык с диакритическими знаками в алфавите. Если я читаю любой текст / корпус в среду Python, некоторые из верхних диакритических знаков смещаются / смещаются, особенно для алфавитов ẹ и ọ:

an image description

для символов ẹ с диакритическими знаками вверху, они смещены. иметь: ẹ́ ẹ̀ и для occurs происходит то же самое. (ọ́ ọ̀)

def readCorpus(directory="news_sites.txt"):
with open(directory, 'r',encoding="utf8", errors='replace') as doc:
data = doc.readlines()
return data

Ожидаемый результат - правильное размещение диакритических знаков в верхней части. (Я удивлен, что stackoverflow смог исправить диакритические знаки).

Позже смещенные диакритические знаки рассматриваются как знаки пунктуации и, следовательно, удаляются (с помощью моей функции обработки НЛП), что влияет на всю задачу.

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Я удалил числа, используя reg ex, потому что некоторые строки содержат числа, но использовал метод maketrans из библиотеки строк для удаления знаков препинания.

import string
out = re.sub(r'[0-9\.]+', '', ins)
punct = str.maketrans({k: None for k in string.punctuation})
new_s = out.translate(punct)
1 голос
/ 03 июля 2019

Как отметили в комментариях , ваш текст верный, он просто отображается неправильно (ваша консоль, какой бы она ни была, не дружественна Юникоду и не обрабатывает символы, объединяющие Юникод должным образом).

Ваша настоящая проблема в том, что вы пытаетесь выполнить некоторую обработку для удаления знаков препинания, а объединяющие диакритические знаки рассматриваются как знаки пунктуации и удаляются .

В вашем случае задействовано несколько объединяющих диакритических знаков, и не существует единственного порядкового номера Unicode, который представляет все их вместе взятые, поэтому использование unicodedata.normalize('NFC', originalstring) вам не поможет (это объединит один из символов объединения для ọ́, но не оба).

Таким образом, ваше единственное реальное решение состоит в том, чтобы исправить фильтр пунктуации, чтобы он не пропадал при комбинировании символов.Это не должно быть слишком сложно, просто измените код фильтрации с:

if is_punctuation(letter):  # is_punctuation is whatever test you're using to find punctuation
    # drop letter
else:
    # keep letter

на (после добавления import unicodedata в начало вашего файла):

if is_punctuation(letter) and not unicodedata.combining(letter):
    # drop letter
else:
    # keep letter

unicodedata.combining возвращает 0 для комбинированных символов, не 0 в противном случае , так что вы можете использовать его, чтобы гарантировать, что комбинированные символы не будут удалены, даже если они считаются пунктуацией по какому-либо другому стандарту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...