perl - 从字符串中提取格式不一致的日期(日期解析,NLP)

标签 perl date nlp

我有大量文件,其中一些文件名中嵌入了日期。日期的格式不一致且通常不完整,例如“Aug06”、“Aug2006”、“August 2006”、“08-06”、“01-08-06”、“2006”、“011004”等。除此之外,一些文件名还有一些不相关的数字,看起来有点像日期,例如“20202010”。

简而言之,日期通常不完整,有时不存在,格式不一致,并且嵌入在带有其他信息的字符串中,例如“报告 Aug06.xls”。

是否有任何可用的 Perl 模块可以很好地从这样的字符串中猜测日期?它不一定是 100% 正确的,因为它将由人工手动验证,但我正在努力使该人的事情尽可能简单,并且有数千个条目要检查:)

最佳答案

Date::Parse 肯定会成为您答案的一部分——它可以计算出一个随机格式化的类似日期的字符串,并从中得出一个实际可用的日期。

问题的另一部分——文件名中的其他字符——非常不寻常,以至于你不太可能找到其他人为你打包了一个模块。

在没有看到更多样本数据的情况下,实际上只能猜测,但我会首先确定可能或可能的“日期部分”候选者。

这是一个使用 Date::Parse 的讨厌的暴力示例(更聪明的方法是使用 regex-en 列表来尝试识别日期位 - 我很高兴消耗 cpu 周期而不想那么难!)

!/usr/bin/perl
use strict;
use warnings;
use Date::Parse;

my @files=("Report Aug06.xls", "ReportAug2006", "Report 11th September 2006.xls", 
           "Annual Report-08-06", "End-of-month Report01-08-06.xls", "Report2006");

# assumption - longest likely date string is something like '11th September 2006' - 19 chars
# shortest is "2006" - 4 chars.
# brute force all strings from 19-4 chars long at the end of the filename (less extension)
# return the longest thing that Date::Parse recognises as a date



foreach my $file (@files){
  #chop extension if there is one
  $file=~s/\..*//;
  for my $len (-19..-4){
    my $string = substr($file, $len);
    my $time = str2time($string);
    print "$string is a date: $time = ",scalar(localtime($time)),"\n" if $time;
    last if $time;
    }
  }

关于perl - 从字符串中提取格式不一致的日期(日期解析,NLP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3445358/

相关文章:

javascript - 我需要进行 Ajax 调用并显示数据库表的内容,我正在使用 Perl CGI 并尝试通过 javaScript 调用 Perl 脚本

perl - 如何调整长期物体的渲染?

javascript - 您如何在 Javascript 中映射替换字符,类似于 Perl 中的 'tr' 函数?

javascript - 使用 Javascript 日期,获取 0 或以上 31

perl - 无法从 git pull 的输出创建数组

linux - 用于在 Linux 中的所有子文件夹中使用正确的日期格式重命名文件名的 Bash 脚本

php - 选择 TimeDate = now() =< 2 年后的记录

python - `features[' contains(%s )' % word.lower()] = True` 在 NLTK 中是什么意思?

python - 单个单词的翻译,考虑上下文,使用计算机语言处理工具

python - 主题自然语言处理