Найти - Пользователи
Полная версия: Список фраз, нужно создать список фраз с заменой слов во фразе на сино
Начало » Центр помощи » Список фраз, нужно создать список фраз с заменой слов во фразе на сино
1 2 3 4 5
AleksSR
Не могу понять к сожалению алгоритм. Может быть вы напишите мне код этой части за небольшую денюжку?
py.user.next
дано:

файл шаблонов:
(2007|2008|2009|09|2010|2011|2012);GOD;2010|2011|2012
(лето|осень|зима|весна);SEZON;осень|зима
(интернет магазин|интернет-магазин|магазин);MAGAZIN;интернет магазин|интернет-магазин|магазин
файл с исходной фразой:
интернет магазин телевизоров 2010
получить:

файл со строками:
интернет магазин телевизоров 2010;интернет магазин телевизоров 2011;интернет магазин телевизоров 2012;интернет-магазин телевизоров 2010;интернет-магазин телевизоров 2011;интернет-магазин телевизоров 2012;магазин телевизоров 2010;магазин телевизоров 2011;магазин телевизоров 2012
так всё ?
AleksSR
Да, именно такой должен быть результат.
py.user.next
#!/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]$
дошёл до сюда

там минимальная единица не может быть словом, так как бывают заменяемые фразы из нескольких слов

дальше не могу понять:
1) при замене слова слева от него может остаться слово, которое после замены теряет смысл
например, фраза “интернет магазин телевизоров 2010”
там есть слово “магазин”, которое заменяется на “интернет магазин”
после замены получится “интернет интернет магазин телевизоров 2010”
2) могут быть перекрытия
например, фраза “интернет магазин телевизоров 2010”
правила “интернет магазин -> интернет-магазин”, “магазин телевизоров -> магазин с телевизорами”
получившаяся фраза “интернет-магазин с телевизорами 2010” может быть сделана через разделение
простая генерация не подойдёт, разделение занимает много кода
AleksSR
py.user.next
дальше не могу понять:
1) при замене слова слева от него может остаться слово, которое после замены теряет смысл
например, фраза “интернет магазин телевизоров 2010”
там есть слово “магазин”, которое заменяется на “интернет магазин”
после замены получится “интернет интернет магазин телевизоров 2010”
В моем файле слов для замен исходные слова синонимы перечислялись в круглых скобках с разделителем “|” и записывались в порядке от более длинных составных фраз к коротким, скрипт брал все, что в круглых скобках и использовал в качестве регулярного выражения для замены, таким образом вышеописанной проблемы не возникало.

py.user.next
2) могут быть перекрытия
например, фраза “интернет магазин телевизоров 2010”
правила “интернет магазин -> интернет-магазин”, “магазин телевизоров -> магазин с телевизорами”
получившаяся фраза “интернет-магазин с телевизорами 2010” может быть сделана через разделение
простая генерация не подойдёт, разделение занимает много кода
таких правил не будет, правила будут проще.
py.user.next
#!/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]$
без общей для любых правил записи
AleksSR
Скрипт не работает, вы на 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
py.user.next
#!/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
под виндой не получится (заместит)
в лине у меня несколько питонов
AleksSR
Скрипт все равно не работает. Выдается ошибка:

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>
py.user.next
в 12 сообщении содержимое файлов
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB