Правильно обрабатывать турецкие прописные и строчные буквы, нужно изменить / переопределить встроенные функции? - PullRequest
0 голосов
/ 02 мая 2018

Я работаю с многоязычными текстовыми данными, в том числе с русским с использованием кириллицы и турецкого языка. Я в основном должен сравнить слова в двух файлах my_file и check_file, и если слова в my_file можно найти в check_file, запишите их в выходной файл, сохраняя метаинформацию об этих словах из обоих входных данных. файлы.

Некоторые слова в нижнем регистре, в то время как другие слова пишутся с заглавной буквы, поэтому я должен сделать строчные буквы для сравнения всех слов Поскольку я использую Python 3.6.5, а в Python 3 по умолчанию используется юникод, он обрабатывает строчные буквы, а затем корректно использует заглавные слова для кириллицы. Однако для турецкого языка некоторые буквы обрабатываются некорректно. Прописные буквы 'İ' должны соответствовать строчным буквам 'i', прописные буквы 'I' должны соответствовать строчным буквам 'ı', а строчные буквы 'i' должны соответствовать прописным буквам 'İ', что не так, если я набираю в консоли следующее:

>>> print('İ'.lower())
i̇  # somewhat not rendered correctly, corresponds to unicode 'i\u0307'
>>> print('I'.lower())
i
>>> print('i'.upper())
I

Я делаю следующее (упрощенный пример кода):

# python my_file check_file language

import sys

language = sys.argv[3]

# code to get the files as lists

my_file_list = [['ıspanak', 'N'], ['ısır', 'N'], ['acık', 'V']]
check_file_list = [['109', 'Ispanak', 'food_drink'], ['470', 'Isır', 'action_words'], [409, 'Acık', 'action_words']]

# get the lists as dict
my_dict = {}
check_dict = {}

for l in my_file_list:
    word = l[0].lower()
    pos = l[1]
    my_dict[word] = pos

for l in check_file_list:
    word_id = l[0]
    word = l[1].lower()
    word_cat = l[2]
    check_dict[word] = [word_id, word_cat]

# compare the two dicts
for word, pos in my_dict.items():
    if word in check_dict:
        word_id = check_dict[word][0]
        word_cat = check_dict[word][1]
        print(word, pos, word_id, word_cat)

Это дает мне только один результат, но должно дать мне три слова:

acık V 409 action_words

Что я сделал до сих пор, основываясь на этом вопросе :

  1. Прочитайте принятый ответ, в котором предлагается использовать PyICU , но я хочу, чтобы мой код был пригоден для использования без необходимости устанавливать что-либо, поэтому я не реализовал его.
  2. Пытался import locale и locale.setlocale(locale.LC_ALL, 'tr_TR.UTF-8'), как упоминалось в вопросе, но это ничего не изменило.
  3. Реализуйте две функции turkish_lower(self) и turkish_upper(self) для трех проблемных букв, как описано во втором ответе, который, кажется, является единственным решением:

    def turkish_lower(self):
        self = re.sub(r'İ', 'i', self)
        self = re.sub(r'I', 'ı', self)
        self = self.lower()
        return self
    
    def turkish_upper(self):
        self = re.sub(r'i', 'İ', self)
        self = self.upper()
        return self
    

Но как я могу использовать эти две функции без необходимости каждый раз проверять if language == 'Turkish'? Стоит ли переопределять встроенные функции lower() и upper()? Если да, каков питонный способ сделать это? Должен ли я реализовать классы для различных языков, с которыми я работаю, и переопределить встроенные функции внутри класса для турецкого языка?

1 Ответ

0 голосов
/ 29 июня 2018

Я бы предложил попробовать установить турецкий языковой пакет для локали:

sudo apt-get install language-pack-tr
sudo dpkg-reconfigure locales  # *

Вы также можете проверить, какие языки у вас есть в локали, используя команду терминала: $ locale -a

https://forum.yazbel.com/t/cozuldu-locale-setlocale-locale-lc-all-tr-tr-yapisinda-sorun-yasiyorum-turkce-karakter-sorunu/476

...