微信小程序实战,基于vue2实现瀑布流

1、什么是瀑布流呢?

瀑布流,又称瀑布流式布局。是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。

瀑布流对于图片的展现,是高效而具有吸引力的,用户一眼扫过的快速阅读模式可以在短时间内获得更多的信息量,而瀑布流里懒加载模式又避免了用户鼠标点击的翻页操作,瀑布流的主要特性便是错落有致,定宽而不定高的设计让页面区别于传统的矩阵式图片布局模式,巧妙的利用视觉层级,视线的任意流动又缓解了视觉疲劳,同时给人以不拘一格的感觉,切中年轻一族的个性化心理。

下面这些就是用瀑布流来实现,看起来是不是很美观呢?

微信小程序实战,基于vue2实现瀑布流

微信小程序实战,基于vue2实现瀑布流

2、实现一个简单的瀑布流

先看一下咱们最终的试下效果吧,只是简单传入文字进行演示

微信小程序实战,基于vue2实现瀑布流

1、瀑布流的特点

1、琳琅满目:整版以图片为主,大小不一的图片按照一定的规律排列。

2、唯美:图片的风格以唯美的图片为主。

3、操作简单:在浏览网站的时候只需要轻轻滑动一下鼠标滚轮,一切的美妙的图片精彩便可呈现在你面前

2、核心算法

通过图片我们可以直观的看到,每一个卡片的高度都是不一样的,需要我们实时能计算高度,同时左右的高度还是不能相互影响。

这里我们主要通过两个数组进行实现,即分为左右数组,核心代码如下:


data() {
    return {
        leftList: [],
        rightList: [],
        tempList: [],
        scrollTop: 0,
    }
}

对传入数组进行分组和计算高度

