公开网页的大部分内容只用少数几种语言写成,而从一个国家运行的爬虫看到的范围更窄:那些本会向本地访客展示本地文本的网站,它只能拿到英文版或默认版。如果你要为多个市场训练或微调模型,采集真正多语言、有地区特色的数据本身就是一个独立的难题,这也正是 AI 与机器学习数据采集最棘手的地方。
本文介绍如何按语言规划覆盖范围、去哪里找本地来源、如何获取本地读者看到的版本,以及拿到文本后如何识别、过滤和平衡。从爬取到语料库的整体流程,请参阅我们的从公开网页构建大规模训练数据集指南。
按语言和地区规划覆盖范围
先做一张表,而不是先写爬虫。为每种目标语言写下:
- 重要的地区。 西班牙、墨西哥和阿根廷的西班牙语在词汇、拼写和话题上都不同。巴西和葡萄牙的葡萄牙语差别更大。确定你需要哪些变体。
- 目标数据量,按语言和变体计算,单位是 token 数或文档数。
- 需要覆盖的领域:新闻、论坛、政府、商业、参考资料、技术文档。
- 文字系统。 有些语言使用不止一种文字,比如塞尔维亚语同时使用西里尔字母和拉丁字母。决定是否两种都保留。
这张表就是你的检验标准。每次采集结束后,按语言逐一对照这张表检查结果。
寻找本地来源
通用爬取对小语种覆盖不足,所以要按语言建立种子列表:
- 国家代码域名,如
.pl、.vn或.co.ke,是寻找地区内容的有力起点。 - 全球网站的各语言版本。 页面头部和站点地图中的
hreflang标签会列出页面的所有语言版本。我们的用 hreflang 找到页面的每个语言版本指南介绍了提取方法。 - 本地目录、新闻聚合站和政府门户,它们会链接到大量同语言的网站。
- 本地语言的搜索结果,从该地区获取,能找到全球爬取很少触及的网站。
为每个种子记录来源和退出(opt-out)状态。抓取时遵守 robots.txt 和针对 AI 的退出声明,并把这些记录和数据一起保存。
获取本地读者看到的版本
很多网站会根据访客位置决定提供什么内容:语言、货币、本地新闻、地区版或同意弹窗。数据中心里的爬虫对每个国家拿到的都是默认版本,通常是英文,却把它当成本地内容记录下来。
要采集本地版本,每个请求都必须看起来像来自本地读者:
- 目标国家的 IP,最好是家庭宽带。通过住宅代理发出的请求来自所选国家或城市的住宅 IP,网站会像对待真实访客一样为其路由并本地化。
- 相应的
Accept-Language请求头,例如面向波兰读者时使用pl-PL,pl;q=0.9。 - 一致的信号。 无头浏览器的时区和区域设置要与 IP 一致。不一致是网站退回默认版本的原因之一;我们的匹配代理地理位置、时区和区域设置一文列出了检查要点。
在采集初期,手动抽查每个地区的样本。如果”越南语”数据里全是英文页面,说明抓取层出了问题,后续任何过滤都无法补救。
识别每篇文档的语言
永远不要只相信 lang 属性或域名。对提取出的文本运行语言识别模型:
- fastText 的 lid.176 模型支持 176 种语言,速度快到可以处理每一篇文档。
- 覆盖面更广的模型如 GlotLID 支持的语言多得多,对低资源语言效果更好。
除了按文档识别,还要按段落识别。很多页面混用多种语言:带英文导航菜单的本地文章,或用户来回切换语言的论坛帖子。保留目标语言的段落,并记录置信度分数,以便之后收紧阈值。短文本最容易识别出错,所以在相信某个标签之前,先设定最短长度。
按语言过滤,而不是统一过滤
针对英语调好的质量过滤器会损害其他语言。停用词数量、平均词长或标点比例等启发式规则,在词与词之间没有空格的泰语、或单词很长的芬兰语里表现完全不同。请根据母语者审核过的样本,为每种语言单独设定阈值。
多语言数据中有两个问题会被放大:
- 机器翻译的内容。 很多网站发布英文页面的自动翻译。它们能增加数据量,却会让模型学到翻译错误。标记那些几乎是已知英文页面译文的页面,对全站自动翻译的网站整体保持警惕。
- 编码错误。 解码错误的文本会产生乱码,看起来像一种真实但奇怪的语言。统一转换为 Unicode,修复或丢弃损坏的编码,并规范化 Unicode 形式,避免同一个词以两种方式存储。
在每种语言内部和不同语言之间都要去重,因为相同的样板文字、法律声明和模板会出现在一个网站的所有语言版本中。
平衡数据配比
原始网页数据被少数语言主导。按原始比例训练,小语种几乎学不到;按相同比例训练,小语种会被重复很多次,模型会把它们背下来。
常见的折中做法是温度采样:按每种语言的数据量取一个小于一的指数幂,再按比例采样。mT5 和 XLM-R 的论文使用的指数是 0.3。无论你选择什么值,都要连同采样前后各语言的 token 数一起记录下来,让配比可以复现、可以解释。我们的 AI 训练流程中的数据溯源指南介绍了需要记录哪些内容。
总结
多语言数据不是英文数据加一道翻译工序。按语言和变体规划覆盖范围,寻找本地来源,按本地读者看到的样子获取每个地区的内容,按段落识别语言,用分语言的阈值过滤,并有意识地平衡配比。你的”波兰语”数据是不是真的波兰语,取决于采集层,所以先把抓取做对。