Проверка дублирующегося текста в оригинале

Качество исходных файлов (оригиналов) для перевода это очень серъезная проблема. Можно с уверенностью сказать - что если в тексте оригинала более трех раз повторяются десятки фрагментов по 200-300 иероглифов - то этот файл лучше не переводить, а если переводить то очень творчески - предварительно удаляя повторы.

Проблема в том что делать это после превода не имеет смысла, поскольку система переведет идентичные куски китайского текста по разному.

 

Поэтому вот скрипт, который найдет повторы многострочных фрагментов не менее заданной длинны:

import argparse
from collections import defaultdict
import itertools
import os
def find_multi_line_duplicates(file_path, fragment_size=3, min_length=10):
    """
    Находит и записывает повторяющиеся многострочные фрагменты в текстовом файле.
    
    Аргументы:
        file_path (str): Путь к входному текстовому файлу
        fragment_size (int): Количество строк для объединения в каждый фрагмент
        min_length (int): Минимальная длина символов для валидных фрагментов
    
    Возвращает:
        None: Записывает результаты в файл с суффиксом '_duplicates.txt'
    """
    # Проверка существования входного файла
    if not os.path.exists(file_path):
        raise FileNotFoundError(f"Входной файл '{file_path}' не существует")
    
    # Формирование имени выходного файла на основе имени входного файла
    base_name = os.path.splitext(file_path)[0]
    output_file = f"{base_name}_duplicates.txt"
    
    # Инициализация словаря для хранения количества фрагментов
    fragment_counts = defaultdict(int)
    
    # Чтение и обработка входного файла
    try:
        with open(file_path, 'r', encoding='utf-8') as f:
            # Чтение строк и удаление конечных пробелов
            lines = [line.strip() for line in f]
            
            # Проверка, достаточно ли строк в файле для указанного размера фрагмента
            if len(lines) < fragment_size:
                raise ValueError(f"В файле меньше строк ({len(lines)}), чем размер фрагмента ({fragment_size})")
            
            # Создание фрагментов путем объединения последовательных строк
            fragments = [
                ' '.join(lines[i:i+fragment_size]) 
                for i in range(len(lines) - fragment_size + 1)
            ]
            
            # Фильтрация фрагментов по минимальной длине
            valid_fragments = [frag for frag in fragments if len(frag) >= min_length]
            
            # Подсчет количества каждого валидного фрагмента
            for frag in valid_fragments:
                fragment_counts[frag] += 1
    
        # Запись повторяющихся фрагментов в выходной файл
        with open(output_file, 'w', encoding='utf-8') as out:
            duplicates_found = False
            for frag, count in fragment_counts.items():
                if count > 1:
                    out.write(f"{frag} (Количество: {count})\n")
                    duplicates_found = True
            
            # Запись сообщения, если повторы не найдены
            if not duplicates_found:
                out.write("Повторяющиеся фрагменты не найдены.\n")
                
        print(f"Результаты записаны в {output_file}")
        
    except Exception as e:
        print(f"Ошибка при обработке файла: {str(e)}")
        raise
def main():
    """
    Разбирает аргументы командной строки и запускает поиск повторов.
    """
    parser = argparse.ArgumentParser(description="Поиск повторяющихся многострочных фрагментов в текстовом файле")
    parser.add_argument("file_path", help="Путь к входному текстовому файлу")
    parser.add_argument("--fragment-size", type=int, default=3, 
                       help="Количество строк в фрагменте (по умолчанию: 3)")
    parser.add_argument("--min-length", type=int, default=10,
                       help="Минимальная длина символов для фрагментов (по умолчанию: 10)")
    
    args = parser.parse_args()
    
    # Проверка входных параметров
    if args.fragment_size < 1:
        raise ValueError("Размер фрагмента должен быть не менее 1")
    if args.min_length < 1:
        raise ValueError("Минимальная длина должна быть не менее 1")
    
    # Запуск поиска повторов
    find_multi_line_duplicates(args.file_path, args.fragment_size, args.min_length)
if __name__ == "__main__":
    main()

 

Зарускаем следующим образом,

python find_multi_line_duplicates.py bio-full.txt --fragment-size 6 --min-length 20

Эта команда обработает файл bio-full.txt, найдет повторы в фрагментах из 6 строк с минимальной длиной 20 символов и запишет результаты в bio-full_duplicates.txt.