1 | { |
1 | { |
1 | { |
word 分段落替换 https://deepoove.com/poi-tl/
Flask Python 服务器部署
1. 准备服务器
首先,你需要一个可以运行 Python 的服务器。你可以使用以下服务:
- 云服务提供商:如 AWS、阿里云、DigitalOcean 等。
- VPS 提供商:如 Linode、Vultr 等。
确保服务器上安装了 Python 和 pip。
2. 连接到服务器
使用 SSH 连接到你的服务器:
ssh username@your_server_ip
3. 安装依赖
在服务器上,确保你已经安装了 Python 和 pip。你可以使用以下命令检查:
python3 --version pip3 --version
如果没有安装,可以使用以下命令安装:
sudo apt update sudo apt install python3 python3-pip
4. 上传代码
将你的 Flask 应用代码上传到服务器。可以使用 SCP、FTP 或 Git 来上传文件。下面是使用 SCP 的示例:
scp -r /path/to/your/project username@your_server_ip:/path/to/target/directory
5. 创建虚拟环境
在你的项目目录中创建一个虚拟环境:
cd /path/to/target/directory python3 -m venv venv source venv/bin/activate
6. 安装项目依赖
在虚拟环境中安装你的项目依赖:
pip install -r requirements.txt
7. 运行 Flask 应用
在开发环境中,你可以使用以下命令运行 Flask 应用:
python app.py
但是在生产环境中,最好使用 WSGI 服务器(如 Gunicorn)来运行 Flask 应用:
pip install gunicorn gunicorn -w 4 app:app --bind 0.0.0.0:5000
这里 -w 4 表示使用 4 个工作进程,你可以根据需要调整。
8. 配置反向代理(可选)
为了在 80 或 443 端口上提供服务,建议使用 Nginx 作为反向代理:
安装 Nginx
sudo apt install nginx
配置 Nginx
创建一个新的 Nginx 配置文件,例如 /etc/nginx/sites-available/my_flask_app:
nginx
复制代码
server { listen 80; server_name your_server_ip; # 或者你的域名 location / { proxy_pass http://127.0.0.1:5000; # Flask 应用的地址 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
创建符号链接到 sites-enabled:
sudo ln -s /etc/nginx/sites-available/my_flask_app /etc/nginx/sites-enabled
测试 Nginx 配置并重启服务:
sudo nginx -t sudo systemctl restart nginx
9. 配置防火墙(可选)
确保服务器的防火墙允许 HTTP 和 HTTPS 流量:
sudo ufw allow 'Nginx Full'
10. 访问你的应用
现在,你应该能够通过浏览器访问你的 Flask 应用,使用服务器的 IP 地址或域名。
额外建议
- 使用 HTTPS:在生产环境中,强烈建议使用 HTTPS。可以使用 Let’s Encrypt 来免费申请 SSL 证书。
- 监控和日志:考虑使用工具来监控应用的性能和日志,以便及时发现问题。
python
好的,这里是一个详细的Python方案,包括登录页面、选择文件夹、处理PDF文件并将数据存储到SQLite数据库,以及在线更新功能。
1. 环境配置和库安装
1 | pip install PyInstaller PyUpdater PyPDF2 pdfminer.six pymupdf tkinter requests |
2. 登录页面和主程序逻辑
2.1. 创建登录界面
创建一个文件 login.py 用于实现登录界面:
1 | import tkinter as tk |
2.2. 主程序逻辑
创建 main.py 实现主程序逻辑:
1 | import os |
2.3. 在线更新功能
创建 client_config.py 配置PyUpdater:
1 | import os |
在 main.py 的 run_app 函数中加入更新检查:
1 | def run_app(): |
2.4. 打包应用程序
创建一个 spec 文件来配置打包设置(your_script.spec):
1 | # your_script.spec |
然后使用 pyinstaller 打包:
1 | pyinstaller your_script.spec |
3. 配置和初始化PyUpdater
1 | pyupdater init |
4. 部署和测试
将生成的可执行文件和更新配置上传到你的服务器。然后运行打包好的应用程序,确保登录功能、PDF处理功能和在线更新功能都正常工作。
这样,你就有了一个带有登录功能的Windows应用程序,可以选择文件夹中的PDF文件进行处理,并支持在线更新。
要读取多个Excel文件并两两判断它们之间是否存在高度重复的数据,可以按以下步骤进行
:
- 读取所有Excel文件。
- 提取并整理数据。
- 比较每对Excel文件的数据。
- 计算重复率。
- 输出比较结果。
可以使用 pandas 库来处理Excel文件,利用 pandas 的 DataFrame 结构进行数据比较和重复率计算。
1. 安装必要的库
首先,确保你已经安装了 pandas 和 openpyxl 库:
bash
复制代码
pip install pandas openpyxl
2. 读取所有Excel文件
使用 pandas 读取Excel文件,并提取数据。
python
复制代码
import os import pandas as pd def read_excel_files(folder_path): excel_files = [os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.endswith('.xlsx')] dataframes = {f: pd.read_excel(f) for f in excel_files} return dataframes folder_path = 'your_folder_with_excel_files' dataframes = read_excel_files(folder_path)
3. 比较每对Excel文件的数据
定义一个函数来比较两个DataFrame,计算重复率。
python
复制代码
def calculate_similarity(df1, df2): # 确保两者都有相同的列 common_columns = df1.columns.intersection(df2.columns) if len(common_columns) == 0: return 0.0 # 选择共同的列进行比较 df1_common = df1[common_columns] df2_common = df2[common_columns] # 合并两个数据集,保留重复项 combined = pd.concat([df1_common, df2_common]) duplicates = combined.duplicated(keep=False) # 计算重复率 similarity = duplicates.sum() / len(combined) return similarity def compare_excel_files(dataframes): results = [] files = list(dataframes.keys()) for i in range(len(files)): for j in range(i + 1, len(files)): df1 = dataframes[files[i]] df2 = dataframes[files[j]] similarity = calculate_similarity(df1, df2) results.append((files[i], files[j], similarity)) return results similarity_results = compare_excel_files(dataframes)
4. 输出比较结果
将比较结果输出,显示每对Excel文件的相似度。
python
复制代码
for file1, file2, similarity in similarity_results: print(f"文件 {file1} 和文件 {file2} 的相似度为: {similarity:.2%}")
完整代码
python
复制代码
import os import pandas as pd def read_excel_files(folder_path): excel_files = [os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.endswith('.xlsx')] dataframes = {f: pd.read_excel(f) for f in excel_files} return dataframes def calculate_similarity(df1, df2): common_columns = df1.columns.intersection(df2.columns) if len(common_columns) == 0: return 0.0 df1_common = df1[common_columns] df2_common = df2[common_columns] combined = pd.concat([df1_common, df2_common]) duplicates = combined.duplicated(keep=False) similarity = duplicates.sum() / len(combined) return similarity def compare_excel_files(dataframes): results = [] files = list(dataframes.keys()) for i in range(len(files)): for j in range(i + 1, len(files)): df1 = dataframes[files[i]] df2 = dataframes[files[j]] similarity = calculate_similarity(df1, df2) results.append((files[i], files[j], similarity)) return results folder_path = 'your_folder_with_excel_files' dataframes = read_excel_files(folder_path) similarity_results = compare_excel_files(dataframes) for file1, file2, similarity in similarity_results: print(f"文件 {file1} 和文件 {file2} 的相似度为: {similarity:.2%}")
注意事项
- 列对齐:确保所有比较的数据具有相同的列。
- 数据清理:在实际使用中,可能需要对数据进行清理和预处理,以确保比较的准确性。
- 优化:对于大型数据集,计算重复率可能会很耗时。可以考虑优化算法或使用更高效的数据结构。
通过这些步骤,你可以实现读取多个Excel文件并两两判断是否有高度重复的数据,并计算和输出相似度。
审查
复杂规则
1. 方案
每次执行规则,查数据或者把全部数据缓存每次进行匹配,不太友好。
项目启动时,查询范围和资质表,然后处理成对象存到缓存:
1 | { |
后面执行规则的时候,只需要按照特性字段从缓存中取,就可以了。
这样只需要处理一遍范围、资质的数据。
2. 具体实现
使用本地缓存Caffeine、根据数据库创建实体类、Mapper、
创建一个 Caffeine 缓存配置类,并在 Spring Boot 启动时加载规则。
1 |
|
在 Spring Boot 启动时加载规则并缓存:
1 |
|
使用缓存:
1 | public ArchitectScope getQualificationFromCache(String qualificationName) { Map<String, ArchitectScope> qualificationCache = (Map<String, ArchitectScope>) cacheManager.getCache("qualificationCache").get("qualification").get(); return qualificationCache.get(qualificationName); } |
功能设计文档
页面及流程
第一页:采购方式及适用范围展示
功能描述:
- 提供一个下拉框(请选择采购方式),用户选择后展示相关文本。
- 用户选择下拉框后,触发接口查询数据,返回的数据以只读形式展示。
- 页面底部提供“下一页”按钮,参考工程造价页面,点击后进入第二页。
变量定义:
- 下拉框选项:
dropdown_options - 查询接口返回数据:
query_data
- 下拉框选项:
第二页:文件上传与数据提取
功能描述:
- 页面顶部提供一个上传按钮,支持上传文件夹或多选文件。
- 触发后端接口,上传文件并提取招标公告和项目信息,提取后的信息存入数据库表。
- 页面展示提取的项目信息,用户可修改,修改后的数据以文本格式存储。
- 页面底部提供“执行”按钮,点击后进入第三页。
变量定义:
- 上传文件的URL:
uploaded_file_urls - 提取的项目信息:
project_info - 提取的招标公告内容:
tender_notice - 修改后的项目信息:
modified_project_info
- 上传文件的URL:
第三页:异步执行
- 功能描述:
- 展示固定文本:”异步执行中,请稍后在历史记录中查看。”
数据表结构
项目信息表(project_info)
1 | CREATE TABLE project_info ( |
上传功能详细流程
用户操作:
- 用户选择文件或文件夹。
- 前端调用接口上传文件,返回文件URL列表
uploaded_file_urls。
后端处理:
- 提取文件中的项目信息和招标公告内容。
- 提取的项目信息字段包括:
project_nameagencybiddersection_codelocationestimated_costdurationproject_categoryqualification_fieldqualification_levelmanager_fieldmanager_levelperformance_reqmanager_perf_reqfinancial_reqdoc_acquire_timebid_opening_timeevaluation_method
- 如果提取到的项目名称存在于缓存中,则直接返回缓存数据;否则:
- 从文件中提取招标公告及招标文件的段落内容。
- 将提取结果存入缓存(超时时间30分钟)。
前端展示:
- 接收返回的
project_info并展示。 - 用户可修改项目信息,修改结果存入
modified_project_info。
- 接收返回的
执行功能详细流程
数据准备:
- 接收前端传递的
modified_project_info,存入数据库。 - 从缓存中获取:
- 建筑师职业范围和资质。
- 审查规则数据(若缓存不存在则查询数据库并存入缓存)。
- 招标公告和招标文件段落内容。
- 如果缓存缺失必要数据,向用户提示重新上传。
- 接收前端传递的
规则处理:
- 简单规则:统一循环处理,生成结果对象,包括:
- 规则编码:
rule_code - 取证单位名称:
evidence_unit - 存在问题:
issues - 评审建议:
review_suggestions - 页码:
page_numbers - 段落内容:
paragraphs
- 规则编码:
- 复杂规则:单独处理,生成结果对象。
- 简单规则:统一循环处理,生成结果对象,包括:
报告生成:
- 获取最新模板:调用
queryLatest方法。 - 根据规则处理结果,循环生成审计单,填充审计报告。
- 将生成的审计单和报告打包,生成下载链接,并插入记录表。
- 获取最新模板:调用
接口参考
- 文件上传:
net.lab1024.smartadmin.module.business.bidDocAudit.service.AudiReportTplHistoryService#upload - 获取最新模板:
net.lab1024.smartadmin.module.business.bidDocAudit.service.AudiReportTplHistoryService#queryLatest
APACHE-OPENNLP
安装
Mac安装
1 | brew install apache-opennlp |
安装后,执行 opennlp看是否有返回help信息
标准 & 训练
标注数据是指将文本中的特定部分(实体)标记为自定义标签。标注格式通常是 每行一个词,并且每个词都有一个与之相关的标签。
1.1 标注规则
- B-:表示实体的开始(Begin)。
- I-:表示实体的内部部分(Inside)。
- O:表示该词不属于任何命名实体(Outside)。
示例: 假设你有以下招标文件内容:
XX建筑工程,合同金额为200万元,要求具有二级建筑资质。
标注后的内容可能如下:
1 | XX建筑工程,合同金额为200万元,要求具有二级建筑资质。 |
在这个例子中:
1 | XX B-PROJECT_NAME |
自动标注
人工标注效率太低,标注数据需要大量案例,人工标注并不现实,推荐使用工具。
Label Studio
Label Studio 是一个开源的标注工具,支持文本标注、图片标注、音频标注等多种类型。它具有灵活的配置选项,可以根据需求配置标注任务,并且支持与机器学习模型结合来加速标注过程。
特点:
- 开源免费,适合小团队使用。
- 支持 命名实体识别(NER) 标注。
- 支持多种数据格式的导入和导出,包括 JSON 和 CSV。
- 能够与 模型 结合,进行 自动标注 和 人工修正。
- 对中文支持较好。
使用场景:
- 适合进行大规模的标注任务,尤其是需要标注结构化文本(如招标公告)的任务。
官网:Label Studio
优点:
- 完全免费且开源。
- 支持多种标注任务。
- 可配置和灵活的工作流。
缺点:
- 比 Prodi.gy 的界面稍显简单。
- 可能需要一些技术配置和部署。
使用
1 | MacBookPro :: work_space/HY_work_space/nlp % opennlp TokenNameFinderTrainer -lang zh -model zh-model-bid-project-info.bin -data ner.txt -encoding UTF-8 |
ner.txt是你刚才标注好的数据文件。zh-model-bid-project-info.bin是你训练好的模型文件的输出路径。zh是语言设置,虽然 OpenNLP 主要提供英语模型,但它也支持其他语言(包括中文)。
1 | import opennlp.tools.namefind.NameFinderME; |
LTP
1. 检查 LTP 模型文件是否正确
LTP 在加载模型时可能会遇到问题,特别是如果模型文件路径不正确或者模型文件损坏。LTP 默认会加载一些预训练的中文模型,如果没有正确加载,程序会卡住。
首先,确保你的 LTP 模型文件已正确安装和加载。通常,LTP 会自动下载并缓存这些模型,但如果出错,可能会导致程序挂起。
尝试手动下载 LTP 模型文件:
下载 LTP 模型:
- 你可以访问 LTP 官方 GitHub 或其他提供的下载链接,获取 LTP 模型。
- 下载模型后,将它们解压到本地文件夹。
设置模型路径:
- 你可以手动设置模型路径,确保 LTP 使用的是正确的模型文件。
python
复制代码
from ltp import LTP # 设置模型路径 ltp = LTP() # 可以尝试通过以下方式手动加载模型 ltp.load('path_to_your_model') # 替换为实际模型路径
2. 检查 LTP 的安装方式
LTP 有多个安装方式(如 pyltp 或 ltp),这可能会影响模型加载。你可以尝试使用 pyltp,这是 LTP 的原生 Python 接口,通常支持更好的稳定性。
尝试以下步骤:
bash
复制代码
pip install pyltp
然后使用 pyltp 进行模型加载和处理。
python
复制代码
from pyltp import Segmentor, NamedEntityRecognizer # 初始化分词器和命名实体识别器 segmentor = Segmentor() recognizer = NamedEntityRecognizer() # 加载模型路径 segmentor.load('path_to_your_model/cws.model') # 分词模型 recognizer.load('path_to_your_model/ner.model') # 命名实体识别模型 # 测试文本 text = "阜阳市城南新区华信路道路及附属工程施工招标公告(电子招标)" # 分词 words = segmentor.segment(text) print("Words:", '\t'.join(words)) # 命名实体识别 named_entities = recognizer.recognize(words, [0]*len(words)) # 这里的[0]*len(words)只是一个例子,实际可以传递真实的句法分析结果 print("Named Entities:", '\t'.join(named_entities))
3. 调试模型加载过程
为了更深入地理解问题,可以在加载模型时添加更多的调试信息,看看是否能够找出问题所在。
python
复制代码
from ltp import LTP print("Initializing LTP...") try: ltp = LTP() print("LTP initialized.") except Exception as e: print(f"Error initializing LTP: {e}")
4. 检查是否有资源耗尽
在一些低配置的机器或内存较小的环境中,LTP 初始化时可能会耗尽资源,导致卡住。可以查看你的系统资源(如 CPU 和内存)使用情况,检查是否有异常。
5. 模型文件路径权限问题
确保 LTP 模型文件有正确的读取权限。有时,路径问题或者权限问题会导致 LTP 卡住。
6. 检查 Python 环境和依赖
LTP 依赖于一些底层的 C++ 库,确保你的 Python 环境没有出现冲突。
你可以使用以下命令检查 Python 环境是否有问题:
bash
复制代码
pip list
查看是否有任何与 ltp 相关的冲突或版本问题。
7. 更新或降级版本
如果你使用的是较新的版本,尝试降级到一个稳定的版本,或尝试使用其他版本的 LTP 进行兼容性测试。
8. 使用其他轻量化中文NLP库
如果 LTP 继续出现问题,考虑使用其他轻量的 NLP 库,如:
- jieba:一个轻量级的中文分词库,适合分词和简单的文本处理。
- SpaCy + 预训练模型:SpaCy 也支持中文,并且可以通过加载模型进行命名实体识别。
总结:
- 确保 LTP 模型文件已正确下载并加载。
- 检查 LTP 安装是否正确,尝试使用
pyltp。 - 加入更多调试信息,查看错误。
- 确保系统资源足够,检查是否有资源耗尽的情况。
- 尝试其他轻量化 NLP 库,如
jieba,如果 LTP 无法解决问题。
TONGYI-LONG
新角度 返回全部规则的json key为规则编码,value为是/否
1 | curl --location 'https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions' \ |
1 | 设计: |