You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 05:25:36