file-type

SpaCy中文模型发布与维护:支持中文的自然语言处理

ZIP文件

下载需积分: 35 | 105KB | 更新于2025-09-01 | 184 浏览量 | 21 下载量 举报 1 收藏
download 立即下载
### 知识点一:SpaCy中文模型简介 SpaCy是一款流行的自然语言处理(NLP)库,以其性能优异著称。如今,随着中文处理需求的增长,SpaCy官方也推出了支持中文的模型。这项工作由中国社区的一位成员推动,并已经完成了其开发任务,目前的模型处于beta测试阶段,这意味着模型正在接受公开测试,可能还存在一些未解决的问题,但基本上已经可以使用。 ### 知识点二:模型的特性 1. **命名实体识别(NER)** - NER是自然语言处理中的一个重要功能,它涉及到识别文本中具有特定意义的实体,如人名、地名、组织机构名等。SpaCy中文模型的最新版本新增了对中文命名实体识别的支持,能识别出句子中的相关信息。 2. **使用示例** - 给出的示例句子“王小明在北京的清华大学读书”用来展示SpaCy中文模型如何处理中文文本,并提取其中的属性信息,如词性标注和实体识别等。 ### 知识点三:开始使用SpaCy中文模型 1. **基础知识** - 使用SpaCy中文模型之前,需要掌握SpaCy的入门知识,尤其是版本2以上的使用方法。 2. **系统要求** - 首先,运行SpaCy中文模型需要使用Python 3。虽然可能支持Python 2,但由于Python 2已经停止维护,社区建议尽可能使用Python 3。另外,开发者应当注意文档和社区中关于不同Python版本的兼容性信息。 3. **安装步骤** - **下载模型** - 用户可以从官方页面或为中文地区提供的加速链接下载模型,文件格式为`.tar.gz`,文件名通常包含版本号,如`zh_core_web_sm-2.x.x.tar.gz`。 - **安装模型** - 通过pip安装下载好的模型文件,命令格式为:`pip install 文件路径`。 - **建立链接** - 如果需要在其他NLP框架中使用SpaCy模型,比如Rasa NLU,需要为模型建立一个链接,以便在框架中方便调用。可以通过命令`spacy link zh_core_web_sm zh`来创建链接。其中`zh_core_web_sm`是模型的名称,`zh`是链接的名称。 ### 知识点四:在线演示和文档资源 SpaCy中文模型的文档和使用示例提供了在线演示,这通常会基于Jupyter notebook,用户可以直接在网页上运行代码块来观察模型的实际表现。 ### 知识点五:技术标签解析 - **nlp**: 自然语言处理(Natural Language Processing),是计算机科学、人工智能和语言学领域中涉及人机交互的子领域。 - **chinese-nlp**: 专门关注中文文本的自然语言处理。 - **nlp-dependency-parsing**: 依赖句法分析,是自然语言处理的一个分支,用于分析句子中词语之间的依存关系。 - **nlp-machine-learning**: 涉及到使用机器学习算法对自然语言进行处理和分析。 - **spacy-models**: 指的是由SpaCy框架支持的各种语言的模型。 - **NaturallanguageprocessingJupyterNotebook**: 在Jupyter Notebook环境下进行自然语言处理相关的实验和演示。 ### 知识点六:项目维护和更新 项目自上线以来,已经完成了推动SpaCy中文模型开发的任务,目前进入了维护状态。这意味着项目的重点将从开发新的功能转移到修复已发现的bug上。这也表明社区将继续确保模型的稳定性和可靠性,同时也感谢用户对项目长期的关注和支持。 通过以上详细的知识点解析,我们可以看到SpaCy中文模型不仅增强了对中文处理的能力,还提供了实用的工具和资源供开发者和研究人员使用。随着中文NLP技术的不断进步,SpaCy中文模型预计将会成为该领域的重要资源。

相关推荐

filetype

