Форум сайта python.su
Требуется помощь в решении задачи:
Есть текстовый файл со списком фраз, есть еще один текстовый файл со списком синонимов, нужно создать новый список фраз в котором в каждой фразе будут слова заменяться на все вариации синонимов(включая и само слово).
Я ничего лучше не придумал, как сделать такой вариант:
1) создается файл с синонимами с разделителями ; в виде:
(2007|2008|2009|09|2010|2011|2012);GOD;2010|2011|2012
(GOD года|GOD год|GOD г|GODг);GOD
(GOD GOD|GOD - GOD|GOD-GOD);GOD
(лето|осень|зима|весна);SEZON;осень|зима
(интернет магазин|интернет-магазин|магазин);MAGAZIN;интернет магазин|интернет-магазин|магазин
в круглых скобках рег выражение для поиска исходной фразы для замены на название группых синонимов , после разделителя слово на которое нужно заменять(например MAGAZIN).
2) В созданном файле с замененными словами удаляются дубли(например похожие фразы, но содержащие разные года теперь вместо разных годов содержат только слово GOD, соответственно такие дубли нужно удалить).
3) В полученном файле(с заменами на общее название группы синонимов) меняем название группы синонимов по очередно на слово из массива после 2-го разделителя ; слова для всех перестановок синонимов разделены знаком |
Возникла проблема на 3-ей стадии с генерацией фраз в которых синонимы имеют 2 и более слов.
Вот код используемый для 3-й части:
for query in queries:
for equiv in equivs:
equiv = equiv.replace ("\n", "")
eqs = equiv.split(";")
check = re.search(eqs[1], query, re.IGNORECASE)
if check:
query = query.replace ("\n", "")
qrs = eqs[2].split("|")
qq = ''
for qr in qrs:
quer = re.sub(eqs[1], qr, query, re.IGNORECASE)
qq += quer + ";"
query = qq + "\n"
query = query.replace (";\n", "\n")
final2.write(query)
final2.close()
Офлайн
AleksSRоткуда следует, что предыдущие этапы выполнены правильно ?
Вот код используемый для 3-й части:
AleksSRэто поиск чего в чём ?check = re.search(eqs[1], query, re.IGNORECASE)
AleksSRне должно такого быть в генерирующем кодеequiv = equiv.replace ("\n", "")
eqs = equiv.split(";")
AleksSRэто заплатка какая-то ?query = query.replace (";\n", "\n")
Отредактировано (Ноя. 5, 2011 00:57:26)
Офлайн
py.user.nextПотому, что предыдущие результат выполнения предыдущих этапов тот, который я и ожидал.AleksSRоткуда следует, что предыдущие этапы выполнены правильно ?
Вот код используемый для 3-й части:
py.user.nextДа, это поиск слова характеризующего группу синонимов во фразе.AleksSRэто поиск чего в чём ?check = re.search(eqs[1], query, re.IGNORECASE)
слова “GOD” в строке query ?
py.user.nextЗдесь не понял вашего замечания.AleksSRне должно такого быть в генерирующем кодеequiv = equiv.replace ("\n", "")
eqs = equiv.split(";")
всё должно быть уже подготовлено на предыдующих этапах
py.user.nextВ цикле for qr in qrs: в конце добавляется ; но в самом конце строке этот символ не нужен, вот и вношу заплатку.AleksSRэто заплатка какая-то ?query = query.replace (";\n", "\n")
при генерации уже должно всё правильно записаться
py.user.next1)Фраза “интернет магазин телевизоров 2010”
напиши:
1) что вводишь
2) что получаешь
3) что должно получиться
Офлайн
AleksSR
Да, это поиск слова характеризующего группу синонимов во фразе.
check = query.lower().find(word.lower())
AleksSRкакие-то замены символов
Здесь не понял вашего замечания.
AleksSRэто надо сразу делать, при использовании .join() ничего лишнего не будет
В цикле for qr in qrs: в конце добавляется ; но в самом конце строке этот символ не нужен, вот и вношу заплатку.
AleksSRдостаточно того, что есть, чтобы понять, что это неправильно (какая-то мешанина)
Или вы имели ввиду выложить полный код?
Офлайн
py.user.nextДобрый день, я отсутствовал какое-то время по причине госпитализации, если вы еще не забыли мою тему - прошу помочь.
достаточно того, что есть, чтобы понять, что это неправильно (какая-то мешанина)
сначала подготовь списки, а потом с ними работай
никаких операций с символами во время составления фраз
1) подготовил списки
2) составил наборы
3) объединил в одну строку
4) вывел строку в файл
Офлайн
AleksSR
Какие списки нужно подготовить
# для (2007|2008|2009|09|2010|2011|2012);GOD;2010|2011|2012
lst1 = "(2007|2008|2009|09|2010|2011|2012)".strip('()').split('|')
name = "GOD".lower()
lst2 = "2010|2011|2012".split('|')
print(lst1, name, lst2, sep=';')
# для (лето|осень|зима|весна);SEZON;осень|зима
lst1 = "(лето|осень|зима|весна)".strip('()').split('|')
name = "SEZON".lower()
lst2 = "осень|зима".split('|')
print(lst1, name, lst2, sep=';')
# для (интернет магазин|интернет-магазин|магазин);MAGAZIN;интернет магазин|интернет-магазин|магазин
lst1 = "(интернет магазин|интернет-магазин|магазин)".strip('()').split('|')
name = "MAGAZIN".lower()
lst2 = "интернет магазин|интернет-магазин|магазин".split('|')
print(lst1, name, lst2, sep=';')
['2007', '2008', '2009', '09', '2010', '2011', '2012'];god;['2010', '2011', '2012']
['лето', 'осень', 'зима', 'весна'];sezon;['осень', 'зима']
['интернет магазин', 'интернет-магазин', 'магазин'];magazin;['интернет магазин', 'интернет-магазин', 'магазин']
Отредактировано (Ноя. 15, 2011 22:53:27)
Офлайн
Зачем делать списки в таком виде ведь на первом этапе работы скрипта уже произведена замена исходных вариаций на их обобщение(GOD)? Я не понимаю(моя реализация дает неверный результат если во фразе нужно заменить более одного обобщения например год и магазин), как реализовать корректную генерацию фразы с заменами 2-х групп синонимов. Можете описать коротко алгоритм 2 и 3 пунктов?
Офлайн
AleksSRдля того, чтобы потом из них составлять всевозможные комбинации
Зачем делать списки в таком виде ведь на первом этапе работы скрипта уже произведена замена исходных вариаций на их обобщение(GOD)?
AleksSRв твоей реализации всё смешано, когда всё должно быть разделено
моя реализация дает неверный результат
AleksSRчто сложного, когда у тебя есть список лет, пройти по нему и добавить в новый список фразы, начинающиеся с “интернет магазин телевизоров” и заканчивающиеся очередным годом
3) интернет магазин телевизоров 2010;интернет магазин телевизоров 2011;интернет магазин телевизоров 2012;интернет-магазин телевизоров 2010;интернет-магазин телевизоров 2011;интернет-магазин телевизоров 2012;магазин телевизоров 2010;магазин телевизоров 2011;магазин телевизоров 2012
Отредактировано (Ноя. 17, 2011 23:12:25)
Офлайн
py.user.nextЭто не сложно, сложно когда во фразе 2 компонента для замены на синонимы, например год и магазин(интернет-магазин). В дальнейшем планировал в текстовом файле очень сильно увеличить список замен.
что сложного, когда у тебя есть список лет, пройти по нему и добавить в новый список фразы, начинающиеся с “интернет магазин телевизоров” и заканчивающиеся очередным годом
Офлайн
минимальный компонент для замены - слово
нужно разделить фразу на слова
дальше объединяется часть до текущего компонента (все слова до текущего компонента), объединяется часть после текущего компонента (все слова после текущего компонента) и начинается перебор для текущего компонента (с объединением строки до, текущей строки компонента, строки после)
все полученные строки заносятся в один список
построение делается на очень простом файле с двумя компонентами
после отладки файл делается сложнее (длинная строка, где-то в середине три несмежных компонента)
Отредактировано (Ноя. 18, 2011 21:04:10)
Офлайн