ai辅助,数据标注行业发展的新引擎丨曼孚科技(代码片段)

author author     2022-12-09     787

关键词:

(一)简介

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

(二)分类

创建Stream:通过stream()方法,取得集合对象的数据集。
中间操作(Intermediate):通过一系列中间方法,对数据集进行过滤、检索等数据集的再次处理。如,使用filter()方法来对数据集进行过滤。
终止操作(Terminal):通过最终方法完成对数据集中元素的处理。如,使用forEach()完成对过滤后元素的打印。

short-circuiting:对于一个 intermediate 操作,如果它接受的是一个无限大(infinite/unbounded)的 Stream,但返回一个有限的新 Stream;对于一个 terminal 操作,如果它接受的是一个无限大的 Stream,但能在有限的时间计算出结果;当操作一个无限大的 Stream,而又希望在有限时间内完成操作,则在管道内拥有一个 short-circuiting 操作是必要非充分条件。

操作 方法
Intermediate concat()、distinct()、filter()、flatMap()、map()、peek()、skip()、sorted()、parallel()、sequential()、unordered()、limit()
Terminal collect()、count()、forEach()、forEachOrdered()、max()、min()、reduce()、toArray()、allMatch()、anyMatch()、noneMatch()、findAny()、findFirst()、iterator()
Short-circuiting allMatch()、anyMatch()、noneMatch()、findAny()、findFirst()、limit()

(三)使用

1. 创建Stream

1.1 通过数组创建

1.1.1 of

生成的Stream是有限长度的,Stream的长度为其内的元素个数。

Stream<Integer> integerStream = Stream.of(1, 2, 3);
Stream<String> stringStream = Stream.of("a");

1.1.2 generator

返回一个无限长度的Stream,其元素由Supplier接口的提供。在Supplier是一个函数接口,只封装了一个get()方法,其用来返回任何泛型的值,该结果在不同的时间内,返回的可能相同也可能不相同,没有特殊的要求。

Stream<Double> streamA = Stream.generate(new Supplier<Double>() 
    @Override
    public Double get() 
        return java.lang.Math.random();
    
);
Stream<Double> streamB = Stream.generate(() -> java.lang.Math.random());
Stream<Double> streamC = Stream.generate(java.lang.Math::random);

1.1.3 iterate

返回的是一个无限长度的Stream,与generate方法不同的是,其是通过函数f迭代对给指定的元素种子而产生无限连续有序Stream,其中包含的元素可以认为是:seed,f(seed),f(f(seed))无限循环。

Stream<Integer> stream = Stream.iterate(1, item -> item + 1);

1.1.4 empty

返回一个空的顺序Stream,该Stream里面不包含元素项。

Stream<Object> empty = Stream.empty();

1.2 Collection接口和Arrays默认方法

1.2.1 Collection接口

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Stream<Integer> stream = list.stream();

1.2.2 Arrays

int[] arr = 1,2,3;
IntStream stream = Arrays.stream(arr);

2. Intermediate

对Stream做出相应转换及限制流,即将原Stream转换为一个新的Stream。

2.1 concat()

将两个Stream连接在一起,合成一个Stream。若两个输入的Stream都时排序的,则新Stream也是排序的;若输入的Stream中任何一个是并行的,则新的Stream也是并行的;若关闭新的Stream时,原两个输入的Stream都将执行关闭处理。

Stream<Integer> concat = Stream.concat(Stream.of(1, 2, 3), Stream.of(4, 5));

2.2 distinct()

去除掉原Stream中重复的元素,生成的新Stream中没有没有重复的元素。

Stream<Integer> distinct = Stream.of(1, 2, 3, 3, 4, 5, 4).distinct();

2.3 filter()

对原Stream按照指定条件过滤,在新建的Stream中,只包含满足条件的元素,将不满足条件的元素过滤掉。

Stream<Integer> stream = Stream.of(1, 2, 3, 3, 4, 5, 4).filter(item -> item <= 3);

2.4 map()

