Я работаю с многоязычными текстовыми данными, в том числе с русским с использованием кириллицы и турецкого языка. Я в основном должен сравнить слова в двух файлах 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
Что я сделал до сих пор, основываясь на этом вопросе :
- Прочитайте принятый ответ, в котором предлагается использовать PyICU , но я хочу, чтобы мой код был пригоден для использования без необходимости устанавливать что-либо, поэтому я не реализовал его.
- Пытался
import locale
и locale.setlocale(locale.LC_ALL, 'tr_TR.UTF-8')
, как упоминалось в вопросе, но это ничего не изменило.
Реализуйте две функции 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()
? Если да, каков питонный способ сделать это? Должен ли я реализовать классы для различных языков, с которыми я работаю, и переопределить встроенные функции внутри класса для турецкого языка?