translate_utils.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. import os
  2. import logging
  3. import pandas as pd
  4. from pathlib import Path
  5. from typing import List, Tuple, Union
  6. from mylib.pdfzh_translator import OpenAITranslator
  7. from mylib.read_encoding_cvs import read_csv
  8. from mylib.logging_config import setup_logging
  9. # Setup custom logging
  10. setup_logging()
  11. logger = logging.getLogger('mylib.translate_utils')
  12. def extract_column_data(df: pd.DataFrame, column_name: Union[str, int], start_row: int = 2) -> pd.Series:
  13. """提取指定列的数据,默认从第3行开始
  14. Args:
  15. df: pandas DataFrame
  16. column_name: 要提取的列名或列号(从0开始)
  17. start_row: 开始提取的行号,默认为2(第3行)
  18. Returns:
  19. 包含指定列数据的Series
  20. """
  21. try:
  22. if df.empty:
  23. return pd.Series()
  24. # 处理列号或列名
  25. if isinstance(column_name, int):
  26. if column_name < 0 or column_name >= len(df.columns):
  27. raise ValueError(f"列号 {column_name} 超出范围")
  28. column_name = df.columns[column_name]
  29. # 确保列名存在
  30. if column_name not in df.columns:
  31. raise ValueError(f"列名 {column_name} 不存在")
  32. # 确保开始行在有效范围内
  33. if start_row >= len(df) or start_row < 0:
  34. raise ValueError(f"开始行 {start_row} 超出范围")
  35. # 提取指定列的数据
  36. column_data = df.iloc[start_row:][column_name]
  37. logger.info(f"成功提取列 {column_name} 数据,从第{start_row}行开始,共{len(column_data)}条数据")
  38. logger.info(f"列 {column_name} 数据: {column_data.tolist()}")
  39. return column_data
  40. except Exception as e:
  41. logger.error(f"提取列数据时出错: {e}")
  42. raise
  43. def insert_empty_columns(df: pd.DataFrame, column_names: List[str]) -> pd.DataFrame:
  44. """在指定列之后插入空列"""
  45. try:
  46. # 按从大到小排序,防止插入影响后续索引
  47. column_names = sorted(column_names, reverse=True)
  48. for col in column_names:
  49. if col in df.columns:
  50. # 在指定列后插入空列
  51. new_col_index = df.columns.get_loc(col) + 1
  52. new_col_name = f"{col}_translated"
  53. df.insert(new_col_index, new_col_name, '')
  54. return df
  55. except Exception as e:
  56. logger.error(f"插入空列时出错: {e}")
  57. raise
  58. def extract_sample_data(df: pd.DataFrame, start_row: int = 0, column_name: str = None, n: int = 3) -> pd.DataFrame:
  59. """提取指定行和列开始的样本数据"""
  60. try:
  61. # 确保不超过数据范围
  62. end_row = min(start_row + n, len(df))
  63. if column_name:
  64. return df.iloc[start_row:end_row][[column_name]]
  65. return df.iloc[start_row:end_row]
  66. except Exception as e:
  67. logger.error(f"提取样本数据时出错: {e}")
  68. raise
  69. def log_data_details(df: pd.DataFrame, search_term_col: str, start_row: int = 2):
  70. """记录数据详细信息"""
  71. try:
  72. # 记录行号和列号
  73. logger.info(f"行号范围: {start_row}-{len(df)-1}")
  74. logger.info(f"翻译列名: {search_term_col}")
  75. # 提取并记录被翻译列的内容
  76. translated_column = df.iloc[start_row:][search_term_col]
  77. logger.info(f"被翻译列内容: {translated_column.tolist()}")
  78. except Exception as e:
  79. logger.error(f"记录数据详细信息时出错: {e}")
  80. raise
  81. def process_batch_translations(df: pd.DataFrame,
  82. search_term_col: str,
  83. start_row: int = 2) -> Tuple[pd.DataFrame, pd.DataFrame]:
  84. """批量处理搜索词翻译"""
  85. try:
  86. # 首先提取样本数据用于检查
  87. sample_data = extract_sample_data(df, start_row, search_term_col)
  88. logger.info(f"从第{start_row}行{search_term_col}列开始的样本数据:\n{sample_data}")
  89. # 记录数据详细信息
  90. log_data_details(df, search_term_col, start_row)
  91. # 初始化翻译器
  92. translator = OpenAITranslator()
  93. # 直接提取需要翻译的搜索词
  94. search_terms = df.iloc[start_row:][search_term_col].tolist()
  95. # 批量翻译
  96. logger.info("Starting search term translations...")
  97. if os.getenv('DEBUG', '').lower() in ('true', '1', 'True'):
  98. # DEBUG模式:使用模拟翻译
  99. search_translations = [f"{text} 翻译测试" for text in search_terms]
  100. else:
  101. # 正常模式:调用真实翻译
  102. search_translations = translator.translate(search_terms)
  103. logger.info("Search term translations completed")
  104. # 更新数据
  105. translated_col = f"{search_term_col}_translated"
  106. df.loc[df.index[start_row:], translated_col] = search_translations
  107. return df, sample_data
  108. except Exception as e:
  109. logger.error(f"批量翻译时出错: {e}")
  110. raise
  111. def main():
  112. output_dir = Path('temp')
  113. input_file = output_dir/"测试.csv"
  114. output_file = output_dir/"processed_测试.csv"
  115. # 使用自定义编码检测读取CSV文件
  116. data = read_csv(input_file)
  117. df = pd.DataFrame(data[1:], columns=data[0])
  118. # 提取列数据
  119. extract_column_data(df, '搜索词')
  120. # 插入空列
  121. df = insert_empty_columns(df, ['搜索词'])
  122. # 处理翻译
  123. # df, _ = process_batch_translations(df, '搜索词')
  124. if __name__ == "__main__":
  125. main()