对于Stream中包含的元素使用给定的转换函数进行转换操作,新生成的Stream只包含转换生成的元素。

官方已封装好了,三种变形:mapToDouble,mapToInt,mapToLong。

Stream<String> streamA = Stream.of("a", "b", "c").map(item -> item.toUpperCase()); IntStream streamB = Stream.of("1", "2", "3").mapToInt(item -> Integer.valueOf(item));

2.5 flatMap()

接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流

String[] arr1 = "a", "b", "c", "d";
String[] arr2 = "e", "f", "c", "d";
String[] arr3 = "h", "j", "c", "d";
Stream.of(arr1, arr2, arr3).flatMap(Arrays::stream).forEach(System.out::println);

2.6 peek()

偷窥流内的数据

2.7 skip()

跳过前n个数据

String[] arr = "a", "b", "d", "c";
Arrays.stream(arr).skip(2).forEach(System.out::println);

2.8 sorted()

对流进行排序

String[] arr = "a", "b", "d", "c";
Arrays.stream(arr).sorted(Comparator.naturalOrder()).forEach(System.out::println);

3. Short-circuiting

3.1 allMatch()

是否所有元素匹配

String[] arr = new String[]"b", "ab", "abc", "abcd", "abcde";
Boolean aBoolean = Stream.of(arr).allMatch(x -> x.startsWith("a"));
System.out.println(aBoolean);

3.2 anyMatch()

是否含有匹配的元素

String[] arr = new String[]"b", "ab", "abc", "abcd", "abcde";
Boolean aBoolean = Stream.of(arr).anyMatch(x -> x.startsWith("a"));
System.out.println(aBoolean);

3.3 noneMatch()

是否没有匹配的元素

String[] arr = new String[]"b", "ab", "abc", "abcd", "abcde";
Boolean aBoolean = Stream.of(arr).noneMatch(x -> x.startsWith("a"));
System.out.println(aBoolean);

3.4 findAny()

查找满足条件的元素,只要发现第一个匹配的就会直接结束整个运算,适用并行流

String[] arr = new String[]"b", "ab", "abc", "abcd", "abcde";
Optional<String> optional = Stream.of(arr).parallel().filter(x -> x.length() > 3).findAny();
optional.ifPresent(System.out::println);

3.5 findFirst()

查找第一个

String[] arr = new String[]"b", "ab", "abc", "abcd", "abcde";
String str = Stream.of(arr).parallel().filter(x -> x.length() > 3).findFirst().orElse("noghing");

3.6 limit()

限制从流中获得前n个数据

String[] arr = "a", "b", "d", "c";
Arrays.stream(arr).limit(2).forEach(System.out::println);

4. Terminal

4.1 collect()

收集结果

String[] arr = new String[]"b", "ab", "abc", "abcd", "abcde";
//长度大于3的转为list
List<String> list = Stream.of(arr).filter(x -> x.length() > 3).collect(toList());
list.forEach(System.out::println);
//长度大于3的转为list
Set<String> set = Stream.of(arr).filter(x -> x.length() > 3).collect(toSet());
set.forEach(System.out::println);
//学生类的name为key,score为value,如果key相同对value求和存入
Map<String, Integer> map = Arrays.stream(students).collect(toMap(Student::getName, Student::getScore, (s, a) -> s + a));
map.forEach((x, y) -> System.out.println(x + "->" + y));
//生成指定类型
String[] arr = new String[]"b", "ab", "abc", "abcd", "abcde";
HashSet<String> s = Arrays.stream(arr).collect(toCollection(HashSet::new));
s.forEach(System.out::println);

//按name进行分类
Map<String, List<Student>> map = Arrays.stream(students).collect(groupingBy(Student::getName));
map.forEach((x, y) -> System.out.println(x + "->" + y));
//按成绩是否大于50分成两类,key为Boolean
Map<Boolean, List<Student>> map = Arrays.stream(students).collect(partitioningBy(x -> x.getScore() > 50));
map.forEach((x, y) -> System.out.println(x + "->" + y));

4.2 count()

