藏文助词标注器入门实践
🚩 项目简介
本项目实现一个藏文自动格助词标注器:
- 输入一个藏文句子后,程序能自动识别句中的藏文助词,并标注出其对应的语法格位(如属格、方位格、施事格等)。
🧠 什么是藏文格助词?
藏语里,不同的助词表示词与词之间的语法关系,比如:
- 属格(表示所属关系):གི、ཀྱི、གྱི、འི、ཡི
- 方位格(表示地点或方位):ལ、ན、དུ、ཏུ、རུ、སུ
- 施事格(表示动作的执行者):ས、གིས、ཀྱིས、གྱིས、ཡིས
本项目会尝试自动把这些助词及其格位标注出来。
⚙️ 什么是CRF?
- CRF(条件随机场) 是一种统计机器学习模型,专门用来处理序列标注问题。
- 通俗地讲,CRF会根据上下文自动学习如何给文本中每个词打上合适的“标签”,在这里标签就是“格位”。
例如:
བོད་ (名词) + ལ་ (助词 LOC 方位格) → 表示“在西藏”
CRF就是学习如何自动给每个藏文单词标注“名词”、“助词”等标签的。
🛠️ 一、环境准备(从零开始)
步骤1:安装Python(已安装请跳过)
推荐Python 3.8或以上版本。
- Python官网下载安装
安装完成后打开终端检查:
python --version
步骤2:安装必备库
打开终端,执行:
pip install sklearn-crfsuite pybo
sklearn-crfsuite
:实现CRF的Python库pybo
:藏文分词工具
📁 二、搭建项目结构
创建文件夹particle_tagger_project
:
particle_tagger_project/
├── training_data.txt
└── tagger.py
📑 三、准备少量训练数据(training_data.txt
)
以下是几个简单标注示例:
བོད N
ལ LOCང N
གི GEN
ཕྱིན་པ VERBཁྱི N
གི GEN
ཁ་དོག N
ནག་པོ ADJམི N
ས ERGལྷ་ས N
ལ LOCབོད་པ N
གྱི GEN
བོད་སྐད N
- 每一行是一个词+它的标注标签。
- 空行代表一句话结束。
💻 四、完整代码与详细解释(tagger.py
)
复制以下完整代码:
import sklearn_crfsuite
from pybo import WordTokenizer# 定义助词与格位的关系(提前规则)
PARTICLE2CASE = {'གི': 'GEN', 'ཀྱི': 'GEN', 'གྱི': 'GEN', 'འི': 'GEN', 'ཡི': 'GEN','གི་': 'GEN', 'ཀྱི་': 'GEN', 'གྱི་': 'GEN', 'འི་': 'GEN', 'ཡི་': 'GEN','ལ': 'LOC', 'ལ་': 'LOC', 'ན': 'LOC', 'ན་': 'LOC', 'དུ': 'LOC','དུ་': 'LOC', 'ཏུ': 'LOC', 'ཏུ་': 'LOC', 'རུ': 'LOC', 'རུ་': 'LOC','སུ': 'LOC', 'སུ་': 'LOC', 'ས': 'ERG', 'ས་': 'ERG','གིས': 'ERG', 'ཀྱིས': 'ERG', 'གྱིས': 'ERG', 'ཡིས': 'ERG','གིས་': 'ERG', 'ཀྱིས་': 'ERG', 'གྱིས་': 'ERG', 'ཡིས་': 'ERG'
}# 加载训练数据函数
def load_data(filepath):sentences, sentence = [], []with open(filepath, 'r', encoding='utf-8') as f:for line in f:line = line.strip()if line:word, tag = line.split()sentence.append((word, tag))else:sentences.append(sentence)sentence = []if sentence:sentences.append(sentence)return sentences# 定义CRF特征函数(特征告诉模型如何学习)
def word2features(sent, i):word = sent[i][0].rstrip('་')features = {'bias': 1.0,'word': word,'is_particle': word in PARTICLE2CASE,'suffix': word[-1],'prev_word': sent[i-1][0].rstrip('་') if i > 0 else '<BOS>','next_word': sent[i+1][0].rstrip('་') if i < len(sent)-1 else '<EOS>'}return features# 数据处理(转化为CRF模型的输入格式)
def prepare_data(sentences):X, y = [], []for sent in sentences:X.append([word2features(sent, i) for i in range(len(sent))])y.append([tag for _, tag in sent])return X, y# CRF模型训练函数
def train_crf(X_train, y_train):crf = sklearn_crfsuite.CRF()crf.fit(X_train, y_train)return crf# 主函数(用户交互)
if __name__ == "__main__":tokenizer = WordTokenizer()data = load_data('training_data.txt')X_train, y_train = prepare_data(data)crf_model = train_crf(X_train, y_train)sentence = input("输入藏文句子进行助词标注:\n")tokens = tokenizer.tokenize(sentence)predicted_tags = []for i, token in enumerate(tokens):word = token.textif word in PARTICLE2CASE:predicted_tags.append(PARTICLE2CASE[word]) # 规则标注else:test_sent = [(t.text, 'N') for t in tokens]features = word2features(test_sent, i)predicted_tags.append(crf_model.predict_single([features])[0])print("\n标注结果:")for word, tag in zip(tokens, predicted_tags):if tag != 'N':print(f"{word.text} -> 助词(格位:{tag})")else:print(f"{word.text} -> 非助词")
▶️ 五、运行测试
进入项目目录执行:
python tagger.py
示例:
输入藏文句子进行助词标注:
ཁྱི་ཕྲུག་གི་ཁ་དོག་ནག་པོ།中文:小狗的颜色是黑色的。标注结果:
ཁྱི་ཕྲུག་ -> 非助词
གི་ -> 助词(格位:GEN)
ཁ་དོག་ -> 非助词
ནག་པོ -> 非助词
། -> 非助词
🎯 常见问题与解决方案:
问题 | 原因 | 解决方法 |
---|---|---|
标注错误 | 训练样本少 | 增加训练数据 |
乱码 | 编码问题 | 用UTF-8保存文件 |
🚀 后续扩展方向:
- 增强CRF模型(更多数据、更多特征)。
- 尝试更高级深度学习模型 (如LSTM, Transformer)。
🎉 恭喜你!你已完成藏文助词自动标注器的学习与实践。