Качество исходных файлов (оригиналов) для перевода это очень серъезная проблема. Можно с уверенностью сказать - что если в тексте оригинала более трех раз повторяются десятки фрагментов по 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.