如何为多标签音素分类数据实现自定义one-hot编码函数
音素one-hot编码实现
原始数据
现有文本文件存储的音素分类数据如下:
fricative f, s, S, x, v, z, Z, G, h nasal n, m, N lateral r, l, j, J labial p, b, m, f, v coronal s, z, n, d, t, r, l, j, J, S, Z dorsal g, k, G, x, N, h frontal e, i, I, E, E:, E~, j, J,
功能需求
实现one-hot编码函数,输出结果第一列为单个音素,其余列为上述分类标签,音素属于对应分类则标记为1,否则为0,输出效果示例:
| letters | fricative | nasal | lateral | labial | coronal | dorsal | frontal |
|---|---|---|---|---|---|---|---|
| e | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| f | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
| g | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
| j | 0 | 0 | 1 | 0 | 1 | 0 | 1 |
注:原示例中f的frontal标记为1属于错误,实际根据分类数据f不在frontal列表内,代码会按实际分类数据生成正确结果
待填充的代码框架
需要基于以下框架完成功能实现:
def one_hot_labels(df): ''' - 逐行创建字典,标记每个标签的存在状态(1为存在,0为不存在) - 将所有字典存入列表后转换为DataFrame输出 ''' dict_labels = [] for i in (range(len(df)), leave=False): d = dict(zip(range(n_labels), [0]*n_labels)) ... dict_labels.append(d) df_labels = pd.DataFrame(dict_labels) return df_labels
完整实现代码
import pandas as pd # 解析原始分类数据,生成标签到音素的映射,以及所有唯一音素列表 def parse_raw_data(raw_text): category_phoneme_map = {} all_phonemes = set() for line in raw_text.strip().split('\n'): line_parts = line.split() category = line_parts[0] phonemes = [p.strip() for p in ','.join(line_parts[1:]).split(',') if p.strip()] category_phoneme_map[category] = set(phonemes) all_phonemes.update(phonemes) return category_phoneme_map, sorted(list(all_phonemes)) # 实现one-hot编码 def one_hot_labels(category_map, phonemes): label_list = list(category_map.keys()) dict_labels = [] for phoneme in phonemes: # 初始化所有标签为0 row_dict = {label: 0 for label in label_list} # 遍历标签判断所属分类 for label in label_list: if phoneme in category_map[label]: row_dict[label] = 1 row_dict['letters'] = phoneme dict_labels.append(row_dict) # 调整列顺序,音素列放第一 df = pd.DataFrame(dict_labels)[['letters'] + label_list] return df # 调用测试 if __name__ == '__main__': raw_category_data = """ fricative f, s, S, x, v, z, Z, G, h nasal n, m, N lateral r, l, j, J labial p, b, m, f, v coronal s, z, n, d, t, r, l, j, J, S, Z dorsal g, k, G, x, N, h frontal e, i, I, E, E:, E~, j, J, """ cate_map, phoneme_list = parse_raw_data(raw_category_data) result = one_hot_labels(cate_map, phoneme_list) print(result) # 如需导出可以用 result.to_csv('phoneme_onehot.csv', index=False)
内容的提问来源于stack exchange,提问作者lima0
相关产品推荐
相关产品推荐

