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
相关产品推荐
相关产品推荐

