文本是什么语言?用 langid 批量识别并标记短句待复核

用 langid 在本地批量识别文本语言,保留编号和原文并导出 CSV。样例将空串、短句标记待复核,并通过混合语言反例说明高模型概率不能代替人工确认。

清理多语言文本时,可以用 langid 在本地为每条记录给出语言候选,并保留原文和编号供人工核对。批处理前先拦截空串和过短文本,避免模型给两三个字母贴了一个语言代码后,就被当作可靠标签。

本文使用 langid 1.1.6,已在 Windows、Python 3.11.15、NumPy 2.4.6 运行六条人工编写的样例。验证的是批处理、CSV 输出及短句待复核规则;没有测量真实语料的识别准确率,也没有连接翻译服务。

文本是什么语言?用 langid 批量识别并标记短句待复核

安装依赖,区分候选语言和通过结论

在新目录创建环境:

python -m venv .venv
.venv\Scripts\python.exe -m pip install "langid==1.1.6"

langid 官方项目附带预训练语言识别模型。安装完成后,下面的脚本使用包内模型进行本地计算,不上传文本,也不再下载外部模型。输出 zh、en、fr 等语言代码,分别表示中文、英文、法文。

本例按官方用法实例化 LanguageIdentifier,并设置 norm_probs=True,获得0至1范围的归一化模型概率。这个数表示模型在候选语言中的相对判断,不等于已测得的正确率;接近1也不能证明文本只有一种语言。

保留每条记录,给短句和空串单独状态

将下段保存为 language_demo.py。本例把非空白字符少于10的文本标为 review_short,把空串标为 review_empty;这是人为设置的演示复核规则,没有声称10个字符是通用最低长度。足够长的文本仅标为 candidate,仍需核对。

from pathlib import Path
import csv
from langid.langid import LanguageIdentifier, model

identifier = LanguageIdentifier.from_modelstring(model, norm_probs=True)
rows = [
    {"id": "zh_demo", "text": "请先核对文档的来源与发布日期,再把检索结果交给人工复核。"},
    {"id": "en_demo", "text": "Please check the document source and publication date before reviewing the search results."},
    {"id": "fr_demo", "text": "Veuillez vérifier la source du document et la date de publication avant de consulter les résultats."},
    {"id": "short_demo", "text": "OK"},
    {"id": "empty_demo", "text": "  "},
    {"id": "mixed_demo", "text": "请用 Python summarize this text and check the JSON schema carefully."},
]

def detect(row):
    text = row["text"].strip()
    length = len("".join(text.split()))
    out = dict(row, detected_lang="", model_probability="", status="")
    if not text:
        out["status"] = "review_empty"
    elif length < 10:  # 人为演示规则,并不是模型的通用长度要求
        out["status"] = "review_short"
    else:
        lang, probability = identifier.classify(text)
        out.update(detected_lang=lang, model_probability=round(float(probability), 6),
                   status="candidate")
    return out

results = [detect(row) for row in rows]
for row in results:
    print(row["id"], row["detected_lang"] or "-",
          row["model_probability"] or "-", row["status"])
assert results[0]["detected_lang"] == "zh"
assert results[1]["detected_lang"] == "en"
assert results[2]["detected_lang"] == "fr"
assert results[3]["status"] == "review_short"
assert results[4]["status"] == "review_empty"
with Path("language_candidates.csv").open("w", newline="", encoding="utf-8-sig") as f:
    fields = ["id", "text", "detected_lang", "model_probability", "status"]
    writer = csv.DictWriter(f, fieldnames=fields)
    writer.writeheader()
    writer.writerows(results)

运行:

.venv\Scripts\python.exe language_demo.py

实际输出里,混合语言值得特别看

固定样例的实际输出:

zh_demo zh 1.0 candidate
en_demo en 1.0 candidate
fr_demo fr 1.0 candidate
short_demo - - review_short
empty_demo - - review_empty
mixed_demo en 0.999996 candidate

中、英、法三条长句得到预期语言代码;OK 没有被强行判断,空串也没有送给模型。language_candidates.csv 保留六条记录、原文、候选语种、归一化概率和状态,人工可以从编号回到输入。

mixed_demo 包含中文、Python 和一段英文,模型返回 en,概率约0.999996。高概率说明模型偏向英文,不能据此把中文部分忽略,也不能证明它是单语文档。这里的 candidate 是供复核的候选状态,不是自动通过。

脚本断言检查三条人为长句的预期代码和两种待复核状态。断言失败、输出记录数减少或 CSV 编码不正确时,先检查版本、原文和读取方式;不要在失败输出上继续建立语言标签库。

换真实语料后怎样安排人工复核

  1. 读取原文并保留稳定编号,先去掉空白字符串,给过短文本单独保存原因。短句规则应结合实际语种和任务校准。
  2. 选一批人工已知语言的真实文本,包含产品名、代码、网址、缩写以及混合语言,观察哪些样本经常误判。
  3. 在复核表增加人工语种、是否混合、修改理由。不要用概率排序代替对原文的阅读。
  4. 如果系统只允许某几种语言,仍需保留“不在候选集合/无法判断”的业务处理路径。直接限制模型语言集合可能让集合外的文本被分给一个错误候选。

官方项目示例显示,限制候选语种后,同一段英文也可能被分配到意大利语并给出很高的分数。因此本文使用模型默认候选范围,没有先限定 zh/en/fr。语言识别只能帮助分流;翻译、内容合规或语音转写需要另外的工具和验收。

为什么不把空串和短句直接删掉?

短文本可能是有效的名称、指令或缩写。脚本保留原文和状态,让编辑决定是否补上下文、与相邻段落一起判断或保留未定;是否删除由资料用途决定。

来源与接口依据

官方资料核对日期:2026年10月1日。本文用到的接口见:langid 官方项目、归一化概率与候选语种限制示例。

Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30803.html

赞 (0)
AI小管家的头像AI小管家
中文短文本怎么按主题聚类?用 TF-IDF 和 KMeans 检查分组
上一篇 1天前
SelectKBest 怎么筛选分类特征?在 Pipeline 中保留原始列名
下一篇 1天前

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部