统计数量

String[] arr = "a", "b", "d", "c";
System.out.println(Stream.of(arr).count());

4.3 forEach()

对流中的每个元素都执行操作

String[] arr = "a", "b", "c", "d";
Arrays.stream(arr).forEach(System.out::println);//abcd
Arrays.stream(arr).parallel().forEach(System.out::println);//cdab

4.4 forEachOrdered()

对流中的每个元素都执行操作,按照顺序进行

String[] arr = "a", "b", "c", "d";
Arrays.stream(arr).forEachOrdered(System.out::println);//abcd
Arrays.stream(arr).parallel().forEachOrdered(System.out::println);//abcd

4.5 max()

获取最大值

String[] arr = "b","ab","abc","abcd","abcde";
Stream.of(arr).max(Comparator.comparing(String::length)).ifPresent(System.out::println);

4.6 min()

获取最小值

String[] arr = "b","ab","abc","abcd","abcde";
Stream.of(arr).min(Comparator.comparing(String::length)).ifPresent(System.out::println);

4.7 reduce()

根据指定的计算模型将Stream中的值计算得到一个最终结果

Optional<Integer> optional = Stream.of(1, 2, 3).reduce((x, y) -> x + y);
System.out.println(optional.get());

4.7 toArray()

生成数组

String[] arr = new String[]"b", "ab", "abc", "abcd", "abcde";
String[] strings = Stream.of(arr).filter(x -> x.length() > 3).toArray(String[]::new);
System.out.println(Arrays.toString(strings));

http://cnblogs.com/andywithu/p/7404101.html







算法应用的三大阶段,对数据标注行业的差异化需求丨曼孚科技

算法、算力与数据是人工智能发展的三大基本要素。其中数据是基础,为算法提供了底层支撑。如果将算法比作一辆汽车,那么数据就是推动汽车前进的“燃料”。目前,企业应用人工智能算法要经历研发、训练和落地三... 查看详情

数据安全,安防数据标注行业的核心命脉丨曼孚科技

...用提供了实质性的参考。然而,与其他行业更注重模型与数据质量不同,智能安防领域更加注重数据的安全性,尤其是标注数据的安全性。作为人工智能行业的基础,数据标注行业为AI场景化落地提供了海量的标注数据集,表现... 查看详情

数据安全,安防数据标注行业的核心命脉丨曼孚科技

...用提供了实质性的参考。然而,与其他行业更注重模型与数据质量不同,智能安防领域更加注重数据的安全性,尤其是标注数据的安全性。作为人工智能行业的基础,数据标注行业为AI场景化落地提供了海量的标注数据集,表现... 查看详情

人工智能数据标注这些年:从幕后到前台丨曼孚科技

...吗?”?10个人中可能有9个人会给出肯定的回答。“你了解数据标注行业吗?”10个人中可能有9个人会茫然地摇头。与处在聚光灯中心的人工智能科技公司不同,数据标注行业长期处于聚光灯之外的灰色地带,很长一段时间内都是被... 查看详情

数据标注行业的主流发展趋势及面临的挑战丨曼孚科技

...,更具前瞻性的数据集产品和高度定制化数据服务成为了行业发展的主流。未来几年,数据标注行业将有如下发展趋势以及挑战。1.趋势:行业洗牌,竞争加剧数据标注行业历经多年发展,目前已进入一个快速增长期。相关统计... 查看详情

数据标注行业的主流发展趋势及面临的挑战丨曼孚科技

...,更具前瞻性的数据集产品和高度定制化数据服务成为了行业发展的主流。未来几年,数据标注行业将有如下发展趋势以及挑战。1.趋势:行业洗牌,竞争加剧数据标注行业历经多年发展,目前已进入一个快速增长期。相关统计... 查看详情

自建数据标注团队,品牌数据服务商的下一个战略高地丨曼孚科技

随着AI商业化进程的加快,更具前瞻性的海量数据集产品和高度定制化服务成为了AI基础数据服务行业的主要服务形式。这对数据服务供应商的数据交付能力提出了新的要求。目前,数据标注行业主流的业务进行方式主要有三种... 查看详情

