Perl 脚本自动提取《人民日报》全文数据库中的动态词频数据

Posted 九州语言网

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Perl 脚本自动提取《人民日报》全文数据库中的动态词频数据相关的知识,希望对你有一定的参考价值。

基于动态词频数据可以获得一些与词语使用情况相关的信息。北语 BCC 语料库可提供人民日报词频的历时检索功能(http://bcc.blcu.edu.cn/hc),但目前只收录了2015年之前的语料。网络版《人民日报》本身也提供了一个比较强大的高级检索功能,容许用户按照指定时间段对1946年以来的全部文章进行内容检索,并会给出相应的词频数据。下图1给出了一个检索结果页面:

图1:人民日报检索结果示例

从上图1蓝色框线位置可以看出,“四个全面”这个词语自2012年11月1日至2017年6月29日在《人民日报》中一共出现了2025次。

为了批量提取网页文件中的这些词频信息,笔者在做未登录词研究时曾编写了一个 Perl 脚本程序,用于下载并解析相应的网页内容,输出动态词频数据以便于确定哪些未登录词属于新词。脚本程序源码如下所示,需要的读者可拷贝粘贴至记事本程序中,并另存成一个 *.pl 文件以备用,亦可根据需要修改使用。

#############################

#功能:基于人民日报网数据,统计词语在一定时期内出现的频数(按月统计)

#By XIONG Zi


use Encode;

use Encode::CN; 

use Encoding utf8;

use LWP::Simple;

use File::Basename;

use File::Spec;


if ($#ARGV ne 2) {

print "   脚本参数配置如下:start_year end_year word ";

print "     start_year:   起始年份 ";

print "     end_year:     结束年份 ";

print "     word:         要检索的词条 ";

print "     注意:词条中不可含有空格 ";

exit;

}

$start_year   = $ARGV[0];

$end_year    = $ARGV[1];

$word            = $ARGV[2];


my $path_curf = File::Spec->rel2abs(__FILE__);

my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);

$cm         = $mon+1;

$cy           = $year+1900;

$dir          = dirname($path_curf)."\";

$sfn         = $dir.$word;


%words = ();

if ((-e "$sfn.txt") ne 1) {

open (iBFILE, ">$sfn.txt")  ||  die  "$sfn.txt can not open! "; 

$newtxt=encode(utf8,"x{feff}");

print iBFILE "$newtxt ";

close(iBFILE);

} else {

open (iBFILE, "<$sfn.txt")  ||  die  "$sfn.txt can not open! "; 

@linelist=<iBFILE>;

foreach $eachline(@linelist){

@fields = split(/ /, $eachline);

$words{$fields[0]}=$fields[1];

}

close(iBFILE);

}


for ($y=$start_year; $y<=$end_year; $y++) {

$tm=12;

if ($y eq $cy) {$tm=$cm-1;}

for ($m=1; $m<=$tm; $m++) {

$mon=$m;

if ($m<10) {$mon = "0".$mon;}

$ym=$y."_".$mon;

if (!exists $words{$ym}) {

my $url = "http://58.68.146.102/rmrb/s?type=2&qs={"cds":[{"fld":"dataTime.start","cdr":"AND","hlt":"false","vlr":"OR","qtp":"DEF","val":"".$y."-".$mon."-01"},{"fld":"dataTime.end","cdr":"AND","hlt":"false","vlr":"OR","qtp":"DEF","val":"".$y."-".$mon."-31"},{"fld":"contentText","cdr":"AND","hlt":"true","vlr":"OR","qtp":"DEF","val":"".$word.""}],"obs":[{"fld":"dataTime","drt":"DESC"}]}";

$url=decode("gbk",$url);

$content=get($url); 

$cpos=index($content,"allDataCount");

if($cpos>0) {

$content=substr($content,$cpos+14,20);

$content=substr($content,0,index($content,"<"));

print $y."_".$mon.": ".$content." ";

open (iBFILE, ">>$sfn.txt")  ||  die  "$sfn.txt can not open! "; 

printf iBFILE "%s %s ", $y."_".$mon, $content;

close(iBFILE);

}

}

}

}

print " 操作已完成!结果保存至: $sfn.txt ";

#############################

要使用这一 Perl 脚本程序,用户需事先安装好 ActivePerl 程序,并配置好相应的运行环境变量。然后在 Dos 命令行窗口中调用该脚本程序,并设定好相应的运行参数,如下图所示:

【Perl 脚本】自动提取《人民日报》全文数据库中的动态词频数据

图2:调用脚本程序的命令行及其参数

上一命令行包含三个控制参数起始年份,如上图的“2010”;结束年份,如上图的“2017”;关键词,如上图的“中国梦”。运行上一命令,脚本程序将逐月从《人民日报》网站上提取2010年至2017年之间出现“中国梦”一词的次数,得到并输出类似于以下格式的数据文件:

表1:“中国梦”的动态词频

【Perl 脚本】自动提取《人民日报》全文数据库中的动态词频数据

在 Excel 程序中将上表1中的词频数据做成折线图,结果大致如下图3所示,从中我们可以较为清晰地观察出词频的动态变化。

下面给出了几个词语的词频数据检索结果:

【Perl 脚本】自动提取《人民日报》全文数据库中的动态词频数据

图3:“中国梦”的动态词频(2010-2017)


图4:“奥运会”的动态词频(2000-2017)

图5:“改革开放”的动态词频(1978-2017)




以上是关于Perl 脚本自动提取《人民日报》全文数据库中的动态词频数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 perl 脚本从 HTML 文件中提取信息

从 perl 脚本中提取用户名

利用Perl提取TCGA临床数据

在 Perl 中创建正则表达式以提取值

Perl语言概览

用perl写一个简单的根据ID提取表达量脚本