藏语自然语言处理入门 - 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(候选停用词,等人工修订)

相关推荐
K24B;2 小时前
多模态大语言模型LISA++
android·人工智能·语言模型·分割·多模态大语言模型
xindoo2 小时前
AI Agent 设计模式:从理论到实践的完整指南
人工智能·设计模式
众趣科技2 小时前
数字孪生驱动智慧园区革新,众趣科技多领域应用助力产业升级
人工智能·智慧城市·空间计算
蒋星熠2 小时前
爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南
运维·人工智能·爬虫·python·深度学习·机器学习·自动化
东临碣石823 小时前
【AI论文】语言模型的变分推理方法
人工智能·语言模型·自然语言处理
文火冰糖的硅基工坊3 小时前
[创业之路-666]:第四次工业革命(智能革命)未来将创造大量的财富,普通人通过哪些方式参与这些财富的创造与分享?
人工智能·chatgpt·系统架构·产品运营·产业链
数智顾问3 小时前
AI自动化测试:接口测试全流程自动化的实现方法——从需求到落地的全链路实践
运维·人工智能·自动化
AI人工智能+4 小时前
表格识别技术:突破传统OCR的局限,通过定位-解析-重建三步策略攻克无边框、合并单元格等视觉难题
人工智能·深度学习·ocr·表格识别
夫子3964 小时前
【深度干货】Transformer推理优化完全指南:模型压缩、推理加速与硬件调优
人工智能·llm