async splitData() {
    if (!this.tempList.length) return;
    let leftRect = await this.$uGetRect('#u-left-column');
    let rightRect = await this.$uGetRect('#u-right-column');
    // 如果左边小于或等于右边,就添加到左边,否则添加到右边
    let item = this.tempList[0];
    // 解决多次快速上拉后,可能数据会乱的问题,因为经过上面的两个await节点查询阻塞一定时间,加上后面的定时器干扰
    // 数组可能变成[],导致此item值可能为undefined
    if (!item) return;
    if (leftRect.height < rightRect.height) {
        this.leftList.push(item);
    } else if (leftRect.height > rightRect.height) {
        this.rightList.push(item);
    } else {
        // 这里是为了保证第一和第二张添加时,左右都能有内容
        // 因为添加第一张,实际队列的高度可能还是0,这时需要根据队列元素长度判断下一个该放哪边
        if (this.leftList.length

3、完整的组件代码如下


    export default {
        name: "waterfall",
        props: {
            value: {
                // 瀑布流数据
                type: Array,
                required: true,
                default: function() {
                    return [];
                }
            },
            scrolltolower: {
                type: Function,
                default: () => {}
            }
        },
        data() {
            return {
                leftList: [],
                rightList: [],
                tempList: [],
                scrollTop: 0,
            }
        },
        watch: {
            copyFlowList(nVal, oVal) {
                this.tempList = this.cloneData(this.copyFlowList);
                this.splitData();
            }
        },
        mounted() {
            this.tempList = this.cloneData(this.copyFlowList);
            this.splitData();
            // this.$on('clearWaterFall', this.clear)
        },
        computed: {
            // 破坏flowList变量的引用,否则watch的结果新旧值是一样的
            copyFlowList() {
                return this.cloneData(this.value);
            }
        },
        methods: {
            async splitData() {
                if (!this.tempList.length) return;
                let leftRect = await this.$uGetRect('#u-left-column');
                let rightRect = await this.$uGetRect('#u-right-column');
                // 如果左边小于或等于右边,就添加到左边,否则添加到右边
                let item = this.tempList[0];
                // 解决多次快速上拉后,可能数据会乱的问题,因为经过上面的两个await节点查询阻塞一定时间,加上后面的定时器干扰
                // 数组可能变成[],导致此item值可能为undefined
                if (!item) return;
                if (leftRect.height < rightRect.height) {
                    this.leftList.push(item);
                } else if (leftRect.height > rightRect.height) {
                    this.rightList.push(item);
                } else {
                    // 这里是为了保证第一和第二张添加时,左右都能有内容
                    // 因为添加第一张,实际队列的高度可能还是0,这时需要根据队列元素长度判断下一个该放哪边
                    if (this.leftList.length <= this.rightList.length) {
                        this.leftList.push(item);
                    } else {
                        this.rightList.push(item);
                    }
                }
                // 移除临时列表的第一项
                this.tempList.splice(0, 1);
                // 如果临时数组还有数据,继续循环
                if (this.tempList.length) {
                    this.splitData();
                    return
                }
            },
            // 复制而不是引用对象和数组
            cloneData(data) {
                return JSON.parse(JSON.stringify(data));
            },
            tolower(e) {
                this.scrolltolower()
            },
            clear() {
                this.leftList = []
                this.rightList = []
            }
        }
    }

    @mixin vue-flex($direction: row) {
        /* #ifndef APP-NVUE */
        display: flex;
        flex-direction: $direction;
        /* #endif */
    }

    .scroll-y {
        height: 78vh;
        margin-top: 18px;
    }

    .u-waterfall {
        @include vue-flex;
        flex-direction: row;
        align-items: flex-start;
    }

    .u-column {
        @include vue-flex;
        flex: 1;
        flex-direction: column;
        height: auto;
        width: 45vw;
        word-break: break-all;
    }

3、简单使用

基于vue的语法进行使用,先进行导入和注册


import waterfall from '../../component/waterfall/index.vue'
export default {
    name: 'content',
    components: {
        waterfall
    }
}

因为组件是基于插槽的形式进行开发的,所以我们可以直接传入咱们的样式和标签


                        {{item.content}}

                        {{item.content}}

最终的效果就可以达到我们的目标了

微信小程序实战,基于vue2实现瀑布流

Original: https://www.cnblogs.com/yin-feng/p/16943018.html
Author: yin-feng
Title: 微信小程序实战,基于vue2实现瀑布流



相关阅读

Title: 开放信息抽取(OIE)系统(一)–概述

开放信息抽取(OIE)(一)——概述

开放信息抽取(OIE)是信息抽取的一种全新的范式,主要思想是减少人工参与,无监督地进行信息抽取,抽取那些实体、关系未定义地情形。
早期,10年代,即机器学习时代等,经典的开放信息抽取系统,一般是利用发展较为成熟、应用较为广泛的、通用的词性标注、依存句法、成分句法、语义角色标注等技术,抽取主谓宾等三元组。
到了20年代,主要是用到早期系统抽取的结果进行有监督的学习,来进行抽取,一般是比较大的语料库。

一、概述

1.1 开发域无/弱监督信息抽取

开放域无/弱监督信息抽取一般存在三种方式,即自助法(Bootstrap)、远程监督(Distant-Supervision)、开放信息抽取(OpenIE)等。
开放信息抽取使用通用NLP工具(词性、依存句法、语义角色、从句),可以在无监督的条件下从句子中抽取三元组,但是无法定义关系类别;
远程监督方法利用已有的大型通用知识图谱的三元组进行半监督学习。存在强假设一对实体体中只存在一种关系问题、语义漂移问题;

[En]

The remote supervision method uses the triples of the existing large-scale general knowledge graph for semi-supervised learning. There is a strong assumption that there is only one relation problem and semantic drift problem in a pair of entities.

自助法是把一种关系的少量实体对,作为种子,发现该关系的更多新实体对。存在语义漂移问题、迭代法查准率会不断降低。

[En]

The self-help method takes a small number of entity pairs of a relationship as seeds to find more new entity pairs of the relationship. There is a problem of semantic drift, and the accuracy of iterative method will continue to decrease.

二、信息抽取

2.1 定义

​ 信息抽取( IE,Information Extraction)是把文本里包含的信息进行结构化处理,变成表格一样的组织形式。输入信息抽取系统的是原始文本,输出的是固定格式的信息点。信息点从各种各样的文档中被抽取出来,然后以统一的形式集成在一起。这就是信息抽取的主要任务。信息以统一的形式集成在一起的好处是方便检查和比较。 信息抽取技术并不试图全面理解整篇文档,只是对文档中包含相关信息的部分进行分析。至于哪些信息是相关的,那将由系统设计时定下的领域范围而定。

​ 信息检索(IR)和信息抽取(IE)的区别:IR的目的是根用户的查询请求从文档库中找出相关的文档, 用户必须从找到的文档中翻阅自己所要的信息。就其目的而言,IR和IE的不同可表达如下:IR从文档库中检索相关的文档,而IE是从文档中取出相关信息点。这两种技术因此是互补的。若结合起来可以为文本处理提供强大的工具。

​ IR和IE不单在目的上不同,而且使用的技术路线也不同。部分原因是因为其目的差异,另外还因为它们的发展历史不同。多数IE的研究是从以规则为基础的计算语言学和自然语言处理技术发源的。而IR则更多地受到信息理论、概率理论和统计学的影响。

2.2 任务

  • 信息抽取中的信息通常指的是实体(entity)、关系(relation)和事件(event)等,也就是定义了以下任务:
  • 实体任务: 实体抽取、实体链指、实体消歧、属性抽取;
  • 关系任务:关系预测、三元组抽取、实体关系抽取;
  • 事件任务:事件抽取、触发词识别、事件类型分类、论元识别和角色分类。

2.3 应用

​ 由于能从自然语言中抽取出信息框架和用户感兴趣的事实信息,无论是在知识图谱、信息检索、问答系统,还是在情感分析、文本挖掘中,信息抽取都有广泛应用。

三. 开放信息抽取

​ 信息抽取(IE)是一种从非结构化或半结构化文本中提取结构化信息的技术。而开放信息抽取(OIE, Open Information Extraction)系统旨在以无监督的方式从非结构化文本中抽取不可见的关系及其参数。简而言之就是开放域信息抽取。在最简单的形式中,给定一个自然语言句子,它们以三元组的形式提取信息,包括主语(S)、关系(R)和宾语(O)。
​ 任务形式为: 输入句子, 输出三元组; 识别正确的边界。

3.1 开放信息抽取系统历史

​ 传统的信息抽取存在的限制是:在小型同质语料库上实现高精度、范围窄且预先指定的提取请求,而且需要人类的广泛参与标注与规则制定。下图不同时期开放信息抽取(OIE)的主要思想(main-feature):

微信小程序实战,基于vue2实现瀑布流
  • TEXTRUNNER: 本文介绍了开放信息抽取(OIE)-一种新的抽取范式,有助于从文本和文本中抽取关系的领域独立发现很容易扩展到Web语料库的多样性和大小。OIE系统的唯一输入是一个语料库及其输出是一组提取的关系。This paper introduces Open Information Extraction (OIE)—a novel extraction paradigm that facilitates domain-independent discovery of relations extracted from text and readily scales to the diversity and size of the Web corpus. The sole input to an OIE system is a corpus, and its output is a set of extracted relations.

  • REVERB: 开放信息抽取(OIE)是一项从大规模语料库中提取断言, 而不需要预先指定的词典的任务。Open Information Extraction (OIE) is the task of extracting assertions from massive corpora without requiring a pre-specified vocabulary.

  • ClausIE: 开放信息抽取(OIE)的目的是获取大量自然语言文本的浅层语义表示, 其形式是(verbs, verbal phrases, arguments), OIE目标的主要特点是:(1)域独立性,(2)无监督抽取,(3)对大量文本的可扩展性。Open information extraction (OIE) aims to obtain a shallow semantic representation of large amounts of natural language text in the form of verbs (or verbal phrases) and their arguments . The key goals of OIE are (1) domain independence, (2) unsupervised extraction, and (3) scalability to large amounts of text.

  • RnnOIE: 开放信息抽取系统的目标是 提取自然语言中 表示一个句子基本命题断言的 元组对.(Open Information Extraction (Open IE) systems extract tuples of natural language expressions that represent the basic propositions asserted by a sentence.

  • CopyAttention: 开放信息抽取(OIE)涉及在文本中生成信息的结构化表示,通常是三元组或N元组形式的任务。开放的IE系统不仅抽取实体,还能抽取关系而不依赖于预先定义的类型模式。Open Information Extraction (Open IE) involves generating a structured representation of information in text, usually in the form of triples or n-ary propositions. An Open IE system not only extracts arguments but also relation phrases from the given text, which does not rely on pre-defined ontology schema.

  • OPENIE6: 开放信息抽取(OIE)是一种无本体的信息抽取、抽取(主语; 关系; 宾语)范式。Open Information Extraction (OpenIE) is an ontology-free information extraction paradigm that generates extractions of the form (subject; relation; object).

; 3.2 开放信息抽取系统主要思想

​ Banko等人(2007年)第一次提出了开放信息抽取(OIE, Open Information Extraction)的概念,设计了Textrunner系统,该系统在IE方法所需的手动工作中引入了一种新的提取范式: 即openie不局限于一小部分已知的目标关系,而是提取文本中发现的所有类型的关系,也就是无监督抽取。此后Wu and Weld等(2010年)提出了WOE系统,Mausam等(2012年)提出了OLLIE系统,这些系统有一个通用的范式,即先抽取实体再抽取关系,实体抽取一般采用句子成分、词性标注、依存句法、自助法等方式;关系抽取则是依照一定的规则等构建训练集,训练好一个机器学习分类器进行关系预测,通常被称为第一代开放信息抽取系统。

​ 虽然第一代开放信息抽取系统开创了一个时代,取得了不错的效果,但是依旧存在比较严重的三个问题: 即大量非关键提取(即省略关键信息的提取)、非一致性提取(即关系短语没有有意义的解释)和冗余关系提取(传达了太多的信息), 这些问题给进一步的下游语义任务中使用造成了很大的困难。所以第二代开放信息抽取便呼之欲出了。

​ 第一代开放信息抽取系统抽取的关系词语可能没有可解释性的意义,即序列决策时存在误差;此外抽取忽略了关键性的信息,原因是没有处理好light verb constructions (LVCs, 动词和名词组成的多词谓语,并且名词携带了谓词的语义信息)。由此,Fader等(2011年)提出了REVERB系统,首先抽取动词的关系,然后再寻找名词性短语作为实体。这种基于关系构建规则的方法能达到很高的召回率,使用比较广泛。此后,Mausam等(2011, 2016年)提出的OPENIE4系统, 结合语义角色抽取SRL、名词性短语RELNOUN等两种思路, 至今仍然是应用最广泛的开放信息抽取系统。Likun Qiu等(2014年)提出了中文ZORE系统,即所谓的双重传播语义标注,基本思想是通过对候选关系中参数的首词进行语义标记来迭代地识别关系和实体。White等(2016年)提出了PredPatt系统,使用通用依赖(UD)解析规则、构建有向图、提取谓词参数结构,不受语言的限制支持不同语种。Yuen-Hsien Tseng等(2018年)提出了的中文CORE系统,认为不需要多余的处理,开放的源码实现为依靠语义角色标注和LTP依存句法。

​ 第二代开放信息抽取系统能够抽取到召回率很高的三元组,那么能不能抽取精确率更高的三元组呢,答案是可以的。那就是基于子句的第三代开放信息抽取系统(clause-based),这种系统的思路是引入一个句子重组阶段,将复杂句子转化为简单句,然后利用句子成分进行三元组的抽取。Del Corro and Gemulla等(2013年)提出了ClausIE系统,使用语法知识(句子重组)的方法转换复杂句子,语法和从句等分析句子成分。Angel等(2015年)提出了Stanford Open IE系统,使用学习分类器判断一组句子是否构成独立子句(简单句),然后通过手工构建的14种规则抽取三元组。Gashteovski等(2017年)提出了MinIE系统,构建在ClausIE系统之上,重点关注冗余项, 是不是可信。

​ 然后便进入了深度学习时代,提出了基于深度学习的第四代开放信息抽取系统。第四代开放信息抽取系统的思路主要是:1.未标注语料使用OPENIE4系统等构建高召回的训练集(自助法);2.使用1中获取到的数据集,抽取式或生成式的端到端深度学习。这一时期的主要论文如下图所示:

  • 2018
  • RnnOIE: Supervised Open Information Extraction
  • CopyAttention: Neural Open Information Extraction
  • 2019
  • SenseOIE: SupervisingUnsupervisedOpenInformationExtractionModels
  • 2020
  • SpanOIE(BiLSTM_span): Span Model for Open Information Extraction on Accurate Corpus
  • Multi2OIE(BERT+Classify+Attention): Multilingual Open Information Extraction based on Multi-Head Attention with BERT
  • IMoJIE(BERT+CopyAttention): Iterative Memory-Based Joint Open Information Extraction
  • OpenIE6(BERT+IGL(Attention+Label-encode))): Iterative Grid Labeling and Coordination Analysis for Open Information Extraction

五. 评估指标

微信小程序实战,基于vue2实现瀑布流
  • 测试集的评估指标不高,似乎达不到可用的效果,通常用如下指标评估:
    [En]

    the evaluation metrics of the test set are not high and do not seem to achieve the available results. They are usually evaluated by the following metrics:*

  • 抽取(# extractions)
  • 非冗余抽取(# non-redundant extractions)
  • 召回率(recall)
  • 事实精度, 即正确的(factual precision)
  • 归因精确度, 即有条件的(attribution precision)
  • 每个元组平均字数, 代表最小值(mean word count per triple (proxy for minimality))

; 六. 常见的错误类别

  • (1)错误的边界,其中关系短语或参数短语太长或太长太小;
  • (2)冗余抽取,抽取中断言的命题已经表达在另一个抽取中;
  • (3)非信息抽取,其中关键信息被省略;
  • (4)缺失提取,即假阴性,其中系统或参数未检测到关系、查找启发式选择错误参数或根本没有参数;
  • (5)错误提取,其中没有有意义的命题解释是可能的;
  • (6)范围外提取,其中一个系统产生了gold数据集的作者无法识别的正确提取。

论文与文章

  • oie-resources: https://github.com/gkiril/oie-resources
  • 信息抽取: KnowItAll 和TEXTRUNNER: https://zhuanlan.zhihu.com/p/144639801
  • Survey: https://www.aclweb.org/anthology/C18-1326/
  • TEXTRUNNER: https://www.aaai.org/Papers/IJCAI/2007/IJCAI07-429.pdf
  • WOE: https://www.aclweb.org/anthology/P10-1013.pdf
  • REVERB: https://www.aclweb.org/anthology/D11-1142
  • OPENIE4-SRL: http://ai.cs.washington.edu/www/media/papers/tmpSIpV1y.pdf
  • OPENIE4-RENOUN: https://www.aclweb.org/anthology/W16-1307.pdf
  • OLLIE: https://www.aclweb.org/anthology/D12-1048
  • ClausIE: http://telemedicina.unifesp.br/pub/Events/2013-05%20-%20WWW2013/www2013/www2013.org/proceedings/p355.pdf
  • ZORE: https://www.aclweb.org/anthology/D14-1201/
  • CORE: https://ai2-website.s3.amazonaws.com/publications/10094_Paper.pdf
  • stanford-openie: https://www.aclweb.org/anthology/P15-1034/
  • RnnOIE: https://www.aclweb.org/anthology/N18-1081.pdf
  • SpanOIE: https://arxiv.org/pdf/1901.10879.pdf
  • CopyAttentionOIE: https://arxiv.org/pdf/1805.04270.pdf
  • Seq2seqOIE: https://arxiv.org/pdf/1805.04270.pdf
  • Multi2OIE: https://arxiv.org/abs/2009.08128
  • IMoJIE: https://www.aclweb.org/anthology/2020.acl-main.521/
  • OpenIE6: https://arxiv.org/abs/2010.03147
  • Multi2OIE: https://arxiv.org/abs/2009.08128
  • IMoJIE: https://www.aclweb.org/anthology/2020.acl-main.521/
  • OpenIE6: https://arxiv.org/abs/2010.03147

Original: https://blog.csdn.net/rensihui/article/details/115435285
Author: Macropodus
Title: 开放信息抽取(OIE)系统(一)–概述

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/222807/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总