-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathunify.py
More file actions
138 lines (98 loc) · 6.91 KB
/
Copy pathunify.py
File metadata and controls
138 lines (98 loc) · 6.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# coding: utf-8
# In[1]:
#Данный файл содержит в себе правила унификации символов юникода для сокращения рабочего числа букв в дальнейшей обработке текста
#Данный модуль является обязательным в общей цепочке обработки, и сейчас заточен под русский язык.
#Чтобы адаптировать его для других языков, достаточно адаптировать список alphabet под стандартную клавиатуру на этом языке, а также проверить, что спецсимволы с точками не входят в состав алфавита этого языка
# Устанавливаем стандартную внешнюю кодировку = utf8
#import sys
#reload(sys)
#sys.setdefaultencoding('utf8')
import re
import codecs
import io
# In[2]:
def open_text(text):
#text = io.open(filename,'r', encoding='utf-8').read()
text = unify_sym(text)
return(text)
def open_lines(text):
#text = io.open(filename,'r', encoding='utf-8').readlines()
lines = []
for line in text:
lines.append(unify_sym(line))
return(lines)
# In[4]:
# фнукция использует дефолтную библиотеку
def list_replace(search,replace, text):
for c in search:
if c in text:
text = text.replace(c, replace)
return text
# In[9]:
def unify_sym(text): #принимает строку в юникоде
#сейчас эти правила ориентированы на списки для символов юникода
#для облегчения понимания используются помимо названий коды 16-ричного юникода
#предлагается все свести к следующим унифицированным вариантам:
#для кавычек - "
#для скобок - () [] {} <> оставляем как есть
#для дефиса и тире - (минус) предлагаю не различать дефис и тире, как знаки препинания, кроме случаев, где дефис разделяет части слова.
#для пробела - неразрывный заменяется на обычный, несколько пробелов подряд заменяется на 1,l то же самое для табуляций
#кавычки 00AB/00BB/2039/203A/201E/201A/201C/201F/2018/201B/201D/2019 --> 0022
text = list_replace('\u00AB\u00BB\u2039\u203A\u201E\u201A\u201C\u201F\u2018\u201B\u201D\u2019','\u0022',text)
#тире заменяется на два дефиса, в окружении пробелов по бокам. 2012/2013/2014/2015/203E/0305/00AF --> 002D
#короткое тире, среднее тире, длинное тире, цифровое тире, неразрывный дефис, дефис-минус, дефис, макроны и так далее
text = list_replace('\u2012\u2013\u2014\u2015\u203E\u0305\u00AF','\u2003\u002D\u002D\u2003',text)
#дефис 2010/2011--> 002D
text = list_replace('\u2010\u2011','\u002D',text)
#пробел
#2000/2001/2002/2004/2005/2006/2007/2008/2009/200A/200B/202F/205F/2060/3000 --> 2003
text = list_replace('\u2000\u2001\u2002\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u200B\u202F\u205F\u2060\u3000','\u2002',text)
#2 пробела в один и две табуляции в 1
#здесь оставлены регулярки, т.к. здесь нужно заменять последовательность из 2 символов
text = re.sub('\u2003\u2003','\u2003',text)
text = re.sub('\t\t','\t',text)
#остальное - десятичный разделитель, булит, диакритические точки, интерпункт
# 02CC/0307/0323/2022/2023/2043/204C/204D/2219/25E6/00B7/00D7/22C5/2219/2062 -- > точка
text = list_replace('\u02CC\u0307\u0323\u2022\u2023\u2043\u204C\u204D\u2219\u25E6\u00B7\u00D7\u22C5\u2219\u2062','.',text)
#астериск --> звездочка на 8
# 2217--> 002A
text = list_replace('\u2217','\u002A',text)
#многоточие --> три точки
text = list_replace('…','...',text)
#тильда к одному виду 2241/224B/2E2F/0483/--> 223D
text = list_replace('\u2241\u224B\u2E2F\u0483','\u223D',text)
#гласные с надстрочными символами, умляуты, диерезис, эсцет
#сами по себе умляуты, акуты, грависы мы игнорируем, оставляем только буквы с точками - и их переводим в обычные латинские
#для работы с малыми языками России, такими как удмурсткий, хантыйский, саамский и пр. следует добавить к этому списку расширенную кириллицу
text = list_replace('\u00C4','A',text) #латинская
text = list_replace('\u00E4','a',text)
text = list_replace('\u00CB','E',text)
text = list_replace('\u00EB','e',text)
text = list_replace('\u1E26','H',text)
text = list_replace('\u1E27','h',text)
text = list_replace('\u00CF','I',text)
text = list_replace('\u00EF','i',text)
text = list_replace('\u00D6','O',text)
text = list_replace('\u00F6','o',text)
text = list_replace('\u00DC','U',text)
text = list_replace('\u00FC','u',text)
text = list_replace('\u0178','Y',text)
text = list_replace('\u00FF','y',text)
text = list_replace('\u00DF','s',text)
text = list_replace('\u1E9E','S',text)
#все валюты
currencies = list('\u20BD\u0024\u00A3\u20A4\u20AC\u20AA\u2133\u20BE\u00A2\u058F\u0BF9\u20BC\u20A1\u20A0\u20B4\u20A7\u20B0\u20BF\u20A3\u060B\u0E3F\u20A9\u20B4\u20B2\u0192\u20AB\u00A5\u20AD\u20A1\u20BA\u20A6\u20B1\uFDFC\u17DB\u20B9\u20A8\u20B5\u09F3\u20B8\u20AE\u0192')
#все символы на стандартной клавиатуре:
alphabet = list('\t\n\r абвгдеёзжийклмнопрстуфхцчшщьыъэюяАБВГДЕЁЗЖИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ,.[]{}()=+-*&^%$#@!~;:0123456789§/\|"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
alphabet.append("'")
#по результатам сравнения полученного с алфавитом все остальное выкинуть
text1 = ""
for sym in text:
if sym in alphabet:
text1+=sym
else:
if sym in currencies:
text1+=sym
else:
pass
return(text1)