1 line
9.8 KiB
JSON
1 line
9.8 KiB
JSON
{"repo": "alxeq/chat2.0", "files": {".streamlit/secrets.toml": {"1fcdc025313f365e5add0f902aa93cc6fb33ac06": {"t": 1785745365.266936, "n": 157, "h": "faaeba11fe8855d6", "c": "[default]\nDEEPSEEK_API_KEY = \"sk-74a04f4828894b739c8629de9a11818c\n\"\n"}}, "app.dy": {"1fcdc025313f365e5add0f902aa93cc6fb33ac06": {"t": 1785746382.9771457, "n": 3840, "h": "b5c5b0c2a04eb55e", "c": "import os\r\nimport pandas as pd\r\nimport docx2txt\r\nimport tempfile\r\nimport pdfplumber\r\nimport requests\r\nimport streamlit as st\r\n\r\n# 从环境变量读取 DeepSeek API Key\r\nDEEPSEEK_API_KEY = os.environ.get(\"DEEPSEEK_API_KEY\")\r\n\r\ndef call_deepseek_api(prompt):\r\n url = \"https://api.deepseek.com/v1/chat/completions\"\r\n headers = {\r\n \"Content-Type\": \"application/json\",\r\n \"Authorization\": f\"Bearer {DEEPSEEK_API_KEY}\"\r\n }\r\n data = {\r\n \"model\": \"deepseek-chat\",\r\n \"messages\": [{\"role\": \"user\", \"content\": prompt}],\r\n \"temperature\": 0.7\r\n }\r\n response = requests.post(url, headers=headers, json=data)\r\n if response.status_code == 200:\r\n return response.json()['choices'][0]['message']['content']\r\n else:\r\n return f\"调用 DeepSeek API 失败,状态码 {response.status_code}: {response.text}\"\r\n\r\ndef extract_text_from_pdf(uploaded_file):\r\n text = \"\"\r\n with pdfplumber.open(uploaded_file) as pdf:\r\n for page in pdf.pages:\r\n page_text = page.extract_text()\r\n if page_text:\r\n text += page_text + \"\\n\"\r\n return text\r\n\r\ndef extract_text_from_docx(uploaded_file):\r\n with tempfile.NamedTemporaryFile(delete=False, suffix=\".docx\") as tmp:\r\n tmp.write(uploaded_file.read())\r\n tmp.flush()\r\n text = docx2txt.process(tmp.name)\r\n return text\r\n\r\ndef extract_text(file):\r\n if file.name.endswith(\".pdf\"):\r\n return extract_text_from_pdf(file)\r\n elif file.name.endswith(\".docx\"):\r\n return extract_text_from_docx(file)\r\n elif file.name.endswith(\".txt\"):\r\n return file.read().decode(\"utf-8\")\r\n else:\r\n return \"不支持的文件类型\"\r\n\r\ndef analyze_interview(transcript, outline):\r\n prompt = f\"\"\"\r\n你是一个访谈内容分析助手。请根据以下访谈大纲,对访谈内容进行结构化整理。\r\n\r\n访谈大纲:\r\n{outline}\r\n\r\n访谈记录:\r\n{transcript}\r\n\r\n请生成一个表格,包含以下列:\r\n- 大纲问题\r\n- 匹配内容摘要\r\n- 覆盖情况(充分 / 部分 / 未覆盖)\r\n- 建议补问\r\n\r\n请以markdown表格格式返回结果。\r\n\"\"\"\r\n return call_deepseek_api(prompt)\r\n\r\n# 新增 Markdown 表格解析函数\r\ndef parse_markdown_table(md_text):\r\n lines = [line for line in md_text.split('\\n') if line.strip().startswith('|')]\r\n if len(lines) < 2:\r\n return None\r\n\r\n header = [col.strip() for col in lines[0].strip().strip('|').split('|')]\r\n rows = []\r\n for line in lines[2:]:\r\n cols = [col.strip() for col in line.strip().strip('|').split('|')]\r\n if len(cols) == len(header):\r\n rows.append(cols)\r\n\r\n return pd.DataFrame(rows, columns=header)\r\n\r\ndef main():\r\n st.set_page_config(page_title=\"访谈结构整理工具\", layout=\"wide\")\r\n st.title(\"📋 访谈结构整理 MVP 工具\")\r\n\r\n st.markdown(\"### 第一步:上传访谈文件(pdf、docx、txt)\")\r\n interview_file = st.file_uploader(\"上传访谈记录文件:\", type=[\"pdf\", \"docx\", \"txt\"])\r\n\r\n st.markdown(\"### 第二步:上传访谈大纲(docx、txt)\")\r\n outline_file = st.file_uploader(\"上传访谈大纲文件:\", type=[\"docx\", \"txt\"])\r\n\r\n if st.button(\"🚀 开始分析\") and interview_file and outline_file:\r\n with st.spinner(\"⏳ 正在提取与分析内容,请稍候...\"):\r\n transcript = extract_text(interview_file)\r\n outline = extract_text(outline_file)\r\n\r\n result_markdown = analyze_interview(transcript, outline)\r\n\r\n st.markdown(\"### ✅ 分析结果\")\r\n st.markdown(result_markdown, unsafe_allow_html=True)\r\n\r\n # 替换导出按钮逻辑\r\n try:\r\n df = parse_markdown_table(result_markdown)\r\n if df is not None:\r\n st.download_button(\r\n label=\"📥 下载结果为 Excel\",\r\n data=df.to_excel(index=False, engine='openpyxl'),\r\n file_name=\"interview_analysis.xlsx\",\r\n mime=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\r\n )\r\n else:\r\n st.warning(\"⚠️ 未能识别 Markdown 表格,请检查输出格式是否正确。\")\r\n except Exception as e:\r\n st.error(f\"❌ 转换结果失败:{e}\")\r\n\r\nif __name__ == \"__main__\":\r\n main()\r\n"}, "cd7c39223c6e2c46d2238950debe46ce898db333": {"t": 1785750768.1576338, "n": 3840, "h": "b5c5b0c2a04eb55e", "c": "import os\r\nimport pandas as pd\r\nimport docx2txt\r\nimport tempfile\r\nimport pdfplumber\r\nimport requests\r\nimport streamlit as st\r\n\r\n# 从环境变量读取 DeepSeek API Key\r\nDEEPSEEK_API_KEY = os.environ.get(\"DEEPSEEK_API_KEY\")\r\n\r\ndef call_deepseek_api(prompt):\r\n url = \"https://api.deepseek.com/v1/chat/completions\"\r\n headers = {\r\n \"Content-Type\": \"application/json\",\r\n \"Authorization\": f\"Bearer {DEEPSEEK_API_KEY}\"\r\n }\r\n data = {\r\n \"model\": \"deepseek-chat\",\r\n \"messages\": [{\"role\": \"user\", \"content\": prompt}],\r\n \"temperature\": 0.7\r\n }\r\n response = requests.post(url, headers=headers, json=data)\r\n if response.status_code == 200:\r\n return response.json()['choices'][0]['message']['content']\r\n else:\r\n return f\"调用 DeepSeek API 失败,状态码 {response.status_code}: {response.text}\"\r\n\r\ndef extract_text_from_pdf(uploaded_file):\r\n text = \"\"\r\n with pdfplumber.open(uploaded_file) as pdf:\r\n for page in pdf.pages:\r\n page_text = page.extract_text()\r\n if page_text:\r\n text += page_text + \"\\n\"\r\n return text\r\n\r\ndef extract_text_from_docx(uploaded_file):\r\n with tempfile.NamedTemporaryFile(delete=False, suffix=\".docx\") as tmp:\r\n tmp.write(uploaded_file.read())\r\n tmp.flush()\r\n text = docx2txt.process(tmp.name)\r\n return text\r\n\r\ndef extract_text(file):\r\n if file.name.endswith(\".pdf\"):\r\n return extract_text_from_pdf(file)\r\n elif file.name.endswith(\".docx\"):\r\n return extract_text_from_docx(file)\r\n elif file.name.endswith(\".txt\"):\r\n return file.read().decode(\"utf-8\")\r\n else:\r\n return \"不支持的文件类型\"\r\n\r\ndef analyze_interview(transcript, outline):\r\n prompt = f\"\"\"\r\n你是一个访谈内容分析助手。请根据以下访谈大纲,对访谈内容进行结构化整理。\r\n\r\n访谈大纲:\r\n{outline}\r\n\r\n访谈记录:\r\n{transcript}\r\n\r\n请生成一个表格,包含以下列:\r\n- 大纲问题\r\n- 匹配内容摘要\r\n- 覆盖情况(充分 / 部分 / 未覆盖)\r\n- 建议补问\r\n\r\n请以markdown表格格式返回结果。\r\n\"\"\"\r\n return call_deepseek_api(prompt)\r\n\r\n# 新增 Markdown 表格解析函数\r\ndef parse_markdown_table(md_text):\r\n lines = [line for line in md_text.split('\\n') if line.strip().startswith('|')]\r\n if len(lines) < 2:\r\n return None\r\n\r\n header = [col.strip() for col in lines[0].strip().strip('|').split('|')]\r\n rows = []\r\n for line in lines[2:]:\r\n cols = [col.strip() for col in line.strip().strip('|').split('|')]\r\n if len(cols) == len(header):\r\n rows.append(cols)\r\n\r\n return pd.DataFrame(rows, columns=header)\r\n\r\ndef main():\r\n st.set_page_config(page_title=\"访谈结构整理工具\", layout=\"wide\")\r\n st.title(\"📋 访谈结构整理 MVP 工具\")\r\n\r\n st.markdown(\"### 第一步:上传访谈文件(pdf、docx、txt)\")\r\n interview_file = st.file_uploader(\"上传访谈记录文件:\", type=[\"pdf\", \"docx\", \"txt\"])\r\n\r\n st.markdown(\"### 第二步:上传访谈大纲(docx、txt)\")\r\n outline_file = st.file_uploader(\"上传访谈大纲文件:\", type=[\"docx\", \"txt\"])\r\n\r\n if st.button(\"🚀 开始分析\") and interview_file and outline_file:\r\n with st.spinner(\"⏳ 正在提取与分析内容,请稍候...\"):\r\n transcript = extract_text(interview_file)\r\n outline = extract_text(outline_file)\r\n\r\n result_markdown = analyze_interview(transcript, outline)\r\n\r\n st.markdown(\"### ✅ 分析结果\")\r\n st.markdown(result_markdown, unsafe_allow_html=True)\r\n\r\n # 替换导出按钮逻辑\r\n try:\r\n df = parse_markdown_table(result_markdown)\r\n if df is not None:\r\n st.download_button(\r\n label=\"📥 下载结果为 Excel\",\r\n data=df.to_excel(index=False, engine='openpyxl'),\r\n file_name=\"interview_analysis.xlsx\",\r\n mime=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\r\n )\r\n else:\r\n st.warning(\"⚠️ 未能识别 Markdown 表格,请检查输出格式是否正确。\")\r\n except Exception as e:\r\n st.error(f\"❌ 转换结果失败:{e}\")\r\n\r\nif __name__ == \"__main__\":\r\n main()\r\n"}}}} |