很好,现在可以开始训练了,但是还需要你帮我修改一下训练的程序,由于训练集中cleaned_website_text以及进行了分词和停用词处理,因此训练脚本不需要这些代码,请去掉这些代码: # -*- coding: utf-8 -*- """ 中文网站分类模型训练程序 功能:处理中文网站文本数据,训练并保存可用于预测的模型和TF-IDF向量器 """ import pandas as pd import numpy as np import os import jieba import spacy from spacy.language import Language from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.svm import LinearSVC from sklearn.calibration import CalibratedClassifierCV from sklearn.model_selection import train_test_split, cross_val_score from sklearn.metrics import ( accuracy_score, classification_report, confusion_matrix, ConfusionMatrixDisplay ) import joblib import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['WenQuanYi Zen Hei'] # 解决中文显示乱码 # -------------------------- 1. 初始化中文文本处理工具(Jieba+SpaCy) -------------------------- def init_text_processor(): """ 初始化中文文本处理器: - SpaCy加载英文模型(用于停用词、词性过滤基础功能) - 添加Jieba中文分词管道(替换SpaCy原生分词,适配中文) - 扩展中文停用词库(补充SpaCy未覆盖的中文停用词) """ # 1. 加载SpaCy基础模型(保留英文处理能力,同时用于中文停用词过滤) nlp = spacy.load("en_core_web_sm") # 2. 定义Jieba中文分词管道(作为SpaCy自定义组件) @Language.component("jieba_tokenizer") def jieba_tokenizer(doc): text = doc.text # 判定是否为中文文本(含中文字符则用Jieba分词) has_chinese = any('\u4e00' <= char <= '\u9fff' for char in text) if has_chinese: # Jieba精确分词(可添加自定义词典:jieba.load_userdict("user_dict.txt")) words = jieba.lcut(text, cut_all=False) spaces = [False] * len(words) # 中文无空格,全部标记为False return spacy.tokens.Doc(doc.vocab, words=words, spaces=spaces) else: # 英文文本保留SpaCy原生分词 return doc # 3. 添加Jieba分词管道到SpaCy(优先级最高,在解析器前执行) nlp.add_pipe("jieba_tokenizer", before="parser") # 4. 扩展中文停用词库(补充常见中文停用词,可根据需求增删) chinese_stop_words = [ "的", "了", "是", "我", "在", "有", "和", "就", "不", "人", "都", "一", "他", "她", "它", "这", "那", "要", "我们", "你们", "他们", "来", "去", "上", "下", "里", "外", "大", "小", "多", "少", "好", "坏", "高", "低", "前", "后", "左", "右", "中", "间", "而", "或", "与", "及", "等", "着", "过", "会", "能", "可", "将", "把", "被", "让", "从", "到", "以", "按", "据", "为", "因", "由", "所", "当", "时", "地", "得", "之", "也", "又", "还", "再", "更", "最", "很", "太", "非常", "比较", "一般", "可以", "应该" ] for word in chinese_stop_words: lex = nlp.vocab[word] lex.is_stop = True # 标记为停用词 return nlp # -------------------------- 2. 中文文本清洗函数 -------------------------- def clean_chinese_text(text, nlp): """ 清洗中文(含英文)文本: - 过滤停用词、标点、数字、特殊符号 - 英文词形还原,中文保留原词(SpaCy对中文词形支持较弱) - 统一小写(中文可省略,此处为兼容英文) """ if pd.isna(text) or text.strip() == "": return "" # 用初始化好的SpaCy处理器处理文本 doc = nlp(text.strip()) cleaned_tokens = [] exclusion_list = ["nan", "null", "none"] # 额外排除的无效值 for token in doc: # 过滤规则:保留有效中英文词,排除干扰项 if ( token.is_stop # 过滤停用词(含扩展的中文停用词) or token.is_punct # 过滤标点 or token.text.isnumeric() # 过滤纯数字 # 过滤非字母、非数字、非中文的特殊符号 or (not token.text.isalnum() and not ('\u4e00' <= token.text <= '\u9fff')) or token.text.lower() in exclusion_list ): continue # 词形处理:中文直接用原词,英文用lemma_(词形还原) if '\u4e00' <= token.text <= '\u9fff': token_clean = token.text.lower().strip() # 中文统一小写(可选) else: token_clean = token.lemma_.lower().strip() # 英文词形还原 # 过滤长度过短的词(如单字母英文词,中文单字可保留) if len(token_clean) < 2 and not ('\u4e00' <= token_clean <= '\u9fff'): continue cleaned_tokens.append(token_clean) # 返回空格分隔的清洗后文本(适配TF-IDF输入格式) return " ".join(cleaned_tokens) # -------------------------- 3. 数据集加载与预处理 -------------------------- def load_and_preprocess_data(data_path, nlp): """ 加载中文网站数据集并预处理: 1. 读取CSV文件(需确保数据格式正确) 2. 清洗文本字段(生成cleaned_website_text) 3. 标签编码(Category → category_id) """ # 1. 读取数据集(强制UTF-8编码,避免中文乱码) if not os.path.exists(data_path): raise FileNotFoundError(f"数据集文件不存在:{data_path}") df = pd.read_csv( data_path, low_memory=False, encoding='utf-8', on_bad_lines='skip' # 跳过格式错误的行 ) # 2. 检查必要字段是否存在(需确保数据集包含"website_text"和"Category"列) required_cols = ["website_text", "Category"] missing_cols = [col for col in required_cols if col not in df.columns] if missing_cols: raise ValueError(f"数据集缺少必要字段:{', '.join(missing_cols)}") # 3. 清洗文本(批量处理,添加进度提示) print(f"开始清洗文本数据(共{len(df)}条记录)...") df["cleaned_website_text"] = df["website_text"].apply( lambda x: clean_chinese_text(x, nlp) ) # 4. 过滤空文本记录(清洗后无有效内容的行) df_clean = df[df["cleaned_website_text"].str.strip() != ""].copy() print(f"清洗后保留有效记录数:{len(df_clean)}(删除空文本记录:{len(df) - len(df_clean)}条)") # 5. 标签编码(将Category转换为数字ID,用于模型训练) df_clean["category_id"] = df_clean["Category"].factorize()[0] category_mapping = dict(zip(df_clean["category_id"], df_clean["Category"].unique())) print(f"\n类别映射关系:") for idx, cat in sorted(category_mapping.items()): print(f" 类别ID {idx}: {cat}") return df_clean, category_mapping # -------------------------- 4. TF-IDF特征提取(适配中文) -------------------------- def build_tfidf_vectorizer(text_data): """ 构建适配中文的TF-IDF向量器: - 支持1-2元语法(中文1元=单字,2元=词组,如"人工智能") - 过滤低频词(min_df=3,避免稀疏特征) - 保留英文停用词过滤,中文停用词已在文本清洗时处理 """ tfidf = TfidfVectorizer( sublinear_tf=True, # 对TF进行对数缩放,减轻高频词权重 min_df=3, # 最少出现3次的词才保留 ngram_range=(1, 2), # 1元(单字/单词)+ 2元(词组) stop_words="english", # 过滤英文停用词(中文停用词已在清洗时处理) token_pattern=r"(?u)\b\w+\b", # 放宽token匹配,支持中文单字/词 max_features=10000 # 最多保留10000个特征,避免维度爆炸 ) # 拟合文本数据,生成TF-IDF矩阵 tfidf_matrix = tfidf.fit_transform(text_data) print(f"\nTF-IDF特征提取完成:") print(f" 特征数量(词汇表大小):{len(tfidf.get_feature_names_out())}") print(f" TF-IDF矩阵形状:{tfidf_matrix.shape}(样本数 × 特征数)") return tfidf, tfidf_matrix # -------------------------- 5. 模型训练与评估 -------------------------- def train_and_evaluate_model(X, y, category_mapping): """ 训练带概率校准的LinearSVC模型: 1. 划分训练集/测试集(8:2) 2. 训练LinearSVC(适合文本分类,效率高) 3. 概率校准(CalibratedClassifierCV,支持预测概率) 4. 模型评估(准确率、分类报告、混淆矩阵) """ # 1. 划分训练集和测试集(固定随机种子,确保结果可复现) X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42, stratify=y # stratify确保类别分布一致 ) print(f"\n数据集划分:") print(f" 训练集:{X_train.shape[0]}条样本") print(f" 测试集:{X_test.shape[0]}条样本") # 2. 初始化LinearSVC模型(中文文本分类常用模型,效果好且高效) base_model = LinearSVC( C=1.0, # 正则化强度,默认1.0(可通过网格搜索优化) max_iter=1000, class_weight="balanced", # 平衡类别权重(解决数据不平衡问题) random_state=42 ) # 3. 概率校准(LinearSVC本身不支持概率输出,需用CalibratedClassifierCV包装) model = CalibratedClassifierCV( estimator=base_model, method="sigmoid", # 适合二分类/多分类的概率校准方法 cv=5 # 5折交叉验证校准 ) # 4. 训练模型 print(f"\n开始训练模型...") model.fit(X_train, y_train) # 5. 模型评估 # 5.1 测试集准确率 y_pred = model.predict(X_test) test_accuracy = accuracy_score(y_test, y_pred) print(f"\n模型评估结果:") print(f" 测试集准确率:{test_accuracy:.4f}") # 5.2 交叉验证准确率(验证模型稳定性) cv_scores = cross_val_score(model, X, y, cv=5, scoring="accuracy") print(f" 5折交叉验证平均准确率:{cv_scores.mean():.4f}(标准差:{cv_scores.std():.4f})") # 5.3 分类报告(精确率、召回率、F1值) print(f"\n分类报告:") target_names = [category_mapping[idx] for idx in sorted(category_mapping.keys())] print(classification_report( y_test, y_pred, target_names=target_names, zero_division=0 )) # 5.4 混淆矩阵(可视化类别预测分布) cm = confusion_matrix(y_test, y_pred) disp = ConfusionMatrixDisplay( confusion_matrix=cm, display_labels=target_names ) disp.plot(cmap=plt.cm.Blues, xticks_rotation=45) plt.title("模型混淆矩阵(测试集)") plt.tight_layout() plt.savefig("confusion_matrix.png", dpi=300, bbox_inches='tight') print(f"\n混淆矩阵已保存为:confusion_matrix.png") return model # -------------------------- 6. 模型与向量器保存 -------------------------- def save_model_and_vectorizer(model, tfidf, save_dir="trained_models"): """ 保存训练好的模型和TF-IDF向量器: - 模型:linear_svc_model.joblib(可直接替换原Flask应用中的模型) - TF-IDF向量器:tfidf_vectorizer.joblib(需在Flask应用中加载) """ # 创建保存目录(若不存在) os.makedirs(save_dir, exist_ok=True) # 保存模型 model_path = os.path.join(save_dir, "linear_svc_model_cn.joblib") joblib.dump(model, model_path) # 保存TF-IDF向量器 tfidf_path = os.path.join(save_dir, "tfidf_vectorizer.joblib") joblib.dump(tfidf, tfidf_path) print(f"\n模型与向量器保存完成:") print(f" 模型路径:{model_path}") print(f" TF-IDF向量器路径:{tfidf_path}") # -------------------------- 7. 主训练流程 -------------------------- def main(): # 配置参数(需根据你的实际情况修改) DATA_PATH = "chinese_website_data.csv" # 你的中文网站数据集路径 SAVE_DIR = "trained_models" # 模型保存目录 try: # 步骤1:初始化文本处理器 print("=" * 50) print("步骤1:初始化中文文本处理器(Jieba+SpaCy)...") nlp = init_text_processor() # 步骤2:加载并预处理数据集 print("\n" + "=" * 50) print("步骤2:加载并预处理中文网站数据集...") df_clean, category_mapping = load_and_preprocess_data(DATA_PATH, nlp) # 步骤3:构建TF-IDF特征 print("\n" + "=" * 50) print("步骤3:构建TF-IDF特征向量...") tfidf, tfidf_matrix = build_tfidf_vectorizer(df_clean["cleaned_website_text"]) # 步骤4:训练并评估模型 print("\n" + "=" * 50) print("步骤4:训练带概率校准的LinearSVC模型...") model = train_and_evaluate_model( X=tfidf_matrix, y=df_clean["category_id"], category_mapping=category_mapping ) # 步骤5:保存模型与向量器 print("\n" + "=" * 50) print("步骤5:保存训练结果...") save_model_and_vectorizer(model, tfidf, SAVE_DIR) print("\n" + "=" * 50) print("所有训练流程完成!") print(f"提示:请将 {SAVE_DIR} 中的模型和向量器文件复制到Flask应用目录,替换原有文件。") except Exception as e: print(f"\n训练过程出错:{str(e)}") raise if __name__ == "__main__": # 简化版:直接启动训练流程,仅保留关键异常捕获 print("=" * 60) print(" 中文网站分类模型训练程序(简化版) ") print("=" * 60) try: # 调用核心训练函数,启动全流程(数据加载→预处理→训练→保存) main() # 捕获手动终止信号(如Ctrl+C) except KeyboardInterrupt: print("\n⚠️ 训练被手动终止(Ctrl+C)") # 捕获关键错误(如数据集不存在、模型训练失败等) except Exception as e: print(f"\n❌ 训练出错:{str(e)}") print("💡 建议检查:1. 数据集路径是否正确 2. 数据格式是否包含'website_text'和'Category'列")

天驱蚊香
  • 粉丝: 48
上传资源 快速赚钱