(2007|2008|2009|09|2010|2011|2012);GOD;2010|2011|2012
(лето|осень|зима|весна);SEZON;осень|зима
(интернет магазин|интернет-магазин|магазин);MAGAZIN;интернет магазин|интернет-магазин|магазин
интернет магазин телевизоров 2010
интернет магазин телевизоров 2010;интернет магазин телевизоров 2011;интернет магазин телевизоров 2012;интернет-магазин телевизоров 2010;интернет-магазин телевизоров 2011;интернет-магазин телевизоров 2012;магазин телевизоров 2010;магазин телевизоров 2011;магазин телевизоров 2012
#!/usr/bin/env python3
textfile = 'file.txt'
rulesfile = 'rules.txt'
outfile = 'ouput.txt'
def load_rules(ifname):
rules_lst = []
with open(ifname, encoding='utf-8') as f:
for line in f:
lst = line.strip().split(';')
name = lst[1].lower()
sublst_from = lst[0].strip('()').split('|')
sublst_to = lst[2].strip('()').split('|')
rules_lst.append([name, sublst_from, sublst_to])
return rules_lst
#for r in load_rules(rulesfile):
# print(r)
def load_text(ifname):
with open(ifname, encoding='utf-8') as f:
return next(f).strip()
#print(load_text(textfile))
rules_lst = load_rules(rulesfile)
text = load_text(textfile)
repl_lst = []
repl = text
for r in rules_lst:
name, from_lst = r[:2]
for fw in from_lst:
if fw in repl:
repl_lst.append(repl.replace(fw, '<<<' + name + '>>>', 1))
print(repl_lst)
[guest@localhost rules]$ ./rules.py
['интернет магазин телевизоров <<<god>>>', '<<<magazin>>> телевизоров 2010', 'интернет <<<magazin>>> телевизоров 2010']
[guest@localhost rules]$
py.user.nextВ моем файле слов для замен исходные слова синонимы перечислялись в круглых скобках с разделителем “|” и записывались в порядке от более длинных составных фраз к коротким, скрипт брал все, что в круглых скобках и использовал в качестве регулярного выражения для замены, таким образом вышеописанной проблемы не возникало.
дальше не могу понять:
1) при замене слова слева от него может остаться слово, которое после замены теряет смысл
например, фраза “интернет магазин телевизоров 2010”
там есть слово “магазин”, которое заменяется на “интернет магазин”
после замены получится “интернет интернет магазин телевизоров 2010”
py.user.nextтаких правил не будет, правила будут проще.
2) могут быть перекрытия
например, фраза “интернет магазин телевизоров 2010”
правила “интернет магазин -> интернет-магазин”, “магазин телевизоров -> магазин с телевизорами”
получившаяся фраза “интернет-магазин с телевизорами 2010” может быть сделана через разделение
простая генерация не подойдёт, разделение занимает много кода
#!/usr/bin/env python3
import re
textfile = 'file.txt'
rulesfile = 'rules.txt'
outfile = 'ouput.txt'
def load_rules(ifname):
rules_lst = []
with open(ifname, encoding='utf-8') as f:
for line in f:
lst = line.strip().split(';')
name = lst[1].lower()
expr_from = lst[0].strip('()')
sublst_to = lst[2].strip('()').split('|')
rules_lst.append([name, expr_from, sublst_to])
return rules_lst
#for r in load_rules(rulesfile):
# print(r)
def load_text(ifname):
with open(ifname, encoding='utf-8') as f:
return next(f).strip()
#print(load_text(textfile))
def repl_group(text, rule):
lst = []
expr, to_lst = rule[1:]
for tw in to_lst:
repl = re.sub(expr, tw, text)
lst.append(repl)
return lst
#print(repl_group('abcd', [None, 'a|c', ['1', '2', '3']]))
rules_lst = load_rules(rulesfile)
text = load_text(textfile)
out_lst = repl_group(text, rules_lst[0])
for t in (i for i in repl_group(text, rules_lst[2]) if i not in out_lst):
out_lst.extend(repl_group(t, rules_lst[0]))
print(out_lst)
[guest@localhost rules]$ ./rules.py
['интернет магазин телевизоров 2010', 'интернет магазин телевизоров 2011', 'интернет магазин телевизоров 2012', 'интернет-магазин телевизоров 2010', 'интернет-магазин телевизоров 2011', 'интернет-магазин телевизоров 2012', 'магазин телевизоров 2010', 'магазин телевизоров 2011', 'магазин телевизоров 2012']
[guest@localhost rules]$
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
import re
textfile = 'file.txt'
rulesfile = 'rules.txt'
outfile = 'ouput.txt'
def load_rules(ifname):
rules_lst = []
with open(ifname) as f:
for line in f:
lst = line.strip().split(';')
name = lst[1].lower()
expr_from = lst[0].strip('()')
sublst_to = lst[2].strip('()').split('|')
rules_lst.append([name, expr_from, sublst_to])
return rules_lst
#for r in load_rules(rulesfile):
# print r
def load_text(ifname):
with open(ifname) as f:
return next(f).strip()
#print load_text(textfile)
def repl_group(text, rule):
lst = []
expr, to_lst = rule[1:]
for tw in to_lst:
repl = re.sub(expr, tw, text)
lst.append(repl)
return lst
#print repl_group('abcd', [None, 'a|c', ['1', '2', '3']])
rules_lst = load_rules(rulesfile)
text = load_text(textfile)
out_lst = repl_group(text, rules_lst[0])
for t in (i for i in repl_group(text, rules_lst[2]) if i not in out_lst):
out_lst.extend(repl_group(t, rules_lst[0]))
out_lst = [i.decode('utf-8') for i in out_lst]
print u'; '.join(out_lst)
[guest@localhost rules]$ ./rules2.py
интернет магазин телевизоров 2010; интернет магазин телевизоров 2011; интернет магазин телевизоров 2012; интернет-магазин телевизоров 2010; интернет-магазин телевизоров 2011; интернет-магазин телевизоров 2012; магазин телевизоров 2010; магазин телевизоров 2011; магазин телевизоров 2012
[guest@localhost rules]$
AleksSRпод виндой не получится (заместит)
Или мне стоит ставить python 3