藏语自然语言处理入门 - 2 分词

本课目标:分词 + 词频统计 + 停用词候选

本课要做的三件小事

  1. Botok 把句子切成"词"。
  2. 统计每个词出现了几次,导出表格。
  3. 粗筛一批"停用词"(像"的、了、在"这种功能词)。

做完你会得到三个文件:

  • tokens.csv:一行一个"词"(带句子编号、在句子里的位置)。
  • freq_top50.csv:出现次数最多的前 50 个词。
  • stopwords_suggest.txt:停用词。

0. 开始前(1 分钟)

先装三个包(本地或 Colab 都行):

bash 复制代码
pip install botok pandas regex

botok 负责分词,pandas 负责做表格,regex 备用。


1. 我们需要的输入(1 分钟)

上节我们已经有:

  • cleaned.txt(干净文本)
  • sentences.txt一行一句

这一课直接用 sentences.txt,因为一行一句更好定位每个词属于哪句。


2. 一段"分词+词频"的可直接运行脚本(8--10 分钟)

把下面代码保存为 tokenize_and_freq.py,和 sentences.txt 放在同一目录下运行即可。

python 复制代码
# tokenize_and_freq.py
# 用法:
#   python tokenize_and_freq.py
# 产出:
#   tokens.csv         ------ 分词明细(句ID、词在句中的索引、token)
#   freq_top50.csv     ------ 词频Top50
#   stopwords_suggest.txt ------ 停用词候选(简单启发式)

from botok import WordTokenizer
from pathlib import Path
import pandas as pd
import regex as re
from collections import Counter

SENTS_FILE = "sentences.txt"

# 1) 读取句子
sents = Path(SENTS_FILE).read_text(encoding="utf-8").splitlines()
sents = [s.strip() for s in sents if s.strip()]  # 去空行

# 2) 初始化分词器(首次会准备资源)
wt = WordTokenizer()

def tokenize_sentence(sent: str):
    # botok.tokenize 返回 token 对象;这里只取 .text
    toks = [t.text for t in wt.tokenize(sent) if t.text and t.text.strip()]
    return toks

# 3) 对每句分词,记录(句ID、词序号、token)
rows = []
for sid, sent in enumerate(sents, start=1):
    toks = tokenize_sentence(sent)
    for idx, tok in enumerate(toks, start=1):
        rows.append({"sent_id": sid, "tok_idx": idx, "token": tok})

df_tokens = pd.DataFrame(rows)
df_tokens.to_csv("tokens.csv", index=False, encoding="utf-8")
print("✅ 已输出 tokens.csv,大小:", df_tokens.shape)

# 4) 词频统计(不区分大小写;藏文一般不涉及大小写)
#    这里简单排除纯句末符号(།/༎)和全空白
def is_noise(tok: str) -> bool:
    # 只包含句末符或空白 → 认为是噪声
    return bool(re.fullmatch(r"[།༎]+", tok)) or (tok.strip() == "")

freq = Counter(tok for tok in df_tokens["token"] if not is_noise(tok))
top50 = pd.DataFrame(freq.most_common(50), columns=["token", "count"])
top50.to_csv("freq_top50.csv", index=False, encoding="utf-8")
print("✅ 已输出 freq_top50.csv")

# 5) 停用词候选(非常粗的启发式版本)
#    思路:高频 & 很短(<=2字符) & 非标点;你也可以手动加一些已知功能词
stop_candidates = [t for t, c in freq.items() if len(t) <= 2 and not is_noise(t)]
# 也可以补充一批常见功能词(按实际语料再调整)
manual_add = ["ནས་", "ན་", "ལ་", "དང་", "ཡི་", "གི་", "ཀྱི་", "ལས་", "མི་", "ཚོ་"]
stop_set = sorted(set(stop_candidates + manual_add))

Path("stopwords_suggest.txt").write_text("\n".join(stop_set), encoding="utf-8")
print("✅ 已输出 stopwords_suggest.txt(候选数量:", len(stop_set), ")")

