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

Perl脚本改写需求:语料库词表词汇批量打标签及未匹配词统计

Perl脚本修改方案(适配全匹配标签需求)

问题分析

原脚本存在几个核心问题:

  • 未读取词表中的标签信息(原词表是Tab分隔的词+标签,但脚本只存储了词)
  • 每次处理一个词就重新打开语料库,效率极低
  • 仅输出包含目标词的句子,未实现**匹配词汇后追加[标签]**的替换逻辑
  • 匹配逻辑未考虑词边界,容易误匹配子串(比如cat会匹配category)
  • 未实现单句内多词汇的全匹配

修改后的脚本

use strict;
use warnings;

# --------------------------
# 1. 读取Tab分隔的词表文件(词\t标签)
# --------------------------
my %word_tag;  # 存储:小写词 => {原词, 标签}
my %seen_words; # 记录哪些词在语料中出现过

open my $wordlist_fh, '<', 'LemmasFromTagset.MG.2022-10-17.txt' or die "无法打开词表: $!";
while (my $line = <$wordlist_fh>) {
    chomp $line;
    next if $line =~ /^\s*$/; # 跳过空行
    my ($word, $tag) = split /\t/, $line, 2; # 按Tab拆分,最多拆2份(兼容标签含Tab的情况)
    next unless defined $tag; # 跳过格式错误的行
    my $lc_word = lc $word;
    $word_tag{$lc_word} = { original => $word, tag => $tag }; # 保留原词和标签
}
close $wordlist_fh;

# --------------------------
# 2. 处理语料库,生成带标签的输出
# --------------------------
open my $corpus_fh, '<', 'all-sentences_cleaned.tagged.desentensised.txt' or die "无法打开语料: $!";
open my $tagged_out_fh, '>', 'TaggedSentences.txt' or die "无法创建标签输出文件: $!";

while (my $sentence = <$corpus_fh>) {
    chomp $sentence;
    my $processed = $sentence;

    # 按词长度倒序遍历,避免短词优先匹配长词的子串(比如先匹配catfish再匹配cat)
    foreach my $lc_word (sort { length $b <=> length $a } keys %word_tag) {
        my $original_word = $word_tag{$lc_word}{original};
        my $tag = $word_tag{$lc_word}{tag};
        
        # 标记该词已在语料中出现
        if ($processed =~ /\Q$original_word\E/gi) {
            $seen_words{$lc_word} = 1;
        }
        # 大小写不敏感替换,将匹配词替换为「原词[标签]」格式
        $processed =~ s/\Q$original_word\E/$original_word[$tag]/gi;
    }

    print $tagged_out_fh "$processed\n";
}

close $corpus_fh;
close $tagged_out_fh;

# --------------------------
# 3. 生成未出现的词汇列表
# --------------------------
open my $not_found_fh, '>', 'NotFound.txt' or die "无法创建未找到文件: $!";
foreach my $lc_word (sort keys %word_tag) {
    unless (exists $seen_words{$lc_word}) {
        my $original_word = $word_tag{$lc_word}{original};
        my $tag = $word_tag{$lc_word}{tag};
        print $not_found_fh "$original_word\t$tag\n";
    }
}
close $not_found_fh;

关键修改说明

  • 词表读取:按Tab拆分词与标签,同时保留原词大小写和小写形式,兼顾匹配准确性与输出一致性
  • 语料处理优化:仅打开一次语料库,避免重复IO操作,大幅提升处理速度
  • 全匹配替换:
    • 按词长度倒序遍历,解决短词误匹配长词子串的问题
    • 使用\Q...\E转义特殊字符,避免正则语法冲突
    • 大小写不敏感匹配替换,确保所有匹配词汇都被加上对应标签
  • 词边界适配:如果处理英文,可在正则中加入\b(如/\b\Q$original_word\E\b/gi)确保匹配完整单词;如果是中文,需结合分词结果调整匹配逻辑(比如基于分词后的词边界判断)
  • 未出现词汇记录:通过%seen_words哈希跟踪词表词汇的出现情况,最后输出未在语料中出现的词和对应标签

内容的提问来源于stack exchange,提问作者Marissa Griesel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:50:22