Найти - Пользователи
Полная версия: Список фраз, нужно создать список фраз с заменой слов во фразе на сино
Начало » Центр помощи » Список фраз, нужно создать список фраз с заменой слов во фразе на сино
1 2 3 4 5
AleksSR
Требуется помощь в решении задачи:
Есть текстовый файл со списком фраз, есть еще один текстовый файл со списком синонимов, нужно создать новый список фраз в котором в каждой фразе будут слова заменяться на все вариации синонимов(включая и само слово).

Я ничего лучше не придумал, как сделать такой вариант:
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()
Для фразы: интернет магазин телевизоров 2010
скрипт генерирует фразы:
интернет магазин телевизоров 2010;интернет магазин телевизоров 2011;MAGAZIN телевизоров 2012;интернет-магазин телевизоров 2010;интернет-магазин телевизоров 2011;MAGAZIN телевизоров 2012;магазин телевизоров 2010;магазин телевизоров 2011;MAGAZIN телевизоров 2012

Скрипт выполняет не всю запланированную работу.
Если не сложно укажите мне на мою ошибку.
py.user.next
AleksSR
Вот код используемый для 3-й части:
откуда следует, что предыдущие этапы выполнены правильно ?

AleksSR
        check = re.search(eqs[1], query, re.IGNORECASE)
это поиск чего в чём ?
слова “GOD” в строке query ?

AleksSR
        equiv = equiv.replace ("\n", "")
eqs = equiv.split(";")
не должно такого быть в генерирующем коде
всё должно быть уже подготовлено на предыдующих этапах

AleksSR
            query = query.replace (";\n", "\n")
это заплатка какая-то ?
при генерации уже должно всё правильно записаться

напиши:
1) что вводишь
2) что получаешь
3) что должно получиться
AleksSR
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
AleksSR
            query = query.replace (";\n", "\n")
это заплатка какая-то ?
при генерации уже должно всё правильно записаться
В цикле for qr in qrs: в конце добавляется ; но в самом конце строке этот символ не нужен, вот и вношу заплатку.

py.user.next
напиши:
1) что вводишь
2) что получаешь
3) что должно получиться
1)Фраза “интернет магазин телевизоров 2010”

2) интернет магазин телевизоров 2010;интернет магазин телевизоров 2011;MAGAZIN телевизоров 2012;интернет-магазин телевизоров 2010;интернет-магазин телевизоров 2011;MAGAZIN телевизоров 2012;магазин телевизоров 2010;магазин телевизоров 2011;MAGAZIN телевизоров 2012

3) интернет магазин телевизоров 2010;интернет магазин телевизоров 2011;интернет магазин телевизоров 2012;интернет-магазин телевизоров 2010;интернет-магазин телевизоров 2011;интернет-магазин телевизоров 2012;магазин телевизоров 2010;магазин телевизоров 2011;магазин телевизоров 2012

Или вы имели ввиду выложить полный код?
py.user.next
AleksSR
Да, это поиск слова характеризующего группу синонимов во фразе.
    check = query.lower().find(word.lower())
AleksSR
Здесь не понял вашего замечания.
какие-то замены символов
должен быть подготовлен список элементов, не зависящий ни от каких символов

AleksSR
В цикле for qr in qrs: в конце добавляется ; но в самом конце строке этот символ не нужен, вот и вношу заплатку.
это надо сразу делать, при использовании .join() ничего лишнего не будет
и заплатки не нужны

AleksSR
Или вы имели ввиду выложить полный код?
достаточно того, что есть, чтобы понять, что это неправильно (какая-то мешанина)
сначала подготовь списки, а потом с ними работай
никаких операций с символами во время составления фраз

1) подготовил списки
2) составил наборы
3) объединил в одну строку
4) вывел строку в файл
AleksSR
py.user.next
достаточно того, что есть, чтобы понять, что это неправильно (какая-то мешанина)
сначала подготовь списки, а потом с ними работай
никаких операций с символами во время составления фраз

1) подготовил списки
2) составил наборы
3) объединил в одну строку
4) вывел строку в файл
Добрый день, я отсутствовал какое-то время по причине госпитализации, если вы еще не забыли мою тему - прошу помочь.
Я не понял суть того, что вы написали по пунктам. Какие списки нужно подготовить и что за наборы составить?
py.user.next
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;['интернет магазин', 'интернет-магазин', 'магазин']
вот пример (имена схематические)
это готовые данные, дальше обрабатываешь эти данные (переходишь ко второму пункту)
AleksSR
Зачем делать списки в таком виде ведь на первом этапе работы скрипта уже произведена замена исходных вариаций на их обобщение(GOD)? Я не понимаю(моя реализация дает неверный результат если во фразе нужно заменить более одного обобщения например год и магазин), как реализовать корректную генерацию фразы с заменами 2-х групп синонимов. Можете описать коротко алгоритм 2 и 3 пунктов?
py.user.next
AleksSR
Зачем делать списки в таком виде ведь на первом этапе работы скрипта уже произведена замена исходных вариаций на их обобщение(GOD)?
для того, чтобы потом из них составлять всевозможные комбинации

AleksSR
моя реализация дает неверный результат
в твоей реализации всё смешано, когда всё должно быть разделено

AleksSR
3) интернет магазин телевизоров 2010;интернет магазин телевизоров 2011;интернет магазин телевизоров 2012;интернет-магазин телевизоров 2010;интернет-магазин телевизоров 2011;интернет-магазин телевизоров 2012;магазин телевизоров 2010;магазин телевизоров 2011;магазин телевизоров 2012
что сложного, когда у тебя есть список лет, пройти по нему и добавить в новый список фразы, начинающиеся с “интернет магазин телевизоров” и заканчивающиеся очередным годом
AleksSR
py.user.next
что сложного, когда у тебя есть список лет, пройти по нему и добавить в новый список фразы, начинающиеся с “интернет магазин телевизоров” и заканчивающиеся очередным годом
Это не сложно, сложно когда во фразе 2 компонента для замены на синонимы, например год и магазин(интернет-магазин). В дальнейшем планировал в текстовом файле очень сильно увеличить список замен.
py.user.next
минимальный компонент для замены - слово
нужно разделить фразу на слова
дальше объединяется часть до текущего компонента (все слова до текущего компонента), объединяется часть после текущего компонента (все слова после текущего компонента) и начинается перебор для текущего компонента (с объединением строки до, текущей строки компонента, строки после)
все полученные строки заносятся в один список

построение делается на очень простом файле с двумя компонентами
после отладки файл делается сложнее (длинная строка, где-то в середине три несмежных компонента)
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