如何基于openFST的fstrandgen生成路径并导出词与权重至CSV?
使用OpenFST生成随机路径并导出至CSV的实操指引
一、批量生成随机路径
如果用命令行工具,可通过循环调用fstrandgen生成批量路径,比如在bash中:
# 生成1000条随机路径,每条存为临时fst文件 for i in {1..1000}; do fstrandgen input.fst > path_$i.fst done
如果用Python的pywrapfst(更适合后续数据处理),直接在脚本中循环生成:
import pywrapfst # 加载已有FST fst = pywrapfst.Fst.read("input.fst") # 存储路径数据的列表 path_data = [] # 生成1000条路径 for _ in range(1000): path = fst.random() # 提取路径的输出词序列和权重 output_str = path.output_str() weight = path.weight().value() # 转换为数值型权重 path_data.append( (output_str, weight) )
二、提取词序列与权重
- 命令行方式:对每个生成的路径文件,用
fstprint提取输出符号,用fstinfo获取总权重:
# 提取单条路径的词序列 fstprint --isymbols=syms.txt --osymbols=syms.txt path_1.fst | awk '{if(NR>1) printf "%s ", $4} END{print ""}' | sed 's/ $//' # 提取单条路径的权重 fstinfo path_1.fst | grep "final weight" | awk '{print $4}'
- Python方式:上面的代码已直接通过
path.output_str()拿到拼接好的词序列,path.weight().value()拿到权重数值,无需额外处理。
三、写入CSV文件
- Python方式(最便捷):用内置
csv模块写入:
import csv with open("random_paths.csv", "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) # 写入表头 writer.writerow(["word_sequence", "weight"]) # 写入所有路径数据 writer.writerows(path_data)
- 命令行方式:将循环提取的结果拼接成CSV:
# 先写入表头 echo "word_sequence,weight" > random_paths.csv # 循环处理每条路径并追加到CSV for i in {1..1000}; do words=$(fstprint --isymbols=syms.txt --osymbols=syms.txt path_$i.fst | awk '{if(NR>1) printf "%s ", $4} END{print ""}' | sed 's/ $//') weight=$(fstinfo path_$i.fst | grep "final weight" | awk '{print $4}') echo "\"$words\",\"$weight\"" >> random_paths.csv done # 清理临时路径文件 rm path_*.fst
注意事项
- 如果你的FST有特殊符号表,要在
fstprint中指定--osymbols参数指向符号表文件(比如syms.txt),否则输出会是数字ID而非实际词。 - 权重值的格式取决于FST使用的权重类型(比如热带权重、对数权重),可根据需求做转换。
- 如果需要避免重复路径,可在Python脚本中用集合去重,或在生成时设置
fstrandgen的--unique参数(部分版本支持)。
内容的提问来源于stack exchange,提问作者Phil T.
相关产品推荐
相关产品推荐

