Форум сайта python.su
Не могу понять к сожалению алгоритм. Может быть вы напишите мне код этой части за небольшую денюжку?
Офлайн
дано:
файл шаблонов:
(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]$
Отредактировано (Ноя. 25, 2011 08:35:53)
Офлайн
py.user.nextВ моем файле слов для замен исходные слова синонимы перечислялись в круглых скобках с разделителем “|” и записывались в порядке от более длинных составных фраз к коротким, скрипт брал все, что в круглых скобках и использовал в качестве регулярного выражения для замены, таким образом вышеописанной проблемы не возникало.
дальше не могу понять:
1) при замене слова слева от него может остаться слово, которое после замены теряет смысл
например, фраза “интернет магазин телевизоров 2010”
там есть слово “магазин”, которое заменяется на “интернет магазин”
после замены получится “интернет интернет магазин телевизоров 2010”
py.user.nextтаких правил не будет, правила будут проще.
2) могут быть перекрытия
например, фраза “интернет магазин телевизоров 2010”
правила “интернет магазин -> интернет-магазин”, “магазин телевизоров -> магазин с телевизорами”
получившаяся фраза “интернет-магазин с телевизорами 2010” может быть сделана через разделение
простая генерация не подойдёт, разделение занимает много кода
Отредактировано (Ноя. 27, 2011 10:30:01)
Офлайн
#!/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]$
Офлайн
Скрипт не работает, вы на python 3 писали скрипт, я использую 2.6. Как можно переделать скрипт для python 2.6? Или мне стоит ставить python 3(много скриптов использую на 2.6).
Ошибка:
File “C:\Python26\Scripts\Words classification\equiv.py”, line 7
SyntaxError: Non-ASCII character ‘\xde’ in file C:\Python26\Scripts\Words classi
fication\equiv.py on line 7, but no encoding declared; see http://www.python.org
/peps/pep-0263.html for details
Отредактировано (Ноя. 28, 2011 10:11:09)
Офлайн
#!/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
Отредактировано (Ноя. 28, 2011 13:19:04)
Офлайн
Скрипт все равно не работает. Выдается ошибка:
Traceback (most recent call last):
File “C:\Python26\Scripts\Words classification\equiv.py”, line 39, in <module>
rules_lst = load_rules(rulesfile)
File “C:\Python26\Scripts\Words classification\equiv.py”, line 16, in load_rul
es
sublst_to = lst.strip('()').split('|')
IndexError: list index out of range
C:\Python26\Scripts\Words classification>
Офлайн
в 12 сообщении содержимое файлов
Офлайн