Поигрался с локальной нейросеткой, ориентированной специально на написание программ. https://huggingface.co/Qwen/Qwen2.5-Coder-7B-Instruct (в примере использования число выходных токенов увеличил до 1024)
Решил дать ей некую реальную задачу и посмотреть что из этого выйдет. Например, как она напишет конвертер для e-book из формата FB2 в plain text. По умолчанию результат выдаётся на питоне.
Недолго думая, задал ей промпт: «Write a converter from FB2 e-book format to plain text» Результат:
import sys
import re
from lxml import etree
def fb2_to_text(fb2_file):
# Parse the FB2 file
tree = etree.parse(fb2_file)
# Find all text elements within <p> tags
paragraphs = tree.xpath('//p/text()')
# Combine all paragraphs into a single string
text = ' '.join(paragraphs)
# Remove any unwanted characters or formatting
cleaned_text = re.sub(r'\n+', '\n', text.strip())
cleaned_text = re.sub(r'\s+', ' ', cleaned_text)
return cleaned_text
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage: python fb2_to_txt.py <path_to_fb2_file>")
sys.exit(1)
fb2_file = sys.argv[1]
txt_content = fb2_to_text(fb2_file)
# Write the text content to a new file
txt_file = fb2_file.replace('.fb2', '.txt')
with open(txt_file, 'w', encoding='utf-8') as f:
f.write(txt_content)
print(f"Converted {fb2_file} to {txt_file}")
Результат удивительный, вот только после работы скрипта на выходе пустой файл. Хммммм. Не сразу даже вспомнил, что вообще-то в XML бывают пространства имён и xpath их должен учитывать.
Новый промпт: «Write a converter from FB2 e-book format to plain text, using correct xpath for xmlns»
Выдало:
import sys
from lxml import etree
def fb2_to_text(fb2_file):
# Parse the FB2 file
tree = etree.parse(fb2_file)
root = tree.getroot()
# Define the namespace
nsmap = {'fb2': 'http://www.gribuser.ru/xml/fictionbook/2.0'}
# Extract the title of the book
title = root.xpath('//fb2:book-title//fb2:title', namespaces=nsmap)[0].text.strip()
# Extract all paragraphs and join them into plain text
paragraphs = root.xpath('//fb2:p/text()', namespaces=nsmap)
text_content = '\n'.join(paragraphs).strip()
return text_content
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage: python fb2_to_txt.py <path_to_fb2_file>")
sys.exit(1)
fb2_file = sys.argv[1]
text_content = fb2_to_text(fb2_file)
print(text_content)
С одной стороны лучше, но пропала запись в файл (хотя это спорно нужна ли она) и вообще скрипт при работе сваливается с ошибкой индексации на строчке title = root.xpath('//fb2:book-title//fb2:title', namespaces=nsmap)[0].text.strip()
А тут я даже не сразу сообразил в чём дело. Но для множественного выбора тегов нужно добавить вертикальную черту, т.е, должно быть
title = root.xpath('//fb2:book-title | //fb2:title', namespaces=nsmap)[0].text.strip()
Правда, отдельный вывод title и вовсе сомнительной нужности. Ну то есть, для не совсем тривиального конвертера он конечно нужен, чтобы красиво вывелся заголовок, были учтены и другие элементы оформления, но для простенького примера наверное оно лишнее. В итоге, в 1-й вариант вручную перенёс только работу с xmlns. В итоге получилось
import sys
import re
from lxml import etree
def fb2_to_text(fb2_file):
# Parse the FB2 file
tree = etree.parse(fb2_file)
# Define the namespace
nsmap = {'fb2': 'http://www.gribuser.ru/xml/fictionbook/2.0'}
# Find all text elements within <p> tags
paragraphs = tree.xpath('//fb2:p/text()',namespaces = nsmap)
# Combine all paragraphs into a single string
text = ' '.join(paragraphs)
# Remove any unwanted characters or formatting
cleaned_text = re.sub(r'\n+', '\n', text.strip())
cleaned_text = re.sub(r'\s+', ' ', cleaned_text)
return cleaned_text
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage: python fb2_to_txt.py <path_to_fb2_file>")
sys.exit(1)
fb2_file = sys.argv[1]
txt_content = fb2_to_text(fb2_file)
# Write the text content to a new file
txt_file = fb2_file.replace('.fb2', '.txt')
with open(txt_file, 'w', encoding='utf-8') as f:
f.write(txt_content)
print(f"Converted {fb2_file} to {txt_file}")
И оно работает! Простейший конвертер таки написан! Не могу сказать, что целиком нейросеткой, но у неё почти получилось. Может быть, если поупражняться с промптами, получится и вовсе сразу готовый результат.
Конечно, опытный программист данный код напишет за 10 минут не приходя в сознание, но ё-моё, эта сетка даже знает про не самый известный формат FB2.