春联生成模型-中文-base数据预处理实战:Python爬虫采集对联语料

📅 发布时间:2026/7/10 4:40:57 👁️ 浏览次数:
春联生成模型-中文-base数据预处理实战:Python爬虫采集对联语料
春联生成模型-中文-base数据预处理实战Python爬虫采集对联语料想自己动手训练一个能写春联的AI模型吗模型本身可能已经有了但喂给它的“粮食”——也就是高质量的对联数据往往才是决定它最终“文采”的关键。今天我们就来聊聊这个最基础也最重要的一步如何用Python爬虫从网上“抓”来那些文采斐然的对联把它们变成模型能“消化”的规整数据。很多朋友拿到一个预训练模型第一反应就是直接开调。但如果你想让模型写出更有“年味”、更符合特定风格比如七言绝句、商业对联的句子自己准备一批高质量的、有针对性的语料效果往往会好得多。这个过程听起来有点技术含量但其实用Python爬虫来实现思路非常清晰一步步跟着做你也能轻松搞定。咱们这篇教程就是手把手带你走一遍这个流程。从怎么找到合适的对联网站到怎么写代码把对联“摘”下来再到怎么把杂乱的数据清洗干净、存成规范的格式。即使你之前没怎么写过爬虫看完也能有个清晰的思路自己动手准备专属的春联语料库。1. 动手之前想清楚目标和准备工具在开始写代码之前花几分钟想清楚两件事能让你后面少走很多弯路。第一你的目标是什么你是要收集成千上万副通用对联做一个大而全的语料库还是只想针对某一类比如“龙年大吉”相关的、或者商铺开业用的收集几百副精品目标不同选择的源网站和爬取策略就会很不一样。对于春联生成这种任务我建议初期可以先追求“精”而不是“量”。收集几千副高质量、对仗工整的对联远比收集几万副包含大量重复、低质内容的数据要有用。第二你需要哪些工具咱们这个任务不复杂主要用到以下几个Python库用pip命令就能轻松安装requests: 这是用来向网站发送请求、获取网页内容的可以说是爬虫的“手”。BeautifulSoup4 (bs4): 拿到网页的HTML代码后它就像一把“手术刀”能帮我们精准地找到并提取出里面我们需要的文字也就是对联。pandas: 数据处理的好帮手。我们把爬下来的对联清洗好后可以用它来整理、查看并方便地保存成文件比如CSV或Excel。你可以打开命令行一次性安装它们pip install requests beautifulsoup4 pandas另外请务必遵守网络礼仪和法律法规。只从那些明确允许爬取或提供了公开API的网站获取数据比如一些专注于传统文化的公益网站、诗词数据库。在爬取前最好看看网站的robots.txt文件通常在网站根目录如https://example.com/robots.txt并控制请求频率别给人家服务器造成太大压力。咱们这是学习和技术实践一定要合规合法。2. 第一步找到并分析目标网页结构爬虫就像去一个结构复杂的图书馆找书你得先知道你要的书放在哪个区域、哪个书架。同样我们得先看看对联在网页里“藏”在什么地方。假设我们找到了一个叫“古诗文网”下的对联子站这里仅为举例实际操作请寻找合适的公开资源。我们首先用浏览器打开一个具体的对联列表页或详情页然后按下F12打开开发者工具。关键操作是使用“检查”功能。把鼠标移到网页上一篇对联的标题或内容上右键点击选择“检查”。这时候开发者工具会高亮显示对应的HTML代码。你需要观察这对联内容是被什么HTML标签包裹着的比如它可能在一个div classcouplet-content里面或者每个上联、下联分别放在span标签里。举个例子你可能会看到类似这样的结构div classcouplet-item h3a href#春回大地风光好/a/h3 p classupper-line福满人间喜事多/p p classlower-line横批万象更新/p /div那么这对联的“上联”就在class为upper-line的p标签里“下联”在class为lower-line的标签里。记下这些特征标签名、class名称、id等这就是我们等下写代码时用来定位的“坐标”。同时注意观察翻页的规律。列表页的网址URL可能像https://example.com/couplets/page/1下一页就是把最后的数字改成2。找到这个规律我们才能让爬虫自动遍历所有页面。3. 第二步编写爬虫核心代码工具和目标都清楚了现在开始写代码。我们会把任务拆解成几个函数这样逻辑清晰也方便调试。3.1 获取网页内容首先写一个函数负责去“敲门”并拿到网页的HTML文档。import requests from bs4 import BeautifulSoup def fetch_page(url): 发送请求获取网页内容 # 设置一个友好的浏览器头模拟真人访问避免被一些网站直接拒绝 headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 } try: # 发送GET请求 response requests.get(url, headersheaders, timeout10) # 设置10秒超时 # 检查请求是否成功状态码200表示成功 response.raise_for_status() # 通常网页编码是utf-8但有些网站是gbk这里做个通用处理 response.encoding response.apparent_encoding return response.text except requests.RequestException as e: print(f请求出错 {url}: {e}) return None这个函数是基础它成功返回网页的HTML代码字符串我们才能进行下一步。3.2 解析并提取对联数据拿到HTML后用BeautifulSoup来解析它并根据我们之前观察到的“坐标”来提取数据。def parse_couplets_from_html(html_content): 从HTML内容中解析出对联数据 if not html_content: return [] soup BeautifulSoup(html_content, html.parser) couplet_list [] # 这里的选择器需要根据你实际分析的网站结构来修改 # 假设每个对联都包裹在 classcouplet-item 的div里 items soup.find_all(div, class_couplet-item) for item in items: try: # 提取上联假设在 classupper-line 的p标签里 upper_elem item.find(p, class_upper-line) # 提取下联假设在 classlower-line 的p标签里 lower_elem item.find(p, class_lower-line) # 提取横批可能在一个单独的span里 horizontal_elem item.find(span, class_horizontal) # 确保上联和下联都存在才认为是一条有效数据 if upper_elem and lower_elem: couplet { 上联: upper_elem.get_text(stripTrue), # get_text()获取标签内文本stripTrue去掉首尾空格 下联: lower_elem.get_text(stripTrue), 横批: horizontal_elem.get_text(stripTrue) if horizontal_elem else } couplet_list.append(couplet) except AttributeError as e: # 如果某个标签找不到跳过这条记录 print(f解析单个对联时出错: {e}) continue print(f本页解析到 {len(couplet_list)} 条对联数据。) return couplet_list这里是最关键的一步find_all和find里用的选择器如div, class_couplet-item必须和你实际分析的网站结构完全匹配。如果网站结构变了这里也需要相应调整。3.3 组织主流程翻页与数据收集单个页面搞定了现在让爬虫自动跑遍所有列表页。def main_crawl(base_url, start_page1, end_page5): 主爬取函数处理翻页 base_url: 列表页的基础URL例如 https://example.com/couplets/page/{} all_couplets [] for page_num in range(start_page, end_page 1): print(f正在爬取第 {page_num} 页...) # 构造每一页的完整URL url base_url.format(page_num) html fetch_page(url) if html: page_couplets parse_couplets_from_html(html) all_couplets.extend(page_couplets) else: print(f第 {page_num} 页获取失败跳过。) # 出于礼貌每请求一个页面后暂停一小会儿避免请求过于频繁 import time time.sleep(1) # 暂停1秒 print(f爬取结束共收集到 {len(all_couplets)} 条对联数据。) return all_couplets # 使用示例 if __name__ __main__: # 假设你的目标网站列表页格式是这样的 example_base_url https://www.example-couplet-site.com/list?page{} data main_crawl(example_base_url, start_page1, end_page3) # 先爬3页试试水把example_base_url换成你找到的真实网站地址并确认其翻页规律。先爬取2-3页测试一下确保一切正常后再扩大范围。4. 第三步清洗与保存数据爬下来的数据通常比较“毛糙”直接喂给模型可能不合适我们需要清洗一下。4.1 数据清洗常见的清洗工作包括去除空白字符我们已经用stripTrue做了。处理特殊字符和空格删除全角空格、不必要的标点等。去重完全一样的对联只保留一条。过滤无效数据比如内容太短可能不是完整对联、包含乱码的数据。我们用pandas来做这些事会非常方便import pandas as pd def clean_couplet_data(couplet_list): 清洗对联数据列表 # 先转换成pandas的DataFrame方便处理 df pd.DataFrame(couplet_list) if df.empty: print(没有数据需要清洗。) return df # 1. 去除所有列中字符串首尾的空白虽然解析时做过但再保险一次 df df.applymap(lambda x: x.strip() if isinstance(x, str) else x) # 2. 删除上联或下联为空的记录 df df.dropna(subset[上联, 下联]) df df[(df[上联] ! ) (df[下联] ! )] # 3. 基于“上联下联”的内容进行去重 df df.drop_duplicates(subset[上联, 下联], keepfirst) # 4. 简单的内容过滤比如上联和下联长度都大于等于2个字符一个汉字算一个字符 df df[df[上联].str.len() 2] df df[df[下联].str.len() 2] print(f清洗后剩余 {len(df)} 条有效数据。) return df4.2 数据保存清洗干净的数据可以保存成多种格式供后续使用。def save_data(df, filename_prefixcouplet_data): 将DataFrame保存为多种格式 if df.empty: print(数据为空不保存。) return # 保存为CSV最通用用Excel也能打开 csv_file f{filename_prefix}.csv df.to_csv(csv_file, indexFalse, encodingutf-8-sig) # utf-8-sig确保Excel打开不乱码 print(f数据已保存为CSV文件: {csv_file}) # 保存为JSON结构清晰很多编程语言都方便读取 json_file f{filename_prefix}.json df.to_json(json_file, orientrecords, force_asciiFalse, indent2) # force_asciiFalse确保中文正常显示 print(f数据已保存为JSON文件: {json_file}) # 也可以保存为纯文本一行一副对联用特定分隔符如“”连接上联和下联 txt_file f{filename_prefix}.txt with open(txt_file, w, encodingutf-8) as f: for _, row in df.iterrows(): # 格式上联下联横批 line f{row[上联]},{row[下联]},{row.get(横批, )}\n f.write(line) print(f数据已保存为TXT文件: {txt_file})4.3 整合完整的流程最后我们把所有步骤串起来形成一个完整的脚本。# 整合所有步骤 if __name__ __main__: print(开始春联语料爬取与处理流程...) # 1. 爬取原始数据 base_url https://www.your-real-couplet-site.com/page/{} # 请替换为真实URL raw_data main_crawl(base_url, start_page1, end_page5) # 2. 清洗数据 cleaned_df clean_couplet_data(raw_data) # 3. 保存数据 if not cleaned_df.empty: save_data(cleaned_df, spring_festival_couplets) # 4. 预览一下数据 print(\n数据预览前5行) print(cleaned_df.head()) else: print(未获取到有效数据请检查爬虫目标网站和解析规则。)运行这个脚本你就能在本地得到几个包含清洗后对联数据的文件了。5. 总结与后续思路走完这一遍你应该对用Python爬虫准备特定文本语料有了一个完整的体验。整个过程的核心其实就三步观察网页结构找到数据位置、写代码模拟请求并提取、把提取的文本清洗规整。为春联模型准备数据是这个流程一个很好的实践。拿到这批数据之后你可以直接用它去微调那些开源的文本生成模型。在微调时通常需要把对联数据整理成模型约定的输入格式比如可能要把上联、下联和横批用特殊的标记符号如[SEP]连接起来。更进阶一点你还可以对这批语料进行分析比如统计最常用的吉祥字词、分析对联的平仄规律虽然对模型来说可能不直接需要这些分析能帮你更好地理解数据甚至设计出更好的模型训练任务。爬虫技术本身也有很多可以深入的地方比如处理更复杂的动态加载网页可能需要用到Selenium、应对网站的反爬机制需要更复杂的请求头、使用代理IP、处理Cookie等。但无论如何从静态页面、结构清晰的网站开始实践都是最稳妥的入门路径。希望这篇教程能帮你打开数据获取的大门让你在训练自己专属AI模型的路上走好这坚实的第一步。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。