破局ai落地难,数据标注行业需率先变革丨曼孚科技

...种因素导致了这种结果。在人工智能领域,算法、算力与数据是构成行业 查看详情

标注案例分享:道路病害图片数据标注项目丨曼孚科技

无论是水泥路面还是沥青路面,在通车使用一段时间之后,都会出现各种损坏、变形及其它缺陷,这些统称为道路病害。常见的病害类型有:龟裂、坑槽、车辙、松散、沉陷、桥头涵顶跳车、表面破损等等,这些道路病害的存在... 查看详情

标注案例分享:道路病害图片数据标注项目丨曼孚科技

无论是水泥路面还是沥青路面,在通车使用一段时间之后,都会出现各种损坏、变形及其它缺陷,这些统称为道路病害。常见的病害类型有:龟裂、坑槽、车辙、松散、沉陷、桥头涵顶跳车、表面破损等等,这些道路病害的存在... 查看详情

数据标注案例分享:搜索结果相关性匹配标注项目丨曼孚科技

?搜索结果相关性匹配标注有助于优化搜索模型,更好地匹配用户需求。以下内容节选于某搜索结果相关性匹配标注项目。一.标注需求说明阅读资讯内容并随意进行提问,页面会反馈答案内容,需要对答案内容进行标注评分。总... 查看详情

数据标注案例分享:搜索结果相关性匹配标注项目丨曼孚科技

?搜索结果相关性匹配标注有助于优化搜索模型,更好地匹配用户需求。以下内容节选于某搜索结果相关性匹配标注项目。一.标注需求说明阅读资讯内容并随意进行提问,页面会反馈答案内容,需要对答案内容进行标注评分。总... 查看详情

破局自动驾驶落地难,数据标注行业变革是关键丨曼孚科技

...在这种情况下,经过人工标注的带有丰富语义信息的标注数据,可以使算法更好地理解和识别视觉摄像头、激光雷达、毫米波雷达等传感器所传输的画面信息和障碍物信息,全面提升自动驾驶汽车的感知能力。自动驾驶标注场景... 查看详情

报告:中美ai产业对比与行业发展趋势洞察丨曼孚科技

?人工智能(AI)作为全球科技和产业变革的关键驱动力,依靠强大的技术积累与创新,正进一步释放巨大能量。在各国政策的支持引导下,以大型人工智能厂商为主导,人工智能持续与各种应用场景深度融合,催生出了大量的新技... 查看详情

文本标注案例:细粒度情绪多分类标注丨曼孚科技

...分为3大类,11中类,26小类:2.标注说明针对一段短对话数据,判断每句话中说话者当时的情绪,并判断该句话是否包含26小类的情绪,如果包含则标注该情绪标签为1,反之为0。3.标注范例对话内容:A:菲利普,听说你获奖我真... 查看详情

数据标注案例分享:车辆前置摄像头数据采集标注项目丨曼孚科技

...对复杂多变的路况环境,感知技术的突破需要依赖相应的数据采集标注项目的支持。一.项目背景车辆前置道路信息采集主要解决两个个关键需求:障碍物的距离信息;2.相对速度向量。通过对障碍物的连续追踪,根据距离的变化... 查看详情

数据标注案例分享:车辆前置摄像头数据采集标注项目丨曼孚科技

...对复杂多变的路况环境,感知技术的突破需要依赖相应的数据采集标注项目的支持。一.项目背景车辆前置道路信息采集主要解决两个个关键需求:1.障碍物的距离信息;2.相对速度向量。通过对障碍物的连续追踪,根据距离的变化... 查看详情

数据标注有发展前景吗?

...落地,解决行业具体痛点,需要大量经过标注处理的相关数据做算法训练支撑,可以说数据决定了AI的落地程度。目前,我国人工智能行业呈现良好的发展态势,而作为强关联性的数据标注行业,随人工智能发展而迎来高速增长... 查看详情