• Автоматизация большого объема информации?

    DDDsa
    @DDDsa
    1. Определяем виды и структуру документов. Для парсинга потребуются либо ключевые слова (например первое число после фразы "Высота:" или вся строка после фразы "Задание: ") либо расположение абзацев, знаков (Например, последний абзац — всегда описание или список, начинающийся с - или * — это перечень материалов и т д). Если структура произвольная, то тут два выхода:
    - либо сохраняем весь текст целиком (но тут сложный поиск не реализовать);
    - либо обрабатываем вручную каждый документ (трудоёмко, если документов много).

    2. Выбираем язык, который больше нравится; ищем для этого языка библиотеки для работы с нужными форматами (doc, PDF) или способы выкрутиться, например, сконвертировать в другой формат, с которым работать удобнее и т д.

    3. Выбираем БД и библиотеку для работы с ней нашего языка. Создаём схему (таблицы), которая соответствует задаче.

    4. По определённой в пункте 1 структуре начинаем парсить документы. Сначала берём один документ и пишем парсер для него, потом пытаемся примерить этот парсер для другого документа — понимаем, что нужно изменить, расставляем условия и т д. В итоге должен получиться набор данных, вроде массива объектов, где каждый объект — распарсенный документ.

    5. Сохраняем полученный массив объектов в БД, по пути правим схему, потому что наверняка в п. 3 мы учли не всё.

    6. По сути, на этом можно закончить, далее поиск можно осуществлять запросами, средствами БД. Но если интересно, или если данными будут пользоваться другие люди — можно написать интерфейс. Это уже следующая большая задача: выбор интерфейса и его реализация.
    Ответ написан
    1 комментарий
  • Как отобразить значение переменной в кавычках?

    DDDsa
    @DDDsa
    для Python 3.6 и выше

    print(f'"{c}"')
    Ответ написан
    Комментировать
  • Как в python подсчитать заголовки в тексте?

    DDDsa
    @DDDsa
    Где s — текст вашего вопроса:
    >>> re.findall('\n([\w\s]+?)(?=\n)', s)
    ['они могут быть как', 'Посадил дед репку', 'ПОСАДИЛ ДЕД РЕПКУ', 'Посадил Дед Репку']


    Оно?
    Ответ написан
    Комментировать
  • Как найти html тэги в txt файле?

    DDDsa
    @DDDsa
    Если любой тег, то вот так:
    r'<(\w+)([\s\S]+?)<\/\1>'
    При этом вернётся два значения, тег и его содержимое:
    >>> tables = re.findall(r'<(\w+)([\s\S]+?)<\/\1>', s)
    >>> tables
    [('table', ' id=1>\n    <tr>\n        <td>Some Text</td>\n    </tr>\n'), ('table', ' id=2>\n    <tr>\n        <td>Some Text</td>\n    </tr>\n')]


    Если нужно вытаскивать только тег table (или других точно не будет), тогда вот так:
    r'<table([\s\S]+?)<\/table>'

    Пример:
    >>> tables = re.findall(r'<table([\s\S]+?)<\/table>', s)
    >>> tables
    [' id=1>\n    <tr>\n        <td>Some Text</td>\n    </tr>\n', ' id=2>\n    <tr>\n        <td>Some Text</td>\n    </tr>\n']
    Ответ написан
    Комментировать
  • Какой оптимальный способ создания файлов?

    DDDsa
    @DDDsa
    Я бы сохранял разом. 3-4 тысячи строк — это сколько, 150КБ? Пусть даже 300КБ, нет никаких проблем подержать такой объём в памяти, не отвлекаясь сброс в файл, а потом сохранить разом.

    Процесс парсинга идёт, наверное, секунду от силы? Не заморачивайтесь, сохраняйте результаты по окончании.

    PS, конечно, следует правильно расставить обработку эксепшнов, если они возможны.
    Ответ написан
    Комментировать
  • Абсолютный нуб. Какими built-in functions пользоваться для базовой задачи на Python?

    DDDsa
    @DDDsa
    Вот вариант решения вашей задачи:

    animal = input('Enter an animal: ')
    
    try:
        input_colors = input('How many colors? ')
        num_colors = int(input_colors)
    except ValueError:
        print('%s is not a number' % input_colors)
        exit()
    
    colors = []
    for i in range(num_colors):
        colors.append(input('Color %s: ' % (i + 1)))
    
    for color in colors:
        print('%s %s' % (color, animal))
    Ответ написан
    Комментировать
  • Почему не получается построчно прочитать файл?

    DDDsa
    @DDDsa
    Во-первых, после in не нужно двоеточие.
    Во-вторых, в коде вы оба раза читаете не построчно, а посимвольно. read() возвращает строку со всем содержимым файла целиком. Вам нужен метод readlines(), он вернёт список строк файла.

    Но в python есть способ прочитать файл построчно, не загоняя его в память целиком, просто запустите цикл по открытому файлу for line in file.

    А лучше всего вот так:

    with open('test.txt', 'r') as f:
         for l in f:
                 print(l)
    Ответ написан
  • Где найти хороший мануал по regexp?

    DDDsa
    @DDDsa
    Я в свое время изучил так:
    Сначала прочитал про основы, вроде того, что такое \S и \s, что делает точка, что звёздочка, чтобы хоть как-то ориентироваться. А потом просто включил в своём редакторе кода режим поиска по регуляркам. В саблайме это вот так:

    5acddf5a11384061144860.png

    И больше уже не выключал. Сначала искал как обычно. При простых поисках по тексту я потихоньку привык, что надо эскейпить символы вроде ( и .
    Потом начал потихоньку применять разные плюшки регекспа вроде поиска новой строки или нескольких символов подряд.

    Ну а потом начали возникать случаи, когда нужно найти в тексте что-то посложнее. Вообще, эти случаи возникают у всех и всегда, просто те, кто не знают регулярок, выходят из положения другими (зачастую менее удобными) способами. Но тут я принципиально пытался каждый случай решить при помощи регулярок. Сначала просто гуглил, потом нашёл сайт www.regexr.com . Их, на самом деле, много подобных. Там сразу шпаргалка по командам регекспа и песочница, где можно проверить с красивой подсветкой все команды.

    Вот и всё. Я, по сути, даже не изучал ничего (кроме того часа, что потратил на чтение про основы), просто не выключал режим поиска по регуляркам в саблиме и не позволял себе решать задачи поиска другими способами.

    Теперь без регулярок жить не могу
    Ответ написан
    Комментировать
  • Как соединить списки по условию?

    DDDsa
    @DDDsa
    a = [[i, i*100] for i in range(15000)]
    b = [[i, i*110] for i in range(15000)]
    c = {}
    
    for i in a+b:
        c.setdefault(i[0], []).append(i[1:])


    Так, например?

    UPD: с точки зрения транжирства ресурсов наверное правильнее вместо for i in a+b сделать два цикла, для a и для b. Так мы не будем выделять память под новый бесполезный список только чтобы код смотрелся лаконичнее. Но 15000 подсписков — это, в общем, ерунда и особо заморачиваться не стоит.
    Ответ написан
    1 комментарий
  • Метод readline() - как прочитать случайные строки из txt-файла?

    DDDsa
    @DDDsa
    вместо
    msg['Subject'] = f.readline()[0:85] #строка создающая заголовок

    напишите
    msg['Subject'] = random.choice(f.readlines())[:85] #строка создающая заголовок
    Ответ написан
    3 комментария
  • Как корректно добавлять данные в БД?

    DDDsa
    @DDDsa
    А как вы будете посредством питона определять новые записи? Они как-то помечены в файле? Или вы на каждую запись будете делать селект из базы, чтобы проверить, есть она там или нет?
    Если помечены, то проще в питоне выбирать только новые и загружать их в базу. Если не помечены, то двадцать тысяч селектов для проверки актуальности будет работать гораздо медленнее чем один большой инзёрт во временную таблицу и потом сравнение средствами самой базы.
    Ответ написан
  • Какие есть сервисы для обработки данных из таблиц Excel?

    DDDsa
    @DDDsa
    Я думаю, проблема в том, что выгрузку делает кто-то другой и к автору попадают уже эти xls-файлы, с которыми автору приходится работать.

    Это стандартная задача для всяких финансовых ERP-систем. Например, надо загружать накладные от разных банков, причём у каждого банка свой формат и набор данных в файлах накладных. Никакой магии тут нет — просто пишется обработчик для каждого банка, который считывает данные с файла и загружает их в БД. А уж в БД можно играться с ними как угодно.
    В вашем случае это будет (довольно тривиальный) скрипт, например, на python, который данные из колонок грузит в БД (возможно, предварительно удаляя старые данные из таблицы).

    Натыкался также на какой-то плагин для Excel, который позволяет делать запросы к данным как будто это БД. Возможно, это будет выход проще, гугл в помощь.
    Ответ написан
    Комментировать
  • Какой софт используют профессиональные писатели и копирайтеры на Windows?

    DDDsa
    @DDDsa
    Не знаю, как копирайтеры, а у нас технические писатели всю документацию ведут в маркдауне. Соответственно, выбор софта большой: хоть VScode, хоть Sublime Text. Берёшь плагины для подсветки синтаксиса да проверки орфографии и вперёд. Мультикурсор, поиск и замена регулярками, всё как у взрослых.
    Ответ написан
    3 комментария
  • Как сделать выгрузку из oracle 11g в exel файл?

    DDDsa
    @DDDsa
    Любой БД-менеджер (PL/SQL developer, SQL developer, DataGrip и т д) умеет сохранять результаты запроса в xls или csv, некоторые умеют даже выгружать всю базу. Выполните запрос и поищите кнопку экспорта.

    Что касается дат, то всё зависит от того, в каком формате дата хранится в базе. Если DATE, то скорее всего ничего делать не надо будет. Если в текстовом или в TIMESTAMP, то придётся сконвертировать функциями CONVERT, CAST, TO_DATE или другой подходящей.

    Если дадите больше вводных (каким бд-менеджером пользуетесь, примеры данных), могу конкретизировать : )
    Ответ написан
    Комментировать
  • Как автоматически перевести текст с аглийского на русский, чтобы каждое переведенное слово стояло следом за исходным?

    DDDsa
    @DDDsa
    Есть корпуса с текстами и их переводами на разные языки (включая русский), где установлены связи между предложениями, так что можно посмотреть, что как переведено. Многие сервисы, наподобие Reverso Context пользуются именно ими.

    Самый известный сайт с тоннами бесплатных материалов: opus.nlpl.eu
    Когда ковырял, кажется, данные там были в XML-файлах, так что можно взять любой язык программирования и набросать простецкую оболочку самому.

    5a5f19e17a62b505936362.png
    Ответ написан
    Комментировать
  • Каков алгоритм работы сервиса типа rifmaslovo.ru?

    DDDsa
    @DDDsa
    Ищете статьи на тему, как работает рифма, создаёте набор правил, присваиваете им ранг, ищете по этим правилам слова в словаре и выдаёте пользователю, отсортировав по рангу.

    Первое, что приходит в голову: берём словарь ударений отрезаем от слова из запроса всё окончание, начиная с ударной гласной, ищем по словарю слова с таким же окончанием и той же ударной гласной. "красивый" — "сивый". Это будет первый ранг

    Второй ранг будет немного изменённое окончание. Например, если пользователь ввёл слово "кратный", можно заменить "а" на "я" и найти, например "приятный". "у" на "ю" — "подруга", "вьюга".

    Третий ранг можно сделать ещё более мягким, например, в окончании может присутствовать одна дополнительная согласная, или порядок согласных может различаться.

    Это только что пришло сходу в голову. База данных со словарём, RegEx в руки и вперёд
    ***
    UPD: В сервисе у вас по ссылке вообще всё примитивно. Они выводят сначала то, что я описал выше как первый ранг, а потом отрезают от окончания по одной букве и ищут такие же окончания. Бред, это уже не рифмы
    Ответ написан
    Комментировать