Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 22, 2011 13:21:14

AleksSR
От:
Зарегистрирован: 2010-06-02
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

Список фраз, нужно создать список фраз с заменой слов во фразе на сино

Не могу понять к сожалению алгоритм. Может быть вы напишите мне код этой части за небольшую денюжку?



Офлайн

#2 Ноя. 23, 2011 02:11:15

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9958
Репутация: +  856  -
Профиль   Отправить e-mail  

Список фраз, нужно создать список фраз с заменой слов во фразе на сино

дано:

файл шаблонов:

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

файл со строками:
интернет магазин телевизоров 2010;интернет магазин телевизоров 2011;интернет магазин телевизоров 2012;интернет-магазин телевизоров 2010;интернет-магазин телевизоров 2011;интернет-магазин телевизоров 2012;магазин телевизоров 2010;магазин телевизоров 2011;магазин телевизоров 2012
так всё ?



Офлайн

#3 Ноя. 23, 2011 07:11:58

AleksSR
От:
Зарегистрирован: 2010-06-02
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

Список фраз, нужно создать список фраз с заменой слов во фразе на сино

Да, именно такой должен быть результат.



Офлайн

#4 Ноя. 25, 2011 04:59:24

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9958
Репутация: +  856  -
Профиль   Отправить e-mail  

Список фраз, нужно создать список фраз с заменой слов во фразе на сино

#!/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” может быть сделана через разделение
простая генерация не подойдёт, разделение занимает много кода



Отредактировано (Ноя. 25, 2011 08:35:53)

Офлайн

#5 Ноя. 27, 2011 10:29:44

AleksSR
От:
Зарегистрирован: 2010-06-02
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

Список фраз, нужно создать список фраз с заменой слов во фразе на сино

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

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



Отредактировано (Ноя. 27, 2011 10:30:01)

Офлайн

#6 Ноя. 27, 2011 21:59:47

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9958
Репутация: +  856  -
Профиль   Отправить e-mail  

Список фраз, нужно создать список фраз с заменой слов во фразе на сино

#!/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]$
без общей для любых правил записи



Офлайн

#7 Ноя. 28, 2011 10:06:37

AleksSR
От:
Зарегистрирован: 2010-06-02
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

Список фраз, нужно создать список фраз с заменой слов во фразе на сино

Скрипт не работает, вы на 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)

Офлайн

#8 Ноя. 28, 2011 13:17:16

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9958
Репутация: +  856  -
Профиль   Отправить e-mail  

Список фраз, нужно создать список фраз с заменой слов во фразе на сино

#!/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)

Офлайн

#9 Ноя. 29, 2011 13:27:58

AleksSR
От:
Зарегистрирован: 2010-06-02
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

Список фраз, нужно создать список фраз с заменой слов во фразе на сино

Скрипт все равно не работает. Выдается ошибка:

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>



Офлайн

#10 Ноя. 29, 2011 14:01:04

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9958
Репутация: +  856  -
Профиль   Отправить e-mail  

Список фраз, нужно создать список фраз с заменой слов во фразе на сино

в 12 сообщении содержимое файлов



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version