如何可视化Wiki文章的时间表?
#javascript #教程 #node #nlp

自动生成时间表 - 一个时期的图形表示,从Wikipedia文章中标记重要事件是一个令人着迷的想法,对于快速掌握历史观点非常有用。这篇文章概述了使用WinkNLP’s API从任何Wikipedia文章中创建一个格式良好的时间表的方法,并命名实体识别(NER)功能:

  1. 获取文章的内容,然后将其转换为WinkNLP document
  2. 通过检测到的entities和仅过滤日期。
  3. 使用日期的Abiaoqian 4将其转换为标准的Unix时间。
  4. 使用parentSentence() API,提取包含日期的句子;同样,markup()在相应的句子中突出显示它的日期。
  5. 在数组中收集每个Unix时间和句子对,然后在Unix时间进行排序。
  6. 使用可观察的功能以及某些CSS将此数组转换为格式良好的时间轴。

上述方法在大约 30 的代码线上实现:

timeLine = {
  const response = await fetch( `https://en.wikipedia.org/w/api.php?action=query&prop=extracts&titles=${WikiArticleTitle || '2022 United Nations Climate Change Conference'}&explaintext=1&formatversion=2&format=json&origin=*` );
  const body = await response.json();
  const text = body.query.pages[ 0 ].extract;

  var doc = nlp.readDoc( text || '' );
        var timeline = [];
        doc
          .entities()
          .filter( ( e ) => {
            var shapes = e.tokens().out( its.shape );
            // We only want dates that can be converted to an actual
            // time using new Date()
            return (
              e.out( its.type ) === 'DATE' &&
              (
                shapes[ 0 ] === 'dddd' ||
                ( shapes[ 0 ] === 'Xxxxx' && shapes[ 1 ] === 'dddd' ) ||
                ( shapes[ 0 ] === 'Xxxx' && shapes[ 1 ] === 'dddd' ) ||
                ( shapes[ 0 ] === 'dd' && shapes[ 1 ] === 'Xxxxx' && shapes[ 2 ] === 'dddd' ) ||
                ( shapes[ 0 ] === 'dd' && shapes[ 1 ] === 'Xxxx' &&  shapes[ 2 ] === 'dddd' ) ||
                ( shapes[ 0 ] === 'd' &&  shapes[ 1 ] === 'Xxxxx' && shapes[ 2 ] === 'dddd' ) ||
                ( shapes[ 0 ] === 'd' &&  shapes[ 1 ] === 'Xxxx' &&  shapes[ 2 ] === 'dddd' )
              )
            );
          })
          .each( ( e ) => {
            e.markup();
            let eventDate = e.out();
            if ( isNaN( eventDate[ 0 ] ) ) eventDate = '1 ' + eventDate;
            timeline.push({
              date: e.out(),
              unixTime: new Date( eventDate ).getTime() / 1000,
              sentence: e.parentSentence().out( its.markedUpText )
            })
          });

        return timeline.sort( ( a, b ) => a.unixTime - b.unixTime )
}

您可以在交互式Observable notebook — "How to visualize timeline of a Wiki article?"上看到它。

关于winknlp

abiaoqian 9是自然语言处理(NLP)的JavaScript库(NLP)。它可以在浏览器和node.js环境中的M1 MacBook Pro上轻松地以 650,000令牌/秒的速度处理大量原始文本。它甚至可以在低端智能手机的浏览器上平稳运行。

它是用具有no external dependency的精益代码库来构建的。 ~100%的测试覆盖范围和遵守Open Source Security Foundation best practices的遵守使Winknlp成为自信地建立生产级系统的理想工具。