预测文本毒性与机刷恶意评论的识别-端到端 ML 项目的部署与模型训练第二部分
恶意评论检测
第二部分的内容
- 模板创建
- 项目设置
- 自定义日志
那么,让我们拿起键盘开始打字吧…
模板创建
NERD:为什么需要模板?
模板至关重要,因为它可以确保所有项目的一致性,并减少每次启动新项目时创建文件夹和文件所需的手动工作量。使用模板,您可以在所有端到端项目中保持适当的结构和一致性。
从现在开始,您只需要一个文件template.py
作为所有项目的模板。
模板.py
导入操作系统
从pathlib导入路径
导入日志记录logging.basicConfig
(level = logging.INFO,格式= '[%(asctime)s]:%(message)s:')
project_name = “Toxic_comment_detection”
list_of_files = [
“。github / workflows / .gitkeep”,
f “
src / { project_name} /__init__.py”,f“src / {project_name} /components/__init__.py”,f“src / {project_name } /utils/__init__.py”,f“src / { project_name } /utils/common.py”,f“src / {project_name} /config/__init__.py”,f“src / { project_name } /config/configuration.py”,f“src / { project_name} /pipeline/__init__.py”,f“src / {project_name} /entity/__init__.py”,f“src/{project_name } /entity/config_entity.py”,f“src/{project_name } /constants/__init__.py”,“config/config.yaml”,“params.yaml”,“schema.yaml”,“main.py”,“app.py”,“Dockerfile”,“requirements.txt”,“setup.py”,“research/trials.ipynb”,“templates/index.html”,] for filepath in list_of_files :filepath = Path (filepath ) filedir , filename = os.path.split( filepath )如果filedir != “ ” : os.makedirs (filedir , exist_ok = True ) logging.info (f “创建目录;{filedir}对于文件:{filename} " ) if ( not os.path.exists(filepath)) or (os.path.getsize(filepath) == 0 ): with open (filepath, "w" ) as f: pass logs.info( f" 创建空文件:{filepath} " ) else : logs.信息( f“ {filename}已经存在”)
template.py 详解(不需要可跳过)
从pathlib导入操作系统导入路径
导入日志记录日志记录
.basicConfig(level=logging.INFO,格式= '[%(asctime)s]: %(message)s:')
- 进口声明:
os
:该模块提供了一种使用依赖于操作系统的功能(如读取或写入文件系统)的方法。Path
来自pathlib
:该模块提供表示文件系统路径的类,其语义适用于不同的操作系统。logging
:此模块用于设置日志系统,允许您报告状态、错误和信息消息。
2.日志配置:
logging.basicConfig(...)
:这将设置日志配置,指定日志级别 (INFO
) 和日志消息格式。格式包括时间戳和消息。
project_name = “有毒评论检测”
3. 项目名称:
project_name
:该变量保存的是项目的名称,用于在各种文件路径中保持一致的项目结构。
list_of_files = [
".github/workflows/.gitkeep" ,
f"src/ {项目名称} /__init__.py" ,
f"src/ {项目名称} /components/__init__.py" ,
f"src/ {项目名称} /utils/__init__.py" ,
f"src/ {项目名称} /utils/common.py" ,
f"src/ {项目名称} /config/__init__.py" ,
f"src/ {项目名称} /config/configuration.py" ,
f"src/ {项目名称} /pipeline/__init__.py" ,
f"src/ {项目名称} /entity/__init__.py" ,
f"src/ {项目名称} /entity/config_entity.py" ,
f"src/ {项目名称} /constants/__init__.py" ,
“config/config.yaml”、
“params.yaml”、
“schema.yaml”、
“main.py”、
“app.py”、
“Dockerfile”、
“requirements.txt”、
“setup.py”、
“research/trials.ipynb”、
“templates/index.html”、
]
4.文件列表:
list_of_files
:此列表包含项目需要创建的所有文件和目录的相对路径。每个路径都指定为字符串,有的则使用变量project_name
以保持项目结构的一致性。
对于 list_of_files 中的 filepath:
filepath = Path (filepath)
filedir,filename = os.path.split (filepath) 如果 filedir != " " : os.makedirs ( filedir,exist_ok=True) logging.info ( f "为文件 {filename} 创建目录:{filedir}" )
5.文件和目录创建:
- 代码对
filepath
中的每一个进行迭代list_of_files
。 filepath = Path(filepath)
:将字符串路径转换为Path
对象,以便于操作。filedir, filename = os.path.split(filepath)
:将其拆分filepath
为目录(filedir
)和文件名(filename
)。if filedir != "":
:检查是否filedir
不是空字符串,这意味着该文件位于目录结构中。os.makedirs(filedir, exist_ok=True)
:如果目录不存在,则创建目录(以及任何中间目录)。exist_ok=True
如果目录已存在,则该参数可防止引发错误。logging.info(f"Creating directory: {filedir} for the file: {filename}")
:记录一条消息,表明目录正在创建。
如果 没有os.path.exists(filepath)或os.path.getsize(filepath) == 0 :
使用 open (filepath, "w" )作为f:
传递
logstash.info( f"创建空文件:{filepath} " )
else :
logstash.info( f" {filename}已存在" )
6.文件创建:
if not os.path.exists(filepath) or os.path.getsize(filepath) == 0:
:检查文件是否不存在或其大小是否为零(即,为空)。with open(filepath, "w") as f: pass
:如果上述条件为真,则创建一个空文件。该pass
语句用作占位符,因为我们只需要创建文件而不向其中写入任何内容。logging.info(f"Creating empty file: {filepath}")
:记录一条消息,表明正在创建一个空文件。else: logging.info(f"{filename} already exists")
:如果文件已经存在且不为空,则记录一条消息表明该文件已存在。
运行template.py之后
你的所有文件夹和文件都应该被创建
模板创建完成
项目设置
让我们通过填写 requrements.txt 的内容来设置项目
pandas
numpy
matplotlib
scikit-learn
imblearn
seaborn
tensorflow
wordcloud
types-PyYAML
Flask
Flask-Cors
dagshub
tqdm
python-box==6.0.2
mlflow==2.2.2
pyYAML
Ensure==1.0.2
notebook
-e .
NERD:这是什么?“-e”。
- **e。:**此行允许以可编辑模式安装您的包,这意味着您对包所做的任何更改都将立即反映在环境中,而无需重新安装。
接下来我们来创建setup.py
。
设置.py
导入setuptools
并使用 open ( "README.md","r",encoding= "utf-8" )作为f:
long_description = f.read()
__version__ = "0.0.0"
REPO_NAME = "Toxic-Comments-Detection"
AUTHOR_USER_NAME = "Harshithvarma007"
SRC_REPO = "END_TO_END_MODEL"
AUTHOR_EMAIL = "harshith007varma007@gmail.com"
setuptools.setup(
name=SRC_REPO,
version=__version__,
author=AUTHOR_USER_NAME,
author_email=AUTHOR_EMAIL,
description= "一个用于 ml 应用程序的小型 python 包",
long_description=long_description,
long_description_content= "text/markdown",
url= f"https://github.com/ {AUTHOR_USER_NAME} / {REPO_NAME} ",
project_urls={
“Bug Tracker” : f“https://github.com/ {AUTHOR_USER_NAME} / {REPO_NAME} /issues”,
},
package_dir={ “” : “src” },
packages=setuptools.find_packages(where= “src” )
)
setup.py
详细解释(如果已经知道请跳过):
- Importing
**setuptools**
:该库用于方便Python项目的打包。
2. 阅读**README.md**
:
使用 打开(“README.md”,“r”,编码= “utf-8”)作为f:
long_description = f.read()
README.md
这将读取您的包裹的详细描述内容
3.定义包元数据:
__version__ = “0.0.0”
REPO_NAME = “有毒评论检测”
AUTHOR_USER_NAME = “Harshithvarma007”
SRC_REPO = “END_TO_END_MODEL”
AUTHOR_EMAIL = “harshith007varma007@gmail.com”
4. 呼叫**setuptools.setup**
:
setuptools.setup(
name = SRC_REPO,
version = __version__,
author = AUTHOR_USER_NAME,
author_email = AUTHOR_EMAIL,
description = “用于 ml 应用程序的小型 python 包”,
long_description = long_description,
long_description_content = “text / markdown”,
url = f“https://github.com/ {AUTHOR_USER_NAME} / {REPO_NAME} ”,
project_urls = {
“Bug Tracker”:f“https://github.com/ {AUTHOR_USER_NAME} / {REPO_NAME} /issues”,
},
package_dir = { “”:“src” },
packages = setuptools.find_packages(where = “src”)
)
- name:包的名称。
- version:包的版本。
- author:作者的用户名。
- author_email:作者的电子邮件。
- description:包的简短描述。
- long_description:包的详细描述(内容来自
README.md
)。 - long_description_content:详细描述的格式。
- url:项目存储库的 URL。
- project_urls:与项目相关的附加 URL(例如,bug 跟踪器)。
- package_dir:包的根目录。
- packages:自动查找指定目录中的所有包。
该setup.py
文件是打包 Python 项目的关键部分。它提供有关项目的元数据以及如何安装和分发项目的说明
现在运行
pip 安装-r 要求.txt
自定义日志创建
现在项目设置已完成,让我们继续创建自定义日志。
- 导航到文件夹:
- 去
src\Toxic_comment_detection\__init__.py
。
2. 创建日志设置:
导入操作系统
导入系统 导入日志
记录
logs_str = “[%(asctime)s: %(levelname)s: %(module)s: %(message)s]”
log_dir = “logs” log_filepath
= os.path.join (log_dir,“running_logs.log” ) os.makedirs (log_dir,exist_ok=True) logs.basicConfig( level=logging.INFO,format = logs_str, handlers=[ logging.FileHandler(log_filepath), logging.StreamHandler(sys.stdout ) ] ) logger = logs.getLogger( “Toxic_logger” )
用法
现在您可以将所有详细信息记录到其中running_logs.log
,这对于调试或记录整个项目流程很有用。
设置实用程序
现在自定义日志记录已经完成,让我们继续创建设置实用程序。
- 导航到文件夹:
- 去
src\Toxic_comment_detection\utils\common.py
。
2.创建实用程序设置:
从box.exceptions导入 os导入 BoxValueError
导入 yaml
从Toxic_comment_detection 导入 logger
导入 json
导入 joblib
从Ensure 导入 Ensure_annotations
从box 导入 ConfigBox
从pathlib 导入 Path
从typing 导入Any
@ensure _annotations
def read_yaml(path_to_yaml: Path) - > ConfigBox:
"""读取 yaml 文件并返回
Args:
path_to_yaml (str): 类似输入的路径
引发:
ValueError: 如果 yaml 文件为空
e: 空文件
返回:
ConfigBox: ConfigBox 类型
"""
尝试:
使用 open (path_to_yaml)作为yaml_file:
content = yaml.safe_load(yaml_file)
logger.info(f"yaml 文件:{path_to_yaml} 已成功加载")
返回ConfigBox(content)
除外BoxValueError:
引发 ValueError("yaml 文件为空")
除外Exception as e:
引发 e
@ensure _annotations
def create_directories(path_to_directories: list, verbose = True ):
"""创建目录列表
Args:
path_to_directories (list): 目录路径列表
ignore_log (bool, 可选): 是否要创建多个目录,忽略。默认为 False。
"""
for path in path_to_directories:
os.makedirs(path, exist_ok = True )
if verbose:
logger.info(f"创建目录于:{path}")
@ensure _annotations
def save_json(path: Path, data: dict):
"""保存 json 数据
Args:
path (Path): json 文件的路径
data (dict): 要保存在 json 文件中的数据
"""
with open (path, "w") as f:
json.dump(data, f, indent = 4 )
logger.info(f"json 文件保存于:{path}")
@ensure _annotations
def load_json(path: Path) - > ConfigBox:
"""加载 json 文件数据
Args:
path (Path):json 文件的路径
返回:
ConfigBox:数据作为类属性而不是字典
“”
以 打开(路径)为f:
content = json.load(f)
logger.info(f“json文件成功加载自:{path}”)
返回ConfigBox(content)
@ensure _annotations
def save_bin(data:Any,path:Path):
“”“保存二进制文件
Args:
数据(Any):要保存为二进制
路径的数据(Path):二进制文件的路径
“”“
joblib.dump(value = data,filename = path)
logger.info(f“二进制文件保存在:{path}”)
@ensure _annotations
def load_bin(path:Path)- > Any:
“”“加载二进制数据
Args:
路径(Path):二进制文件的路径
返回:
Any:存储在文件中的对象
“”“
data = joblib.load(path)
logger.info(f“二进制文件加载自:{path}”)
返回数据
@ensure _annotations
def get_size(path:Path)- > str:
"""获取以 KB 为单位的大小
参数:
path (Path):文件路径
返回:
str:以 KB 为单位的大小
"""
size_in_kb = round(os.path.getsize(path) / 1024 )
return f"~ {size_in_kb} KB"
功能:
**read_yaml**
:读取 YAML 文件并返回其包装在ConfigBox
对象中的内容。**create_directories**
:创建路径列表中指定的目录,并带有记录创建过程的选项。**save_json**
:将 Python 数据结构以 JSON 形式保存到指定的文件路径。**load_json**
:将指定文件路径的JSON数据加载到对象中ConfigBox
。**save_bin**
:使用 将二进制数据保存到指定的文件路径joblib
。**load_bin**
:使用 从指定文件路径加载二进制数据joblib
。**get_size**
:计算并返回文件的大小(以千字节(KB)为单位)。
这些实用函数提供了通用功能,可用于各种端到端机器学习项目。它们处理文件处理(JSON、二进制)、目录创建、YAML 文件读取和文件大小检索等操作,确保高效、有序的项目管理。
向前进
呼……该项目最具挑战性和关键性的部分现已完成。让我们深入探讨下一部分的激动人心的阶段,它将涵盖机器学习的几个关键方面:
- 数据采集
- 数据验证
- 数据转换
- 模型训练
create_directories`:创建路径列表中指定的目录,并带有记录创建过程的选项。 **save_json**
:将 Python 数据结构以 JSON 形式保存到指定的文件路径。**load_json**
:将指定文件路径的JSON数据加载到对象中ConfigBox
。**save_bin**
:使用 将二进制数据保存到指定的文件路径joblib
。**load_bin**
:使用 从指定文件路径加载二进制数据joblib
。**get_size**
:计算并返回文件的大小(以千字节(KB)为单位)。
这些实用函数提供了通用功能,可用于各种端到端机器学习项目。它们处理文件处理(JSON、二进制)、目录创建、YAML 文件读取和文件大小检索等操作,确保高效、有序的项目管理。
向前进
呼……该项目最具挑战性和关键性的部分现已完成。让我们深入探讨下一部分的激动人心的阶段,它将涵盖机器学习的几个关键方面:
- 数据采集
- 数据验证
- 数据转换
- 模型训练
- 模型评估
博客原文:专业人工智能社区