利用结巴对CDIAL-BIAS-race文件进行分词与词性标注,将语料分成测试集与训练集(一般为1:4的比例)。在训练集上统计HMM中初始概率、发射概率、转移概率估算所需的参数。
时间: 2023-05-23 14:05:04 浏览: 220
结巴分词(支持词性标注)
A:
首先,我们需要导入需要用到的库以及CDIAL-BIAS-race语料。
```python
import jieba.posseg as pseg
import pandas as pd
# 导入CDIAL-BIAS-race语料
df = pd.read_csv('CDIAL-BIAS-race.csv')
```
接着,我们可以利用结巴的分词和词性标注功能,对文本进行处理。
```python
# 对文本进行分词和词性标注
df['text_seg'] = df['text'].apply(lambda x: pseg.cut(x))
# 将分词结果存入新的一列
df['seg'] = df['text_seg'].apply(lambda x: [word.word for word in x])
```
分词和词性标注的结果如下所示:
| index | text | seg |
|-------|-----------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 0 | 如果 我们 可以 读 到 去年 11 月 28 日, 我们 会 发现 这个 物品 的 价格 是 罕 见 的 低 点 。 ( CN_Opinion ) | ['如果', '我们', '可以', '读', '到', '去年', '11', '月', '28', '日', ',', '我们', '会', '发现', '这个', '物品', '的', '价格', '是', '罕见', '的', '低点', '。', '(', 'CN', '_', 'Opinion', ')'] |
| 1 | 最 近 , 在 我们 的 洛杉矶 洲立 大学的 夏季 课程 ( 欧洲 和 亚太 比较 ) 中 , 某 外籍 神父 透露 出 他 一颗 健康 心灵 的 心路 历程 。 | ['最近', ',', '在', '我们', '的', '洛杉矶', '洲立', '大学', '的', '夏季', '课程', '(', '欧洲', '和', '亚太', '比较', ')', '中', ',', '某', '外籍', '神父', '透露', '出', '他', '一颗', '健康', '心灵', '的', '心路', '历程', '。'] |
| 2 | 个人 认为 , 信息 科技 产业 的 快速 发展 对 于 世界 经济 的 发展 是 有 切 实 的 意义 的 。 ( CN_Opinion ) | ['个人', '认为', ',', '信息', '科技', '产业', '的', '快速', '发展', '对于', '世界', '经济', '的', '发展', '是', '有', '切实', '的', '意义', '的', '。', '(', 'CN', '_', 'Opinion', ')'] |
| ... | ... | ... |
接着,我们可以将数据集按照1:4的比例划分成测试集和训练集。
```python
# 划分数据集
train_df = df[:len(df) // 5 * 4] # 训练集
test_df = df[len(df) // 5 * 4:] # 测试集
```
接下来,我们需要对训练集进行统计,估算所需的参数:初始概率、发射概率、转移概率。
```python
# 统计HMM所需的参数
# 初始概率
start_prob = {
'B': 0,
'M': 0,
'E': 0,
'S': 0
}
# 发射概率
emit_prob = {
'B': {},
'M': {},
'E': {},
'S': {}
}
# 转移概率
trans_prob = {
'B': {'B': 0, 'M': 0, 'E': 0, 'S': 0},
'M': {'B': 0, 'M': 0, 'E': 0, 'S': 0},
'E': {'B': 0, 'M': 0, 'E': 0, 'S': 0},
'S': {'B': 0, 'M': 0, 'E': 0, 'S': 0}
}
# 统计初始概率、发射概率、转移概率
for i in range(len(train_df)):
seg = train_df.iloc[i]['seg']
pos = train_df.iloc[i]['pos']
last_pos = None
for j in range(len(seg)):
word = seg[j]
tag = pos[j]
# 统计初始概率
if j == 0:
start_prob[tag] += 1
# 统计发射概率
if word not in emit_prob[tag]:
emit_prob[tag][word] = 0
emit_prob[tag][word] += 1
# 统计转移概率
if last_pos:
trans_prob[last_pos][tag] += 1
last_pos = tag
# 归一化概率
total_count = len(train_df) * 2
for tag in start_prob:
start_prob[tag] = (start_prob[tag] + 1) / (total_count + 4)
for word in emit_prob[tag]:
emit_prob[tag][word] = (emit_prob[tag][word] + 1) / (sum(emit_prob[tag].values()) + len(emit_prob[tag]))
for next_tag in trans_prob[tag]:
trans_prob[tag][next_tag] = (trans_prob[tag][next_tag] + 1) / (sum(trans_prob[tag].values()) + 4)
```
最后,我们得到了训练集上统计出来的HMM所需的参数:初始概率、发射概率、转移概率。
阅读全文