读者版讲解(一句话就够):

  • WordTokenizer():就是"切词刀"。
  • tokens.csv:把每个词都落成一行,后面随时能查"第几句第几个词"。
  • freq_top50.csv:最常出现的 50 个词,帮你摸清文本"口味"。
  • stopwords_suggest.txt:一份"可能无关紧要"的词清单,下一课提取关键词时会用得到。

3. 跑一下!(2--3 分钟)

执行:

bash 复制代码
python tokenize_and_freq.py

看终端提示,会生成三个文件:tokens.csvfreq_top50.csvstopwords_suggest.txt

用表格工具或随便打印几行看看,确认分词结果合你的直觉


4. 快速自检(1 分钟)

  • tokens.csv 里是否出现了单独的 /?(作为"词"出现没问题,但我们在词频里剔除了它)
  • freq_top50.csv 的前几名是否大多是功能词?这很正常。
  • stopwords_suggest.txt 有没有明显"不该进"的词?可以删掉。

5. 小任务(10 分钟)

任务A(必做)

stopwords_suggest.txt 里你不认同的词删掉,再加上你觉得多余的词,得到你的自定义停用词表 stopwords.txt

任务B(可选)

做一个小查询:输入一个词,打印它出现的所有句子 (句ID + 句子内容),方便课堂展示"例句"。

提示代码:

python 复制代码
from pathlib import Path
import pandas as pd

df_tok = pd.read_csv("tokens.csv")
sents = Path("sentences.txt").read_text(encoding="utf-8").splitlines()

def concordance(term, top=10):
    rows = df_tok[df_tok["token"] == term]["sent_id"].unique().tolist()
    for sid in rows[:top]:
        print(f"[句{sid}] {sents[sid-1]}")

concordance("བོད་ཡིག")  # 示例

6. 常见小坑(快速排雷)

  • 分词"看着怪"? 多半是原文没清干净。回到第1课,把 cleaned.txtsentences.txt 再确认一遍。
  • 功能词太多,盖住主题词? 就是要这样先看"原貌"。下一课我们会引入停用词表 + TF-IDF,把主题词"捞"出来。
  • Botok 太慢? 首次用会准备资源,后续就快了;文本很大时可以分批处理。

7. 本课产出

  • tokens.csv(句ID、词序号、词)
  • freq_top50.csv(高频词)
  • stopwords_suggest.txt(候选停用词,等人工修订)

相关推荐
长沙京卓15 小时前
Copilot Coding Agent 变了:AI 编程正在从插件变成项目成员
人工智能·ai
AIGC大时代16 小时前
知网 AIGC 检测在罚什么:均匀句长、低指代、零口癖,并不等于「用过 ChatGPT」
人工智能·chatgpt·nlp·aigc·论文·知网·学术规范
华奥系科技16 小时前
银发经济浪潮下,智慧养老该如何落地生根
大数据·人工智能
czxxxc16 小时前
创客匠人AI观察:模型竞赛再提速,安全与治理成新主线
人工智能·知识付费
IT_陈寒16 小时前
Redis缓存雪崩把我坑惨了,这次长记性了
前端·人工智能·后端
百胜软件@百胜软件16 小时前
百胜软件入选“828精选AI解决方案图谱”,胜券AI助力零售品牌构建专属智能体
大数据·人工智能·零售
ai小陈16 小时前
Hunyuan3D-2云端部署实战:图生3D、文生3D怎么跑更稳
人工智能·科技·3d·ai·音视频·gpu算力
智驭未来掌门人16 小时前
别再让员工偷偷用 ChatGPT 了:用一台内网网关,把大模型变成"自来水"
人工智能
阿里云大数据AI技术16 小时前
EMR Serverless Spark多模态 Daft 算子市场免费公测 | 10分钟极速实战(附视频教程)
人工智能·spark
船厂电气自动化ai大模型16 小时前
AI大模型与数学/第63课:矩阵定义、矩阵加法、标量乘法(逐级精讲)
数据结构·人工智能·深度学习·线性代数·算法