算法 自动采集列表

算法 自动采集列表

解决方案:垃圾回收算法以及常见垃圾收集器简介

采集交流优采云 发表了文章 • 0 个评论 • 39 次浏览 • 2022-11-26 03:24 • 来自相关话题

  解决方案:垃圾回收算法以及常见垃圾收集器简介
  垃圾采集
算法及常见垃圾采集
器介绍
  文章目录
  前言
  比如:作为一个java程序员,JVM会帮你进行垃圾回收,那么JVM是怎么回收的呢?常见的垃圾回收算法和垃圾回收器有哪些?它们是如何工作的?
  1. 垃圾采集
算法 1.1 分代采集
理论
  根据年轻代或老年代的不同,选择不同的垃圾回收算法。年轻代一般采用复制算法,老年代一般采用标记清除算法或标记排序算法。
  1.2 标记-复制算法
  内存排序前:首先将内存分为used(保留内存)和unused(可用内存、可回收内存、存活对象(通过gc根可达性算法判断哪些对象存活))两部分,(从eden从park到幸存者区);
  内存排序后:将已使用(保留内存)和未使用(可用内存、可回收内存、存活对象)复制交换,回收未使用的可回收内存;
  缺点:每次内存回收回收一半内存空间,浪费空间。年轻代使用复制算法,老年代不使用复制算法。
  1.3 标记-扫描算法
  标记存活的对象,清除未标记(not alive)的对象。
  缺点: 1.效率问题,如果标记的对象太多,效率不高;2、空间问题,标记清除后会产生大量不连续的碎片(内存空间);
  1.4 标记整理算法
  标记存活对象,让存活对象移动到可回收对象(不清除垃圾对象,直接将非垃圾对象移动到垃圾对象,就像赋值一样),如果可回收对象中没有存活对象,然后直接清除它们可回收对象;(write barrier模式同步修改内存地址)
  2.垃圾采集

  如果说回收算法是内存回收的方法论,那么垃圾回收器就是内存回收的具体实现。
  常见的垃圾采集
器有Seri​​al、ParNew、Parallel、CMS、Serial Old、Parallel Old、G1、ZGC。
  为什么有这么多垃圾采集
器?因为目前还没有任何场景都可以使用的采集
器,所以我们要根据具体的场景选择适合自己的垃圾采集
器。
  2.1 串行采集

  串行(serial)采集
器是最基本也是最古老的垃圾采集
器。它是一个单线程垃圾采集
器,在垃圾采集
期间暂停所有其他工作线程(“Stop The World”或简称 STW)。新生代采用复制算法,老年代采用标记-排序算法。可以回收的内存区域在几十兆到几百兆之间,不是很大,也不再使用了。使用参数 -XX:+UseSerialGC -XX:+UseSerialOldGC
  缺点:效率低,会给STW中的用户带来不好的用户体验;
  优点:简单高效(相对于其他单线程采集
器);
  Serial Old采集
器是Serial采集
器的老版本,也是单线程采集
器。它主要有两个用途:一是在JDK1.5及更早版本中与Parallel Scavenge采集
器配合使用,二是作为CMS采集
器的备份方案。
  2.2 并行清扫采集

  并行采集
器实际上是串行采集
器的多线程版本。除了使用多线程进行垃圾采集
外,其余行为(控制参数、采集
算法、回收策略等)与Serial采集
器类似。默认采集
线程数与 CPU 核心数相同。当然采集
线程数也可以通过参数(-XX:ParallelGCThreads)指定,但一般不建议修改。Parallel Scavenge采集
器侧重于吞吐量(CPU的高效利用),其STW时间比较长,用户体验不好。CMS等垃圾采集
器的关注点更多的是用户线程的停顿时间(提升用户体验)。所谓吞吐量就是CPU中运行用户代码所花费的时间与CPU总消耗时间的比值。新生代采用复制算法,老年代采用标记-排序算法。使用参数-XX:+UseParallelGC(年轻代),-XX:+UseParallelOldGC(老年代)
  Parallel Old 采集
器是 Parallel Scavenge 采集
器的老年代版本。使用多线程和“标记和排序”算法。在注重吞吐量和CPU资源的情况下,Parallel Scavenge采集
器和Parallel Old采集
器(JDK8默认的新生代和老年代采集
器),Parallel采集
器和CMS(老年代才有)采集
器可以优先使用 没有一起使用它的方法。
  2.3 ParNew采集

  ParNew采集
器其实和Paralle采集
器非常相似(ParNew用于新生代),区别(ParNew+CMS)主要是可以和CMS(用于老年代)采集
器结合使用。新生代采用复制算法,老年代采用标记-排序算法。使用参数-XX:+UseParNewGC。
  2.4 CMS 采集

  CMS(Concurrent Mark Sweep)采集
器是一种以获取最短恢复停顿时间为目标的采集
器,非常注重用户体验。
  操作过程大致如下:
  2.4.1 初始标记
  挂起所有其他线程(STW,如果没有STW机制,初始标记阶段会产生连续的对象,无法完成初始标记),记录gc roots可以直接引用的对象,以及速度很快;
  2.4.2 并发标记
  无需停止应用程序线程。应用线程和CMS线程同时运行,可能导致被标记对象的状态发生变化;(如果内存变大,整个堆内存会变大,标记时间也会变长,STW时间也会变长,用户体验不好。)缺少标签(下面会有解决方法)。
  2.4.3 重新贴标签
  它还会STW,重新标记那些在并发标记中状态发生变化的对象;(三色标增量更新)
  2.4.4 并发清理
  没有被标记的对象(垃圾对象)被清除,应用线程和CMS线程同时运行(因为应用线程也在运行,会产生新的对象,如果这些引用会被标记为黑色)它们没有被标记,黑色不会被扫描后变成浮动垃圾,在下一轮被清理(三色标记))。
  2.4.5 并发复位
  清理上面步骤标记的对象,方便下次重新标记。
  如果ParNew采集
器的执行时间为1s,那么CMS采集
器的执行时间就会大于1s。为什么?因为CMS采集
器在执行过程中会分配一部分资源(CPU)给应用线程执行,但是没有STW(用户在初始标记和重新标记时会感觉到STW),用户几乎没有感觉等了很久。
  CMS采集
器的优点:并发采集
、低暂停。
  CMS采集
器的缺点:
  (1). 会和CPU竞争资源(应用线程和CMS线程会同时运行);
  (2). 浮动垃圾(并发标记和并发清理时会产生新的垃圾,只能被下一次gc处理);
  (3). 使用mark-clear算法会产生大量的空间碎片,但是JVM可以通过XX:+UseCMSCompactAtFull采集
参数让jvm清除mark然后整理;
  (4). 在并发标记和并发清理的过程中,会出现同时回收和运行的情况。可能在回收完成之前会再次触发full gc(垃圾会在上次垃圾回收完成之前再次触发),是并发失败(concurrent mode failure),会stop the world,使用Serial old collector来回收。
  2.4.6 CMS相关核心参数
  1.-XX:+UseConcMarkSweepGC:启用cms;
  2. -XX:ConcGCThreads:并发GC线程数;
  3. -XX:+UseCMSCompactAtFull采集
: FullGC后做压缩(减少碎片);
  4. -XX:CMSFullGCsBeforeCompaction:FullGC后压缩多少次,默认0,表示每次FullGC后压缩;
  5. -XX:CMSInitiatingOccupancyFraction:当老年代的使用率达到这个比例(默认是92,是一个百分比)的时候会触发FullGC;
  6、-XX:+UseCMSInitiatingOccupancyOnly:只使用设置的恢复阈值(-XX:CMSInitiatingOccupancyFraction设置的值),如果不指定,JVM只会在第一次使用设置的值,之后会自动调整;
  7. -XX:+CMSScavengeBeforeRemark:在CMS GC之前启动一次minor gc,目的是减少老年代对新生代的引用,减少CMS GC标记阶段的开销。一般CMS 80%的GC时间都在标记阶段;
  
  8、-XX:+CMSParallellnitialMarkEnabled:表示初始标记时多线程执行,缩短STW;
  9、-XX:+CMSParallelRemarkEnabled:remarking时多线程执行,缩短STW;
  2.5 G1 垃圾采集
器 2.5.1 G1 垃圾采集
器简介
  在 JDK9 中,默认的垃圾采集
器变成了 G1。在 JDK9 中,CMS 仍然可以使用,但不推荐使用。在JDK8中,也可以使用G1,但不推荐。G1采集
器(-XX:+UseG1GC),G1(Garbage-First)是面向服务器的垃圾采集
器,主要针对配备多处理器和大容量内存的机器,同时具有高吞吐量的特点。
  G1将java堆内存划分为大小相等的独立区域(Regions),JVM最多可以有2048个Region。如果一个内存是4G(4096M),那么每个Region平均就是2M。当然也可以通过参数“-XX:G1HeapRegionSize”手动指定Region大小,但建议使用默认的计算方式。
  G1保留了新生代和老年代的概念,但不再是物理隔离。它们都是(可以是不连续的)Region 集合。比如一个Region之前可能是新生代,如果Region被垃圾回收了,后面可能又变了。变成了晚年。
  默认情况下,新生代占堆内存的5%。如果heap size为4096M,那么young generation大约占用200MB内存,对应100个Region左右。可以通过“-XX:G1NewSizePercent”设置新生代的初始比例。在系统运行的过程中,JVM会不断的给年轻代增加Region,但是年轻代的最大比例不会超过60%,可以通过“-XX:G1MaxNewSizePercent”来调整。年轻代中Eden和Survivor对应的region也和之前一样。默认值为 8:1:1。假设新生代有1000个region,eden区有800个,s0有100个,s1有100个。
  G1和其他垃圾采集
器的区别在于对大对象的处理。G1有一个Region叫做Humongous区,专门用来分配大对象,而不是直接进入老年代。在G1中,如果一个大对象超过了Region的50%,就会被放到Humongous区域。如果一个对象的内存是1.5M,就直接放到Humongous里面。如果一个对象的内存是6M,那么它会被放置在三个连续的Humongous区。
  2.5.2 G1采集器运行过程
  初始标记:挂起所有其他线程,记录gc roots直接引用的对象,非常快(STW);
  并发标记:同CMS并发标记;
  Final markup: remark with CMS (will STW);
  Filter recovery(类似于CMS并发清理,只是STW):根据用户预期的GC暂停STW时间指定回收(可以通过JVM参数指定:-XX:MaxGCPauseMills),比如old generation中1000个region满了,但是因为按照预期的停顿时间,这次恢复可能是200毫秒(如果没有设置参数-XX:MaxGCPauseMills,默认是200ms),通过计算可知,恢复800的可能只需要200毫秒regions,所以会回收800个region(采集
Set,待回收的采集
),剩下的200个region会在下次垃圾回收时回收,尽量把GC停顿时间控制在我们设定的时间范围内。不管是年轻一代还是老一代,回收算法主要使用复制算法(G1整体上是一种标记算法),将一个区域中存活的对象复制到另一个区域中,不会像CMS那样被回收 因为有很多内存碎片需要回收整理一次,G1使用复制算法回收几乎没有内存碎片。G1 采集
器在后台维护一个优先级列表。每次根据允许回收时间,优先回收价值最高的区域。比如一个region可以在200ms回收10M垃圾,另一个region可以在50ms回收10M垃圾。在有限的情况下,G1当然会优先回收后面的区域。不会像CMS那样被回收 因为有很多内存碎片需要整理一次,所以G1使用复制算法回收几乎没有内存碎片。G1 采集
器在后台维护一个优先级列表。每次根据允许回收时间,优先回收价值最高的区域。比如一个region可以在200ms回收10M垃圾,另一个region可以在50ms回收10M垃圾。在有限的情况下,G1当然会优先回收后面的区域。不会像CMS那样被回收 因为有很多内存碎片需要整理一次,所以G1使用复制算法回收几乎没有内存碎片。G1 采集
器在后台维护一个优先级列表。每次根据允许回收时间,优先回收价值最高的区域。比如一个region可以在200ms回收10M垃圾,另一个region可以在50ms回收10M垃圾。在有限的情况下,G1当然会优先回收后面的区域。优先考虑回收价值最高的地区。比如一个region可以在200ms回收10M垃圾,另一个region可以在50ms回收10M垃圾。在有限的情况下,G1当然会优先回收后面的区域。优先考虑回收价值最高的地区。比如一个region可以在200ms回收10M垃圾,另一个region可以在50ms回收10M垃圾。在有限的情况下,G1当然会优先回收后面的区域。
  2.5.3 G1采集器特点
  并行和并发:G1可以充分利用CPU和多核环境的硬件优势,使用多个CPU(CPU或CPU核心)来缩短Stop-The-World暂停时间。其他一些采集
器原本需要停止Java线程执行GC动作,但G1采集
器仍然可以让Java程序继续并发执行。
  分代采集
:虽然G1可以独立管理整个GC堆而不需要其他采集
器的配合,但是它仍然保留了分代的概念。
  空间整合:与CMS的“mark-clean”算法不同,G1是一个整体基于“mark-sort”算法的采集
器;它是在本地基于“复制”算法实现的。
  可预测的暂停:这是 G1 相对于 CMS 的另一大优势。减少暂停时间是 G1 和 CMS 共同关心的问题。不过,除了追求低停顿之外,G1 还可以建立一个可预测的停顿时间模型,允许用户或明确指定在 M 毫秒的时间段内完成垃圾采集
(由参数“-XX:MaxGCPauseMillis”指定) .
  毫无疑问,能够由用户指定预期的停顿时间是G1采集
器非常强大的功能。设置不同的预期停顿时间可以让G1在不同的应用场景下,在关注吞吐量和关注延迟之间取得最佳平衡。不过,这里设定的“期望值”一定要切合实际,不能异想天开。毕竟G1是冻结用户线程复制对象,停顿时间再低也得有个限度。它的默认暂停目标是 200 毫秒。一般来说,回收阶段占用几十到一百甚至接近200毫秒是正常的,但是如果我们把暂停时间调整到一个很低的值,比如设置为20毫秒,最有可能的结果是因为暂停目标时间太短,每次选择的采集
集合只占用堆内存的一小部分,采集
器的采集
速度逐渐跟不上分配器的分配速度,导致垃圾堆积。采集
器很可能一开始可以从空闲堆内存中获得一些喘息时间,但是应用程序运行时间长了就不行了,最终堆满会导致Full GC降低性能,所以预期的停顿时间通常设置为一两百毫秒或者两三百毫秒会比较合理。
  2.5.4 G1垃圾采集
分类
  YoungGC:YoungGC并不是说当现有的Eden区满了就立即触发。当G1触发YoungGC时,会判断触发时间是否接近设定的时间(默认为200ms)。如果没有关闭,则不会立即触发。YoungGC会不断的给Eden区增加空间(默认是5%,最大不会超过60%),只有在关闭的时候才会触发YoungGC。
  MixedGC:当老年代占用堆内存的比例达到45%时(可以通过参数-XX:InitiatingHeapOccupancyPercent设置),触发MixedGC,回收所有Young和部分Old(决定垃圾回收的优先级)按照预期的GC停顿时间顺序在old区)和大对象区(Humongous area)。(MixedGC会回收 G1的Humongous区)
  FullGC:在做复制算法的过程中(对内存空间要求比较高),需要将每个region中存活的对象复制到其他region中。如果在复制过程中发现没有足够的空区域来承载复制的对象,则会失败。触发Full GC,触发Full GC会停止系统程序,然后使用单线程进行标记、清理、压缩,为下一次MixedGC腾出一批region。这个过程非常耗时。
  2.5.5 G1采集器参数配置
  -XX:+UseG1GC:使用G1采集
器;
  -XX:ParallelGCThreads:指定GC工作的线程数;
  -XX:G1HeapRegionSize:指定分区大小(1MB~32MB,且必须是2的N次方),默认整个堆分为2048个分区
  -XX:MaxGCPauseMillis:目标暂停时间(默认200ms);
  -XX:G1NewSizePercent:新生代内存的初始空间(默认为整个堆的5%);
  -XX:G1MaxNewSizePercent:新生代的最大内存空间;
  -XX:TargetSurvivorRatio:Survivor区域的填充容量(默认50%)。Survivor区的一组物体(年龄1+年龄2+年龄n多个年龄的物体)总和超过Survivor区的50%。此时,年龄为n(含)及以上的对象将被放入老年代;
  -XX:MaxTenuringThreshold:最大年龄阈值(默认15);
  -XX:InitiatingHeapOccupancyPercent:老年代占用的空间达到整个堆内存的阈值(默认45%),则进行新生代和老年代的混合采集
(MixedGC)。比如我们前面提到的heap,默认有2048个region。如果有接近1000个region,每个region都是老年代region,可能会触发MixedGC;
  -XX:G1MixedGCLiveThresholdPercent (default 85%) 当区域中的存活对象低于该值时,该区域将被回收。如果这个值超过这个值,说明存活对象太多,回收意义不大;
  -XX:G1MixedGCCountTarget:指定一次回收过程中筛选回收的次数(默认8次)。在最后的筛选回收阶段,可以先回收一段时间,然后暂停回收,恢复系统运行,稍后再开始回收,这样就不会让系统单次停太久;
  -XX:G1HeapWastePercent (default 5%):gc过程中腾出的region是否足够阈值。混合回收时,region回收是基于复制算法,将待回收region中存活的对象放到Other Region中,然后清理掉本Region中的所有垃圾对象,从而不断清空新的Region在回收过程中。一旦free Region数量达到堆内存的5%,混合回收就会立即停止,也就是说本次混合回收结束。
  2.5.6 G1采集
器使用场景
  超过 1.50% 的堆被存活的对象占用;
  2、对象分配和提升的速度差异很大;
  3、垃圾回收时间极长,超过1秒;
  堆内存大于4.8GB(推荐值);
  5、停顿时间在500ms以内;
  2.7 ZGC采集
器 2.7.1 ZGC简介
  ZGC是JDK11中新加入的实验性低延迟垃圾采集
器。ZGC可以说是源自Azul System开发的C4(Concurrent Continuously Compacting Collector)采集
器。
  2.7.2 ZGC目标
  1.支持TB级堆;
  2、最大GC停顿时间不超过10ms;
  3.为以后的GC特性打下基础;
  4、最坏情况下,吞吐量会降低15%;
  无分代(临时):我们都知道上一代垃圾采集
器是基于“大多数对象有生有死”的假设。事实上,大多数系统的对象分配行为确实符合这个假设。那为什么ZGC不分代呢?由于分代实现比较麻烦,笔者先实现了一个比较简单好用的单代版本,后期会优化。
  2.7.3 ZGC内存布局
  ZGC采集
器基于Region内存布局,暂不设置分代,使用read barriers、color pointers等技术实现并发mark-sort算法,是一款以低延迟为首要目标的垃圾采集
器. 设备。
  ZGC的Region可以有三种容量,如图3-19所示:大、中、小:
  Small Region(小区域):容量固定为2MB,用于放置小于256KB的小对象。
  Medium Region(中型区域):容量固定为32MB,用于放置大于等于256KB但小于4MB的对象。
  Large Region(大区域):容量不固定,可以动态变化,但必须是2MB的整数倍,用于放置4MB以上的大对象。每个large region只会存储一个large object,这也说明虽然名字叫“large region”,但实际容量可能比medium region要小,最小容量可以低至4MB。Large Region在ZGC的实现中不会进行重分布(重分布是ZGC的一个处理动作,用于采集
器阶段的对象复制,后面会介绍),因为复制大对象的成本非常高。
  2.7.4 彩色指针
  前一个垃圾采集
器的GC信息保存在对象头中,而ZGC垃圾采集
器的GC信息保存在指针中。
  
  每个对象都有一个64位的指针,这64位分为:
  18 位:保留以备后用;
  1位:Finalizable标志位,这个位与并发引用处理有关,表示这个对象只能通过finalizer访问;
  1位:Remapped flag,设置该位的值后,对象不指向relocation set(relocation set表示需要GC
  区域集合);
  1位:Marked1标识;
  1位:Marked0标识,上面的Marked1都是辅助GC的标记对象;
  42位:对象的地址(所以可以支持2^42=4T内存):
  为什么有2个标记标记?
  在每个 GC 周期的开始,使用过的标记位被交换,使在前一个 GC 周期中更正的标记状态无效,并且所有引用都变为未标记。
  GC循环1:使用mark0,循环结束时所有引用标记都会变成01。
  GC循环2:使用mark1,那么期望的mark标记为10,所有的引用都可以remark。
  通过配置ZGC后对对象指针的分析,可以看出对象指针必须是64位的,那么ZGC就不能支持32位的操作系统,同样不能支持压缩指针(CompressedOops,压缩指针也是32位的)
  彩色指针的三大优势:
  1、一旦一个Region的存活对象被remove,这个Region就可以立即被释放并重新使用,而不需要等到整个堆中对该Region的所有引用都被纠正之后才能被清理掉。如果有空闲的Region,ZGC可以完成采集

  2. 颜色指针可以大大减少垃圾回收时使用的内存屏障的数量。ZGC 只使用读屏障。
  3、颜色指针可扩展性强。它可以作为一个可扩展的存储结构来记录更多与对象标记和重定位过程相关的数据,以便在未来进一步提高性能。
  2.7.5 读屏障
  在并发重分配的过程中,ZGC通过复制算法将原来的region(里面的对象)移动到另一个region,需要更新新的地址。什么时候更新?这个过程是一个懒惰的过程,它不会一直更新。当我从堆中获取旧对象值时,我得到了一个引用。此引用的颜色指针在进行并发标记时更改了颜色。在旧的引用过程中,颜色指针部分也被接管了。取的时候会加一个read barrier,判断指针是否被修改。如果它已被修改,它将在内部将旧引用移动到已使用的更新地址。转发表记录了旧对象到新对象的转发关系。
  2.7.6 ZGC问题及解决方案
  ZGC最大的问题是漂浮垃圾。ZGC的停顿时间在10ms以下,但是ZGC的执行时间还是比这个时间长了很多。如果ZGC的整个过程需要执行10分钟,这期间由于对象分配率高,会产生大量的新对象。这些对象很难进入本次GC,只能在下一次GC中回收。这些对象只能等到下一次GC才能回收的对象是浮动垃圾。
  解决方案
  目前唯一的办法就是增加堆的容量,让程序获得更多的喘息时间,但这也是治标不治本。如果要从根本上解决这个问题,还是需要引入分代采集
,让新的对象都在一个专门的区域创建。
  2.7.7 ZGC参数设置
  启用ZGC比较简单,设置JVM参数即可:-XX:+UnlockExperimentalVMOptions "-XX:+UseZGC"。调优并不难,因为ZGC的调优参数不多,远没有CMS复杂。和G1一样,可以调优的参数比较少,大部分工作都可以由JVM自动完成。ZGC可以调优的参数如下图:
  3. 垃圾回收底层算法实现 3.1 三色标记
  在gc过程或者并发标记过程中,主要有三种颜色
  黑色:表示对该对象的所有引用都已被垃圾采集
器扫描过,是一个活的(非垃圾)对象;
  灰色:表示这个对象至少有一个引用没有被垃圾采集
器扫描过;
  白色:表示这个对象还没有被垃圾采集
器访问过(没有对象被gc root引用,对象不可达);
  3.2 多标签漂浮垃圾
  因为应用线程没有停止(执行栈线程,没有STW机制,即栈线程中局部变量表、操作数栈、动态链接、方法出口的指针不指向堆内存),会有多标签(非垃圾对象被标记为垃圾对象),多标签(浮动垃圾)会在下次垃圾回收时被清除。
  3.3 缺失标签——读写障碍
  缺失标记:A->D,开头后面没有加法,B->D,开头后面有去掉。A不会被重新扫描,B重新扫描后也无法扫描D;D(以后会删除)会漏掉(阿里巴巴可能会问),D不是垃圾对象,会被标记为垃圾对象。造成程序严重错误。
  增量更新:在并发标记的过程中,将赋值(新引用)保存在一个集合中,(重标记时是为了解决并发标记时多标记或漏标记的问题,找到新添加记录的引用并重新扫描);简单理解:新添加的引用源和被引用对象记录在一个集合中(底层是C++),源引用用黑色标注。(一旦黑色对象有了新插入的对白色对象的引用,它就变成了灰色对象)
  原创
快照(Snapshot At The Beginning, SATB):(没看懂,再听一遍)在赋值前将旧的引用以快照的形式保存在集合中。在remarking的过程中,采集
中的所有引用都被标记为黑色,如果是黑色,则本轮不回收(会变成浮动垃圾,下轮回收)。
  增量更新和原创
快照都是通过写屏障来记录的。
  Write barrier:增加新的引用或减少引用是通过赋值来实现的。无论是增量更新还是原创
快照引用的记录,都必须采集
到集合中,无论是赋值前还是赋值后(代码中的操作屏障),通过write barrier记录到集合中
  赋值前后做一些处理(有点像AOP),(write barrier)写前操作,(write barrier)写后操作(增量更新)。
  CMS 实现写屏障+增量更新来处理丢失的标签。(写操作异步处理以提高性能)
  为什么G1使用原创
快照,而CMS使用增量更新来处理丢失的标签?
  因为CMS在增量更新时会继续扫描节点对象的引用,所以G1不会再深度扫描原创
快照中的对象,而是简单地标记它们,等待下一轮GC进行深度扫描。(G1有很多不同的region,CMS是老年代区域,如果再深度重新扫描,G1的成本会比CMS高)。
  4.内存设置和卡表
  Remember Set:为了解决新生代中对象的引用被老年代引用的问题,专门在新生代的内存中设置了这些老年代引用的对象(不会有很多交叉)生成引用),并且这些对象的集合使用内存集调用。
  Cardtable:Cardtable和memory set就像Java语言中HashMap和Map的关系。内存集是用卡表实现的,内存区域(卡页)在老年代是一块块划分的,或者叫页内存卡(约512字节)。如果page memory(card)中有指向young的对象 如果在generation中有对象,则将这个card page标记为dirty。卡表(Cardtable)的底层实现是一个数组,数组中每个元素对应的内存区域称为页内存(card page)。卡表底层也是通过write barrier实现的。卡页在老年代,卡表在新生代(堆)。
  5.如何选择垃圾采集

  1、优先调整堆的大小,让服务器自己选择;
  2.如果内存小于100M,使用串口采集
器;
  3、如果是单核,没有停顿时间要求,serial或者JVM可以自己选择;
  4.如果允许暂停时间超过1秒,选择parallel或者JVM来选择;
  5、如果响应时间最重要,不能超过1秒,使用并发采集
器;
  6、4G以下可以用parallel,4-8G可以用ParNew+CMS,8G以上可以用G1,几百G以上可以用ZGC;
  6. 安全点和安全区
  安全点:在做GC的过程中,不要想做就马上做GC。当用户线程在做GC的时候,会判断flag是什么(比如0和1,1表示到达安全点,0没有到达,所有用户线程都会轮询看这个flag)当用户线程flags全为1,就会被挂起,当所有用户线程flags都为1时(都到达安全点时),就会触发GC。
  安全点的位置主要有以下几点:
  1、方法返回前;
  2.调用方法后;
  3.抛出异常的位置;
  4.循环结束;
  安全区:是为正在执行的线程确定的。比如一个线程处于休眠状态,无法响应JVM的中断请求,进而运行到Safe Point。因此,JVM引入了Safe Region,也就是说在一个代码块中,引用关系不会发生变化,在这个区域的任何地方启动GC都是安全的。
  总结
  例如:常见的垃圾采集
算法mark-copy algorithm, mark-clear algorithm, mark-sort algorithm,常见的垃圾采集
器Serial, Parallel, ParNew, CMS, G1, ZGC,主要是三种垃圾:CMS, G1, ZGC 的运行collector的流程,并发标记过程中的missing mark问题,以及相应的解决方案。
  解决方案:摄像头采集的图像可以用调用opencv处理吗
  用
  OpenCV打开USB摄像头时,两个软件采集到的图像结果分别是以上两张,我用OpenCV采集的第一张图片
  第二张图是用别人的软件采集
的,感觉色差好大,在OpenCV中我觉得相机本身的很多属性都设置不定,原因是两个软件使用的库不同,而且拍到的图片默认参数不同,所以想用DirectShow, 据说有一些东西可以在里面设置属性。
  安装直接显示
  1. 下载、安装和配置 OpenCV
  2.免费下载直接显示,哈哈(
  )
  3. 解压缩到 OpenCV 所在的文件夹。
  4. VS2010 新 Win32 项目,空文档。
  5. 配置 OpenCV(还有很多其他文章,这里就不提了)。
  6. 配置直接显示:在属性管理器中,在 VC++ 目录收录
项的直接显示下添加收录
文件路径。
  在库中的 DirectShow 下添加库路径。
  7.将 CameraDS.h CameraDS.cpp 和目录 DirectShow 复制到您的项目中
  此路径收录
所需的实验过程。它也可以下载到CameraDS.h CameraDS.cpp。
  8.如有必要,在属性管理器的常规下,将使用Unicode字符集更改为unset,这样可以避免一些编译错误。//
  /
  使用 DirectShow 拍摄视频
  作者:于世琪 ()
  //由于:
  HardyAI@OpenCV 中国/
  /flymanbox@OpenCV 中国(表彰他对功能相机名称和帧宽/高设置的贡献)
  最后修改日期:2009 年 4 月 9 日
  //
  使用说明:
  将 CameraDS.h CameraDS.cpp 和目录 DirectShow 复制到您的项目中
  项目->设置->设置:(所有配置)->C/C++->类别(预处理器)->其他收录
目录
  设置为直接显示/收录
  项目->设置->设置:(所有配置)->链接->类别(输入)->其他库目录
  设置为 DirectShow/Lib//
  /
  #include
  #include “相机DS.h”
  #include
  常量字符 *g_szTitle = “相机”;
  int main()
  
  {
  1. 考虑到已经有
  一个窗口显示图像,无需再次驾驶相机,即使你开车下来,相机也已经被占用了。
  if(IsWindowVisible(FindWindow(NULL, g_szTitle)))
  {
  返回 (-1);
  }
  只需获取摄像机数量
  int m_iCamCount = CCameraDS::CameraCount();
  printf(“There are 有 %d camera.\n”, m_iCamCount);
  if(m_iCamCount == 0)
  {
  返回 (-1);
  }
  CCameraDS m_CamDS;
  获取所有摄像机的名称
  for(int i = 0; i < m_iCamCount; i++)
  {
  字符 szCamName[1024];
  int retval = m_CamDS.CameraName(i, szCamName, sizeof(szCamName));
  if(retval >0)
  {
  printf(“Camera #%d's Name is '%s'.\n”, i, szCamName);
  }
  还
  {
  printf(“无法获取相机 #%d 的名称。\n”, i);
  }
  }
  2.考虑到如果有多个摄像头,或者其中一个或几个被其他程序占用,则需要逐个遍历它们
  直到找到一个可用。
  int m_iCamNum = 0;相机编号
  IplImage *pFrame = NULL;
  而(m_iCamNum < m_iCamCount)
  {
  
  if((! m_CamDS.OpenCamera(m_iCamNum, true , 320, 240)) ||((pFrame = m_CamDS.QueryFrame()) == NULL))
  {
  m_iCamNum++;
  }
  还
  { // 找到合适的相机并退出循环。
  破;
  }
  关闭
  相机,您必须将其关闭,因为下一次测试即将进行,并且在检测之前必须清除当前足迹。
  m_CamDS.关闭相机();
  }
  if(m_iCamNum == m_iCamCount)
  {
  fprintf(stderr, “无法打开相机或被其他应用程序使用。\n”);
  返回 (-1);
  }
  cvNamedWindow(g_szTitle);
  显示
  cvShowImage(g_szTitle, pFrame);
  而(1)
  {
  获取框架
  pFrame = m_CamDS.QueryFrame();
  显示
  cvShowImage(g_szTitle, pFrame);
  if (cvWaitKey(20) == 'q')
  {
  破;
  }
  }
  m_CamDS.关闭相机();你可以不调用这个函数,CCameraDS会在相机被破坏时自动关闭相机
  cvDestroyWindow(g_szTitle);
  返回 0;
  } 查看全部

  解决方案:垃圾回收算法以及常见垃圾收集器简介
  垃圾采集
算法及常见垃圾采集
器介绍
  文章目录
  前言
  比如:作为一个java程序员,JVM会帮你进行垃圾回收,那么JVM是怎么回收的呢?常见的垃圾回收算法和垃圾回收器有哪些?它们是如何工作的?
  1. 垃圾采集
算法 1.1 分代采集
理论
  根据年轻代或老年代的不同,选择不同的垃圾回收算法。年轻代一般采用复制算法,老年代一般采用标记清除算法或标记排序算法。
  1.2 标记-复制算法
  内存排序前:首先将内存分为used(保留内存)和unused(可用内存、可回收内存、存活对象(通过gc根可达性算法判断哪些对象存活))两部分,(从eden从park到幸存者区);
  内存排序后:将已使用(保留内存)和未使用(可用内存、可回收内存、存活对象)复制交换,回收未使用的可回收内存;
  缺点:每次内存回收回收一半内存空间,浪费空间。年轻代使用复制算法,老年代不使用复制算法。
  1.3 标记-扫描算法
  标记存活的对象,清除未标记(not alive)的对象。
  缺点: 1.效率问题,如果标记的对象太多,效率不高;2、空间问题,标记清除后会产生大量不连续的碎片(内存空间);
  1.4 标记整理算法
  标记存活对象,让存活对象移动到可回收对象(不清除垃圾对象,直接将非垃圾对象移动到垃圾对象,就像赋值一样),如果可回收对象中没有存活对象,然后直接清除它们可回收对象;(write barrier模式同步修改内存地址)
  2.垃圾采集

  如果说回收算法是内存回收的方法论,那么垃圾回收器就是内存回收的具体实现。
  常见的垃圾采集
器有Seri​​al、ParNew、Parallel、CMS、Serial Old、Parallel Old、G1、ZGC。
  为什么有这么多垃圾采集
器?因为目前还没有任何场景都可以使用的采集
器,所以我们要根据具体的场景选择适合自己的垃圾采集
器。
  2.1 串行采集

  串行(serial)采集
器是最基本也是最古老的垃圾采集
器。它是一个单线程垃圾采集
器,在垃圾采集
期间暂停所有其他工作线程(“Stop The World”或简称 STW)。新生代采用复制算法,老年代采用标记-排序算法。可以回收的内存区域在几十兆到几百兆之间,不是很大,也不再使用了。使用参数 -XX:+UseSerialGC -XX:+UseSerialOldGC
  缺点:效率低,会给STW中的用户带来不好的用户体验;
  优点:简单高效(相对于其他单线程采集
器);
  Serial Old采集
器是Serial采集
器的老版本,也是单线程采集
器。它主要有两个用途:一是在JDK1.5及更早版本中与Parallel Scavenge采集
器配合使用,二是作为CMS采集
器的备份方案。
  2.2 并行清扫采集

  并行采集
器实际上是串行采集
器的多线程版本。除了使用多线程进行垃圾采集
外,其余行为(控制参数、采集
算法、回收策略等)与Serial采集
器类似。默认采集
线程数与 CPU 核心数相同。当然采集
线程数也可以通过参数(-XX:ParallelGCThreads)指定,但一般不建议修改。Parallel Scavenge采集
器侧重于吞吐量(CPU的高效利用),其STW时间比较长,用户体验不好。CMS等垃圾采集
器的关注点更多的是用户线程的停顿时间(提升用户体验)。所谓吞吐量就是CPU中运行用户代码所花费的时间与CPU总消耗时间的比值。新生代采用复制算法,老年代采用标记-排序算法。使用参数-XX:+UseParallelGC(年轻代),-XX:+UseParallelOldGC(老年代)
  Parallel Old 采集
器是 Parallel Scavenge 采集
器的老年代版本。使用多线程和“标记和排序”算法。在注重吞吐量和CPU资源的情况下,Parallel Scavenge采集
器和Parallel Old采集
器(JDK8默认的新生代和老年代采集
器),Parallel采集
器和CMS(老年代才有)采集
器可以优先使用 没有一起使用它的方法。
  2.3 ParNew采集

  ParNew采集
器其实和Paralle采集
器非常相似(ParNew用于新生代),区别(ParNew+CMS)主要是可以和CMS(用于老年代)采集
器结合使用。新生代采用复制算法,老年代采用标记-排序算法。使用参数-XX:+UseParNewGC。
  2.4 CMS 采集

  CMS(Concurrent Mark Sweep)采集
器是一种以获取最短恢复停顿时间为目标的采集
器,非常注重用户体验。
  操作过程大致如下:
  2.4.1 初始标记
  挂起所有其他线程(STW,如果没有STW机制,初始标记阶段会产生连续的对象,无法完成初始标记),记录gc roots可以直接引用的对象,以及速度很快;
  2.4.2 并发标记
  无需停止应用程序线程。应用线程和CMS线程同时运行,可能导致被标记对象的状态发生变化;(如果内存变大,整个堆内存会变大,标记时间也会变长,STW时间也会变长,用户体验不好。)缺少标签(下面会有解决方法)。
  2.4.3 重新贴标签
  它还会STW,重新标记那些在并发标记中状态发生变化的对象;(三色标增量更新)
  2.4.4 并发清理
  没有被标记的对象(垃圾对象)被清除,应用线程和CMS线程同时运行(因为应用线程也在运行,会产生新的对象,如果这些引用会被标记为黑色)它们没有被标记,黑色不会被扫描后变成浮动垃圾,在下一轮被清理(三色标记))。
  2.4.5 并发复位
  清理上面步骤标记的对象,方便下次重新标记。
  如果ParNew采集
器的执行时间为1s,那么CMS采集
器的执行时间就会大于1s。为什么?因为CMS采集
器在执行过程中会分配一部分资源(CPU)给应用线程执行,但是没有STW(用户在初始标记和重新标记时会感觉到STW),用户几乎没有感觉等了很久。
  CMS采集
器的优点:并发采集
、低暂停。
  CMS采集
器的缺点:
  (1). 会和CPU竞争资源(应用线程和CMS线程会同时运行);
  (2). 浮动垃圾(并发标记和并发清理时会产生新的垃圾,只能被下一次gc处理);
  (3). 使用mark-clear算法会产生大量的空间碎片,但是JVM可以通过XX:+UseCMSCompactAtFull采集
参数让jvm清除mark然后整理;
  (4). 在并发标记和并发清理的过程中,会出现同时回收和运行的情况。可能在回收完成之前会再次触发full gc(垃圾会在上次垃圾回收完成之前再次触发),是并发失败(concurrent mode failure),会stop the world,使用Serial old collector来回收。
  2.4.6 CMS相关核心参数
  1.-XX:+UseConcMarkSweepGC:启用cms;
  2. -XX:ConcGCThreads:并发GC线程数;
  3. -XX:+UseCMSCompactAtFull采集
: FullGC后做压缩(减少碎片);
  4. -XX:CMSFullGCsBeforeCompaction:FullGC后压缩多少次,默认0,表示每次FullGC后压缩;
  5. -XX:CMSInitiatingOccupancyFraction:当老年代的使用率达到这个比例(默认是92,是一个百分比)的时候会触发FullGC;
  6、-XX:+UseCMSInitiatingOccupancyOnly:只使用设置的恢复阈值(-XX:CMSInitiatingOccupancyFraction设置的值),如果不指定,JVM只会在第一次使用设置的值,之后会自动调整;
  7. -XX:+CMSScavengeBeforeRemark:在CMS GC之前启动一次minor gc,目的是减少老年代对新生代的引用,减少CMS GC标记阶段的开销。一般CMS 80%的GC时间都在标记阶段;
  
  8、-XX:+CMSParallellnitialMarkEnabled:表示初始标记时多线程执行,缩短STW;
  9、-XX:+CMSParallelRemarkEnabled:remarking时多线程执行,缩短STW;
  2.5 G1 垃圾采集
器 2.5.1 G1 垃圾采集
器简介
  在 JDK9 中,默认的垃圾采集
器变成了 G1。在 JDK9 中,CMS 仍然可以使用,但不推荐使用。在JDK8中,也可以使用G1,但不推荐。G1采集
器(-XX:+UseG1GC),G1(Garbage-First)是面向服务器的垃圾采集
器,主要针对配备多处理器和大容量内存的机器,同时具有高吞吐量的特点。
  G1将java堆内存划分为大小相等的独立区域(Regions),JVM最多可以有2048个Region。如果一个内存是4G(4096M),那么每个Region平均就是2M。当然也可以通过参数“-XX:G1HeapRegionSize”手动指定Region大小,但建议使用默认的计算方式。
  G1保留了新生代和老年代的概念,但不再是物理隔离。它们都是(可以是不连续的)Region 集合。比如一个Region之前可能是新生代,如果Region被垃圾回收了,后面可能又变了。变成了晚年。
  默认情况下,新生代占堆内存的5%。如果heap size为4096M,那么young generation大约占用200MB内存,对应100个Region左右。可以通过“-XX:G1NewSizePercent”设置新生代的初始比例。在系统运行的过程中,JVM会不断的给年轻代增加Region,但是年轻代的最大比例不会超过60%,可以通过“-XX:G1MaxNewSizePercent”来调整。年轻代中Eden和Survivor对应的region也和之前一样。默认值为 8:1:1。假设新生代有1000个region,eden区有800个,s0有100个,s1有100个。
  G1和其他垃圾采集
器的区别在于对大对象的处理。G1有一个Region叫做Humongous区,专门用来分配大对象,而不是直接进入老年代。在G1中,如果一个大对象超过了Region的50%,就会被放到Humongous区域。如果一个对象的内存是1.5M,就直接放到Humongous里面。如果一个对象的内存是6M,那么它会被放置在三个连续的Humongous区。
  2.5.2 G1采集器运行过程
  初始标记:挂起所有其他线程,记录gc roots直接引用的对象,非常快(STW);
  并发标记:同CMS并发标记;
  Final markup: remark with CMS (will STW);
  Filter recovery(类似于CMS并发清理,只是STW):根据用户预期的GC暂停STW时间指定回收(可以通过JVM参数指定:-XX:MaxGCPauseMills),比如old generation中1000个region满了,但是因为按照预期的停顿时间,这次恢复可能是200毫秒(如果没有设置参数-XX:MaxGCPauseMills,默认是200ms),通过计算可知,恢复800的可能只需要200毫秒regions,所以会回收800个region(采集
Set,待回收的采集
),剩下的200个region会在下次垃圾回收时回收,尽量把GC停顿时间控制在我们设定的时间范围内。不管是年轻一代还是老一代,回收算法主要使用复制算法(G1整体上是一种标记算法),将一个区域中存活的对象复制到另一个区域中,不会像CMS那样被回收 因为有很多内存碎片需要回收整理一次,G1使用复制算法回收几乎没有内存碎片。G1 采集
器在后台维护一个优先级列表。每次根据允许回收时间,优先回收价值最高的区域。比如一个region可以在200ms回收10M垃圾,另一个region可以在50ms回收10M垃圾。在有限的情况下,G1当然会优先回收后面的区域。不会像CMS那样被回收 因为有很多内存碎片需要整理一次,所以G1使用复制算法回收几乎没有内存碎片。G1 采集
器在后台维护一个优先级列表。每次根据允许回收时间,优先回收价值最高的区域。比如一个region可以在200ms回收10M垃圾,另一个region可以在50ms回收10M垃圾。在有限的情况下,G1当然会优先回收后面的区域。不会像CMS那样被回收 因为有很多内存碎片需要整理一次,所以G1使用复制算法回收几乎没有内存碎片。G1 采集
器在后台维护一个优先级列表。每次根据允许回收时间,优先回收价值最高的区域。比如一个region可以在200ms回收10M垃圾,另一个region可以在50ms回收10M垃圾。在有限的情况下,G1当然会优先回收后面的区域。优先考虑回收价值最高的地区。比如一个region可以在200ms回收10M垃圾,另一个region可以在50ms回收10M垃圾。在有限的情况下,G1当然会优先回收后面的区域。优先考虑回收价值最高的地区。比如一个region可以在200ms回收10M垃圾,另一个region可以在50ms回收10M垃圾。在有限的情况下,G1当然会优先回收后面的区域。
  2.5.3 G1采集器特点
  并行和并发:G1可以充分利用CPU和多核环境的硬件优势,使用多个CPU(CPU或CPU核心)来缩短Stop-The-World暂停时间。其他一些采集
器原本需要停止Java线程执行GC动作,但G1采集
器仍然可以让Java程序继续并发执行。
  分代采集
:虽然G1可以独立管理整个GC堆而不需要其他采集
器的配合,但是它仍然保留了分代的概念。
  空间整合:与CMS的“mark-clean”算法不同,G1是一个整体基于“mark-sort”算法的采集
器;它是在本地基于“复制”算法实现的。
  可预测的暂停:这是 G1 相对于 CMS 的另一大优势。减少暂停时间是 G1 和 CMS 共同关心的问题。不过,除了追求低停顿之外,G1 还可以建立一个可预测的停顿时间模型,允许用户或明确指定在 M 毫秒的时间段内完成垃圾采集
(由参数“-XX:MaxGCPauseMillis”指定) .
  毫无疑问,能够由用户指定预期的停顿时间是G1采集
器非常强大的功能。设置不同的预期停顿时间可以让G1在不同的应用场景下,在关注吞吐量和关注延迟之间取得最佳平衡。不过,这里设定的“期望值”一定要切合实际,不能异想天开。毕竟G1是冻结用户线程复制对象,停顿时间再低也得有个限度。它的默认暂停目标是 200 毫秒。一般来说,回收阶段占用几十到一百甚至接近200毫秒是正常的,但是如果我们把暂停时间调整到一个很低的值,比如设置为20毫秒,最有可能的结果是因为暂停目标时间太短,每次选择的采集
集合只占用堆内存的一小部分,采集
器的采集
速度逐渐跟不上分配器的分配速度,导致垃圾堆积。采集
器很可能一开始可以从空闲堆内存中获得一些喘息时间,但是应用程序运行时间长了就不行了,最终堆满会导致Full GC降低性能,所以预期的停顿时间通常设置为一两百毫秒或者两三百毫秒会比较合理。
  2.5.4 G1垃圾采集
分类
  YoungGC:YoungGC并不是说当现有的Eden区满了就立即触发。当G1触发YoungGC时,会判断触发时间是否接近设定的时间(默认为200ms)。如果没有关闭,则不会立即触发。YoungGC会不断的给Eden区增加空间(默认是5%,最大不会超过60%),只有在关闭的时候才会触发YoungGC。
  MixedGC:当老年代占用堆内存的比例达到45%时(可以通过参数-XX:InitiatingHeapOccupancyPercent设置),触发MixedGC,回收所有Young和部分Old(决定垃圾回收的优先级)按照预期的GC停顿时间顺序在old区)和大对象区(Humongous area)。(MixedGC会回收 G1的Humongous区)
  FullGC:在做复制算法的过程中(对内存空间要求比较高),需要将每个region中存活的对象复制到其他region中。如果在复制过程中发现没有足够的空区域来承载复制的对象,则会失败。触发Full GC,触发Full GC会停止系统程序,然后使用单线程进行标记、清理、压缩,为下一次MixedGC腾出一批region。这个过程非常耗时。
  2.5.5 G1采集器参数配置
  -XX:+UseG1GC:使用G1采集
器;
  -XX:ParallelGCThreads:指定GC工作的线程数;
  -XX:G1HeapRegionSize:指定分区大小(1MB~32MB,且必须是2的N次方),默认整个堆分为2048个分区
  -XX:MaxGCPauseMillis:目标暂停时间(默认200ms);
  -XX:G1NewSizePercent:新生代内存的初始空间(默认为整个堆的5%);
  -XX:G1MaxNewSizePercent:新生代的最大内存空间;
  -XX:TargetSurvivorRatio:Survivor区域的填充容量(默认50%)。Survivor区的一组物体(年龄1+年龄2+年龄n多个年龄的物体)总和超过Survivor区的50%。此时,年龄为n(含)及以上的对象将被放入老年代;
  -XX:MaxTenuringThreshold:最大年龄阈值(默认15);
  -XX:InitiatingHeapOccupancyPercent:老年代占用的空间达到整个堆内存的阈值(默认45%),则进行新生代和老年代的混合采集
(MixedGC)。比如我们前面提到的heap,默认有2048个region。如果有接近1000个region,每个region都是老年代region,可能会触发MixedGC;
  -XX:G1MixedGCLiveThresholdPercent (default 85%) 当区域中的存活对象低于该值时,该区域将被回收。如果这个值超过这个值,说明存活对象太多,回收意义不大;
  -XX:G1MixedGCCountTarget:指定一次回收过程中筛选回收的次数(默认8次)。在最后的筛选回收阶段,可以先回收一段时间,然后暂停回收,恢复系统运行,稍后再开始回收,这样就不会让系统单次停太久;
  -XX:G1HeapWastePercent (default 5%):gc过程中腾出的region是否足够阈值。混合回收时,region回收是基于复制算法,将待回收region中存活的对象放到Other Region中,然后清理掉本Region中的所有垃圾对象,从而不断清空新的Region在回收过程中。一旦free Region数量达到堆内存的5%,混合回收就会立即停止,也就是说本次混合回收结束。
  2.5.6 G1采集
器使用场景
  超过 1.50% 的堆被存活的对象占用;
  2、对象分配和提升的速度差异很大;
  3、垃圾回收时间极长,超过1秒;
  堆内存大于4.8GB(推荐值);
  5、停顿时间在500ms以内;
  2.7 ZGC采集
器 2.7.1 ZGC简介
  ZGC是JDK11中新加入的实验性低延迟垃圾采集
器。ZGC可以说是源自Azul System开发的C4(Concurrent Continuously Compacting Collector)采集
器。
  2.7.2 ZGC目标
  1.支持TB级堆;
  2、最大GC停顿时间不超过10ms;
  3.为以后的GC特性打下基础;
  4、最坏情况下,吞吐量会降低15%;
  无分代(临时):我们都知道上一代垃圾采集
器是基于“大多数对象有生有死”的假设。事实上,大多数系统的对象分配行为确实符合这个假设。那为什么ZGC不分代呢?由于分代实现比较麻烦,笔者先实现了一个比较简单好用的单代版本,后期会优化。
  2.7.3 ZGC内存布局
  ZGC采集
器基于Region内存布局,暂不设置分代,使用read barriers、color pointers等技术实现并发mark-sort算法,是一款以低延迟为首要目标的垃圾采集
器. 设备。
  ZGC的Region可以有三种容量,如图3-19所示:大、中、小:
  Small Region(小区域):容量固定为2MB,用于放置小于256KB的小对象。
  Medium Region(中型区域):容量固定为32MB,用于放置大于等于256KB但小于4MB的对象。
  Large Region(大区域):容量不固定,可以动态变化,但必须是2MB的整数倍,用于放置4MB以上的大对象。每个large region只会存储一个large object,这也说明虽然名字叫“large region”,但实际容量可能比medium region要小,最小容量可以低至4MB。Large Region在ZGC的实现中不会进行重分布(重分布是ZGC的一个处理动作,用于采集
器阶段的对象复制,后面会介绍),因为复制大对象的成本非常高。
  2.7.4 彩色指针
  前一个垃圾采集
器的GC信息保存在对象头中,而ZGC垃圾采集
器的GC信息保存在指针中。
  
  每个对象都有一个64位的指针,这64位分为:
  18 位:保留以备后用;
  1位:Finalizable标志位,这个位与并发引用处理有关,表示这个对象只能通过finalizer访问;
  1位:Remapped flag,设置该位的值后,对象不指向relocation set(relocation set表示需要GC
  区域集合);
  1位:Marked1标识;
  1位:Marked0标识,上面的Marked1都是辅助GC的标记对象;
  42位:对象的地址(所以可以支持2^42=4T内存):
  为什么有2个标记标记?
  在每个 GC 周期的开始,使用过的标记位被交换,使在前一个 GC 周期中更正的标记状态无效,并且所有引用都变为未标记。
  GC循环1:使用mark0,循环结束时所有引用标记都会变成01。
  GC循环2:使用mark1,那么期望的mark标记为10,所有的引用都可以remark。
  通过配置ZGC后对对象指针的分析,可以看出对象指针必须是64位的,那么ZGC就不能支持32位的操作系统,同样不能支持压缩指针(CompressedOops,压缩指针也是32位的)
  彩色指针的三大优势:
  1、一旦一个Region的存活对象被remove,这个Region就可以立即被释放并重新使用,而不需要等到整个堆中对该Region的所有引用都被纠正之后才能被清理掉。如果有空闲的Region,ZGC可以完成采集

  2. 颜色指针可以大大减少垃圾回收时使用的内存屏障的数量。ZGC 只使用读屏障。
  3、颜色指针可扩展性强。它可以作为一个可扩展的存储结构来记录更多与对象标记和重定位过程相关的数据,以便在未来进一步提高性能。
  2.7.5 读屏障
  在并发重分配的过程中,ZGC通过复制算法将原来的region(里面的对象)移动到另一个region,需要更新新的地址。什么时候更新?这个过程是一个懒惰的过程,它不会一直更新。当我从堆中获取旧对象值时,我得到了一个引用。此引用的颜色指针在进行并发标记时更改了颜色。在旧的引用过程中,颜色指针部分也被接管了。取的时候会加一个read barrier,判断指针是否被修改。如果它已被修改,它将在内部将旧引用移动到已使用的更新地址。转发表记录了旧对象到新对象的转发关系。
  2.7.6 ZGC问题及解决方案
  ZGC最大的问题是漂浮垃圾。ZGC的停顿时间在10ms以下,但是ZGC的执行时间还是比这个时间长了很多。如果ZGC的整个过程需要执行10分钟,这期间由于对象分配率高,会产生大量的新对象。这些对象很难进入本次GC,只能在下一次GC中回收。这些对象只能等到下一次GC才能回收的对象是浮动垃圾。
  解决方案
  目前唯一的办法就是增加堆的容量,让程序获得更多的喘息时间,但这也是治标不治本。如果要从根本上解决这个问题,还是需要引入分代采集
,让新的对象都在一个专门的区域创建。
  2.7.7 ZGC参数设置
  启用ZGC比较简单,设置JVM参数即可:-XX:+UnlockExperimentalVMOptions "-XX:+UseZGC"。调优并不难,因为ZGC的调优参数不多,远没有CMS复杂。和G1一样,可以调优的参数比较少,大部分工作都可以由JVM自动完成。ZGC可以调优的参数如下图:
  3. 垃圾回收底层算法实现 3.1 三色标记
  在gc过程或者并发标记过程中,主要有三种颜色
  黑色:表示对该对象的所有引用都已被垃圾采集
器扫描过,是一个活的(非垃圾)对象;
  灰色:表示这个对象至少有一个引用没有被垃圾采集
器扫描过;
  白色:表示这个对象还没有被垃圾采集
器访问过(没有对象被gc root引用,对象不可达);
  3.2 多标签漂浮垃圾
  因为应用线程没有停止(执行栈线程,没有STW机制,即栈线程中局部变量表、操作数栈、动态链接、方法出口的指针不指向堆内存),会有多标签(非垃圾对象被标记为垃圾对象),多标签(浮动垃圾)会在下次垃圾回收时被清除。
  3.3 缺失标签——读写障碍
  缺失标记:A-&gt;D,开头后面没有加法,B-&gt;D,开头后面有去掉。A不会被重新扫描,B重新扫描后也无法扫描D;D(以后会删除)会漏掉(阿里巴巴可能会问),D不是垃圾对象,会被标记为垃圾对象。造成程序严重错误。
  增量更新:在并发标记的过程中,将赋值(新引用)保存在一个集合中,(重标记时是为了解决并发标记时多标记或漏标记的问题,找到新添加记录的引用并重新扫描);简单理解:新添加的引用源和被引用对象记录在一个集合中(底层是C++),源引用用黑色标注。(一旦黑色对象有了新插入的对白色对象的引用,它就变成了灰色对象)
  原创
快照(Snapshot At The Beginning, SATB):(没看懂,再听一遍)在赋值前将旧的引用以快照的形式保存在集合中。在remarking的过程中,采集
中的所有引用都被标记为黑色,如果是黑色,则本轮不回收(会变成浮动垃圾,下轮回收)。
  增量更新和原创
快照都是通过写屏障来记录的。
  Write barrier:增加新的引用或减少引用是通过赋值来实现的。无论是增量更新还是原创
快照引用的记录,都必须采集
到集合中,无论是赋值前还是赋值后(代码中的操作屏障),通过write barrier记录到集合中
  赋值前后做一些处理(有点像AOP),(write barrier)写前操作,(write barrier)写后操作(增量更新)。
  CMS 实现写屏障+增量更新来处理丢失的标签。(写操作异步处理以提高性能)
  为什么G1使用原创
快照,而CMS使用增量更新来处理丢失的标签?
  因为CMS在增量更新时会继续扫描节点对象的引用,所以G1不会再深度扫描原创
快照中的对象,而是简单地标记它们,等待下一轮GC进行深度扫描。(G1有很多不同的region,CMS是老年代区域,如果再深度重新扫描,G1的成本会比CMS高)。
  4.内存设置和卡表
  Remember Set:为了解决新生代中对象的引用被老年代引用的问题,专门在新生代的内存中设置了这些老年代引用的对象(不会有很多交叉)生成引用),并且这些对象的集合使用内存集调用。
  Cardtable:Cardtable和memory set就像Java语言中HashMap和Map的关系。内存集是用卡表实现的,内存区域(卡页)在老年代是一块块划分的,或者叫页内存卡(约512字节)。如果page memory(card)中有指向young的对象 如果在generation中有对象,则将这个card page标记为dirty。卡表(Cardtable)的底层实现是一个数组,数组中每个元素对应的内存区域称为页内存(card page)。卡表底层也是通过write barrier实现的。卡页在老年代,卡表在新生代(堆)。
  5.如何选择垃圾采集

  1、优先调整堆的大小,让服务器自己选择;
  2.如果内存小于100M,使用串口采集
器;
  3、如果是单核,没有停顿时间要求,serial或者JVM可以自己选择;
  4.如果允许暂停时间超过1秒,选择parallel或者JVM来选择;
  5、如果响应时间最重要,不能超过1秒,使用并发采集
器;
  6、4G以下可以用parallel,4-8G可以用ParNew+CMS,8G以上可以用G1,几百G以上可以用ZGC;
  6. 安全点和安全区
  安全点:在做GC的过程中,不要想做就马上做GC。当用户线程在做GC的时候,会判断flag是什么(比如0和1,1表示到达安全点,0没有到达,所有用户线程都会轮询看这个flag)当用户线程flags全为1,就会被挂起,当所有用户线程flags都为1时(都到达安全点时),就会触发GC。
  安全点的位置主要有以下几点:
  1、方法返回前;
  2.调用方法后;
  3.抛出异常的位置;
  4.循环结束;
  安全区:是为正在执行的线程确定的。比如一个线程处于休眠状态,无法响应JVM的中断请求,进而运行到Safe Point。因此,JVM引入了Safe Region,也就是说在一个代码块中,引用关系不会发生变化,在这个区域的任何地方启动GC都是安全的。
  总结
  例如:常见的垃圾采集
算法mark-copy algorithm, mark-clear algorithm, mark-sort algorithm,常见的垃圾采集
器Serial, Parallel, ParNew, CMS, G1, ZGC,主要是三种垃圾:CMS, G1, ZGC 的运行collector的流程,并发标记过程中的missing mark问题,以及相应的解决方案。
  解决方案:摄像头采集的图像可以用调用opencv处理吗
  用
  OpenCV打开USB摄像头时,两个软件采集到的图像结果分别是以上两张,我用OpenCV采集的第一张图片
  第二张图是用别人的软件采集
的,感觉色差好大,在OpenCV中我觉得相机本身的很多属性都设置不定,原因是两个软件使用的库不同,而且拍到的图片默认参数不同,所以想用DirectShow, 据说有一些东西可以在里面设置属性。
  安装直接显示
  1. 下载、安装和配置 OpenCV
  2.免费下载直接显示,哈哈(
  )
  3. 解压缩到 OpenCV 所在的文件夹。
  4. VS2010 新 Win32 项目,空文档。
  5. 配置 OpenCV(还有很多其他文章,这里就不提了)。
  6. 配置直接显示:在属性管理器中,在 VC++ 目录收录
项的直接显示下添加收录
文件路径。
  在库中的 DirectShow 下添加库路径。
  7.将 CameraDS.h CameraDS.cpp 和目录 DirectShow 复制到您的项目中
  此路径收录
所需的实验过程。它也可以下载到CameraDS.h CameraDS.cpp。
  8.如有必要,在属性管理器的常规下,将使用Unicode字符集更改为unset,这样可以避免一些编译错误。//
  /
  使用 DirectShow 拍摄视频
  作者:于世琪 ()
  //由于:
  HardyAI@OpenCV 中国/
  /flymanbox@OpenCV 中国(表彰他对功能相机名称和帧宽/高设置的贡献)
  最后修改日期:2009 年 4 月 9 日
  //
  使用说明:
  将 CameraDS.h CameraDS.cpp 和目录 DirectShow 复制到您的项目中
  项目->设置->设置:(所有配置)->C/C++->类别(预处理器)->其他收录
目录
  设置为直接显示/收录
  项目->设置->设置:(所有配置)->链接->类别(输入)->其他库目录
  设置为 DirectShow/Lib//
  /
  #include
  #include “相机DS.h”
  #include
  常量字符 *g_szTitle = “相机”;
  int main()
  
  {
  1. 考虑到已经有
  一个窗口显示图像,无需再次驾驶相机,即使你开车下来,相机也已经被占用了。
  if(IsWindowVisible(FindWindow(NULL, g_szTitle)))
  {
  返回 (-1);
  }
  只需获取摄像机数量
  int m_iCamCount = CCameraDS::CameraCount();
  printf(“There are 有 %d camera.\n”, m_iCamCount);
  if(m_iCamCount == 0)
  {
  返回 (-1);
  }
  CCameraDS m_CamDS;
  获取所有摄像机的名称
  for(int i = 0; i < m_iCamCount; i++)
  {
  字符 szCamName[1024];
  int retval = m_CamDS.CameraName(i, szCamName, sizeof(szCamName));
  if(retval >0)
  {
  printf(“Camera #%d's Name is '%s'.\n”, i, szCamName);
  }
  还
  {
  printf(“无法获取相机 #%d 的名称。\n”, i);
  }
  }
  2.考虑到如果有多个摄像头,或者其中一个或几个被其他程序占用,则需要逐个遍历它们
  直到找到一个可用。
  int m_iCamNum = 0;相机编号
  IplImage *pFrame = NULL;
  而(m_iCamNum < m_iCamCount)
  {
  
  if((! m_CamDS.OpenCamera(m_iCamNum, true , 320, 240)) ||((pFrame = m_CamDS.QueryFrame()) == NULL))
  {
  m_iCamNum++;
  }
  还
  { // 找到合适的相机并退出循环。
  破;
  }
  关闭
  相机,您必须将其关闭,因为下一次测试即将进行,并且在检测之前必须清除当前足迹。
  m_CamDS.关闭相机();
  }
  if(m_iCamNum == m_iCamCount)
  {
  fprintf(stderr, “无法打开相机或被其他应用程序使用。\n”);
  返回 (-1);
  }
  cvNamedWindow(g_szTitle);
  显示
  cvShowImage(g_szTitle, pFrame);
  而(1)
  {
  获取框架
  pFrame = m_CamDS.QueryFrame();
  显示
  cvShowImage(g_szTitle, pFrame);
  if (cvWaitKey(20) == 'q')
  {
  破;
  }
  }
  m_CamDS.关闭相机();你可以不调用这个函数,CCameraDS会在相机被破坏时自动关闭相机
  cvDestroyWindow(g_szTitle);
  返回 0;
  }

优化的解决方案:ribbon负载均衡算法_软负载均衡算法

采集交流优采云 发表了文章 • 0 个评论 • 138 次浏览 • 2022-11-24 16:30 • 来自相关话题

  优化的解决方案:ribbon负载均衡算法_软负载均衡算法
  大家好,我是你们的好朋友Strones。今天就来聊聊ribbon负载均衡算法_软负载均衡算法,希望大家对编程的认识更上一层楼。
  一、丝带介绍
  Ribbon 是 Netflix 发布的负载均衡器,有助于控制 HTTP 和 TCP 客户端的行为。为Ribbon配置服务提供者地址列表后,Ribbon可以根据一定的负载均衡算法自动帮助服务消费者进行请求。Ribbon默认为我们提供了很多负载均衡算法,比如round robin、random等,当然我们也可以为Ribbon实现自定义的负载均衡算法。
  一个。循环规则
  默认情况下,轮询规则也是很多高级规则中退避的策略
  BaseLoadBalancer类中的setRule方法
  b. 可用性过滤规则
  会过滤掉开熔断的服务或者并发连接数高的服务
  C。加权响应时间规则
  通过服务的平均响应时间,给每个服务一个权重。响应时间越长,权重越小,启动统计不足,应用轮询策略
  // 开启权重配置
spring-cloud-order-service.ribbon.NFLoadBalancerRuleClassName=com.gupaoedu.springcloud.example.springclouduserservice.GpDefineIpHashRule
  d. 重试规则
  首先遵循轮询策略,如果请求服务失败,会在指定时间(30s)内重试
  e. 最佳可用规则
  先过滤掉断路器的服务,然后选择并发最少的那个
  F。随机规则
  获得随机服务
  2.RoundRobinRule轮询
   public Server choose(ILoadBalancer lb, Object key) {

if (lb == null) {

log.warn("no load balancer");
return null;
}
Server server = null;
int count = 0;
while (server == null && count++ = 10) {

log.warn("No available alive servers after 10 tries from load balancer: "
+ lb);
}
return server;
}
  3.RandomRule随机
   /** * Randomly choose from all living servers */
@edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE")
public Server choose(ILoadBalancer lb, Object key) {

if (lb == null) {

return null;
}
Server server = null;
while (server == null) {

if (Thread.interrupted()) {

return null;
}
List upList = lb.getReachableServers();
List allList = lb.getAllServers();
int serverCount = allList.size();
if (serverCount == 0) {

/* * No servers. End regardless of pass, because subsequent passes * only get more restrictive. */
return null;
}
int index = chooseRandomInt(serverCount);
server = upList.get(index);
if (server == null) {

/* * The only time this should happen is if the server list were * somehow trimmed. This is a transient condition. Retry after * yielding. */
Thread.yield();
continue;
}
if (server.isAlive()) {

return (server);
}
// Shouldn't actually happen.. but must be transient or a bug.
server = null;
<p>
Thread.yield();
}
return server;
}
</p>
  4.RetryRule重试
  默认先使用round-robin算法(IRule subRule = new RoundRobinRule()),再使用retry算法;
  默认是0.5s重试一次(long maxRetryMillis = 500)
<p>package com.netflix.loadbalancer;
import com.netflix.client.config.IClientConfig;
public class RetryRule extends AbstractLoadBalancerRule {

IRule subRule = new RoundRobinRule();
long maxRetryMillis = 500;
public RetryRule() {

}
public RetryRule(IRule subRule) {

this.subRule = (subRule != null) ? subRule : new RoundRobinRule();
}
public RetryRule(IRule subRule, long maxRetryMillis) {

this.subRule = (subRule != null) ? subRule : new RoundRobinRule();
this.maxRetryMillis = (maxRetryMillis > 0) ? maxRetryMillis : 500;
}
public void setRule(IRule subRule) {

this.subRule = (subRule != null) ? subRule : new RoundRobinRule();
}
public IRule getRule() {

return subRule;
}
public void setMaxRetryMillis(long maxRetryMillis) {

if (maxRetryMillis > 0) {

this.maxRetryMillis = maxRetryMillis;
} else {

this.maxRetryMillis = 500;
}
}
public long getMaxRetryMillis() {

return maxRetryMillis;
}
@Override
public void setLoadBalancer(ILoadBalancer lb) {

super.setLoadBalancer(lb);
subRule.setLoadBalancer(lb);
}
/* * Loop if necessary. Note that the time CAN be exceeded depending on the * subRule, because we're not spawning additional threads and returning * early. */
//具体重试代码
public Server choose(ILoadBalancer lb, Object key) {

long requestTime = System.currentTimeMillis();
long deadline = requestTime + maxRetryMillis;
Server answer = null;
answer = subRule.choose(key);
if (((answer == null) || (!answer.isAlive()))
&& (System.currentTimeMillis() 查看全部

  优化的解决方案:ribbon负载均衡算法_软负载均衡算法
  大家好,我是你们的好朋友Strones。今天就来聊聊ribbon负载均衡算法_软负载均衡算法,希望大家对编程的认识更上一层楼。
  一、丝带介绍
  Ribbon 是 Netflix 发布的负载均衡器,有助于控制 HTTP 和 TCP 客户端的行为。为Ribbon配置服务提供者地址列表后,Ribbon可以根据一定的负载均衡算法自动帮助服务消费者进行请求。Ribbon默认为我们提供了很多负载均衡算法,比如round robin、random等,当然我们也可以为Ribbon实现自定义的负载均衡算法。
  一个。循环规则
  默认情况下,轮询规则也是很多高级规则中退避的策略
  BaseLoadBalancer类中的setRule方法
  b. 可用性过滤规则
  会过滤掉开熔断的服务或者并发连接数高的服务
  C。加权响应时间规则
  通过服务的平均响应时间,给每个服务一个权重。响应时间越长,权重越小,启动统计不足,应用轮询策略
  // 开启权重配置
spring-cloud-order-service.ribbon.NFLoadBalancerRuleClassName=com.gupaoedu.springcloud.example.springclouduserservice.GpDefineIpHashRule
  d. 重试规则
  首先遵循轮询策略,如果请求服务失败,会在指定时间(30s)内重试
  e. 最佳可用规则
  先过滤掉断路器的服务,然后选择并发最少的那个
  F。随机规则
  获得随机服务
  2.RoundRobinRule轮询
   public Server choose(ILoadBalancer lb, Object key) {

if (lb == null) {

log.warn("no load balancer");
return null;
}
Server server = null;
int count = 0;
while (server == null && count++ = 10) {

log.warn("No available alive servers after 10 tries from load balancer: "
+ lb);
}
return server;
}
  3.RandomRule随机
   /** * Randomly choose from all living servers */
@edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE")
public Server choose(ILoadBalancer lb, Object key) {

if (lb == null) {

return null;
}
Server server = null;
while (server == null) {

if (Thread.interrupted()) {

return null;
}
List upList = lb.getReachableServers();
List allList = lb.getAllServers();
int serverCount = allList.size();
if (serverCount == 0) {

/* * No servers. End regardless of pass, because subsequent passes * only get more restrictive. */
return null;
}
int index = chooseRandomInt(serverCount);
server = upList.get(index);
if (server == null) {

/* * The only time this should happen is if the server list were * somehow trimmed. This is a transient condition. Retry after * yielding. */
Thread.yield();
continue;
}
if (server.isAlive()) {

return (server);
}
// Shouldn't actually happen.. but must be transient or a bug.
server = null;
<p>
Thread.yield();
}
return server;
}
</p>
  4.RetryRule重试
  默认先使用round-robin算法(IRule subRule = new RoundRobinRule()),再使用retry算法;
  默认是0.5s重试一次(long maxRetryMillis = 500)
<p>package com.netflix.loadbalancer;
import com.netflix.client.config.IClientConfig;
public class RetryRule extends AbstractLoadBalancerRule {

IRule subRule = new RoundRobinRule();
long maxRetryMillis = 500;
public RetryRule() {

}
public RetryRule(IRule subRule) {

this.subRule = (subRule != null) ? subRule : new RoundRobinRule();
}
public RetryRule(IRule subRule, long maxRetryMillis) {

this.subRule = (subRule != null) ? subRule : new RoundRobinRule();
this.maxRetryMillis = (maxRetryMillis > 0) ? maxRetryMillis : 500;
}
public void setRule(IRule subRule) {

this.subRule = (subRule != null) ? subRule : new RoundRobinRule();
}
public IRule getRule() {

return subRule;
}
public void setMaxRetryMillis(long maxRetryMillis) {

if (maxRetryMillis > 0) {

this.maxRetryMillis = maxRetryMillis;
} else {

this.maxRetryMillis = 500;
}
}
public long getMaxRetryMillis() {

return maxRetryMillis;
}
@Override
public void setLoadBalancer(ILoadBalancer lb) {

super.setLoadBalancer(lb);
subRule.setLoadBalancer(lb);
}
/* * Loop if necessary. Note that the time CAN be exceeded depending on the * subRule, because we're not spawning additional threads and returning * early. */
//具体重试代码
public Server choose(ILoadBalancer lb, Object key) {

long requestTime = System.currentTimeMillis();
long deadline = requestTime + maxRetryMillis;
Server answer = null;
answer = subRule.choose(key);
if (((answer == null) || (!answer.isAlive()))
&& (System.currentTimeMillis()

解决方案:UNDO自动管理和手工管理、闪回操作、表空间的空间管理算法

采集交流优采云 发表了文章 • 0 个评论 • 39 次浏览 • 2022-11-24 04:37 • 来自相关话题

  解决方案:UNDO自动管理和手工管理、闪回操作、表空间的空间管理算法
  撤消表空间 --“ 使用回滚段在数据修改前保存旧映像
  如何管理回滚段:
  SQL>
SQL> show parameter undo_management

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
SQL> show parameter undo_tablespace

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace string UNDOTBS1
SQL>
  SQL>
SQL>
SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/system01.dbf
/u02/oradata/CDB1/sysaux01.dbf
/u02/oradata/CDB1/undotbs01.dbf
/u02/oradata/CDB1/pdbseed/system01.dbf
/u02/oradata/CDB1/pdbseed/sysaux01.dbf
/u02/oradata/CDB1/users01.dbf
/u02/oradata/CDB1/pdbseed/undotbs01.dbf
/u02/oradata/CDB1/pdb1/system01.dbf
/u02/oradata/CDB1/pdb1/sysaux01.dbf
/u02/oradata/CDB1/pdb1/undotbs01.dbf
/u02/oradata/CDB1/pdb1/users01.dbf

11 rows selected.

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT
SQL>
SQL> alter session set container=PDB1;

Session altered.

SQL> create undo tablespace undotbs2 datafile &#39;/u02/oradata/CDB1/pdb1/undotbs02.dbf&#39; size 10m;

Tablespace created.

SQL>
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;

SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_3588498444$ UNDOTBS1 ONLINE
_SYSSMU2_2971032042$ UNDOTBS1 ONLINE
_SYSSMU3_3657342154$ UNDOTBS1 ONLINE
_SYSSMU4_811969446$ UNDOTBS1 ONLINE
_SYSSMU5_3018429039$ UNDOTBS1 ONLINE
_SYSSMU6_442110264$ UNDOTBS1 ONLINE
_SYSSMU7_2728255665$ UNDOTBS1 ONLINE
_SYSSMU8_801938064$ UNDOTBS1 ONLINE
_SYSSMU9_647420285$ UNDOTBS1 ONLINE
_SYSSMU10_2262159254$ UNDOTBS1 ONLINE

SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
_SYSSMU11_2950309372$ UNDOTBS2 OFFLINE
_SYSSMU12_3550765581$ UNDOTBS2 OFFLINE
_SYSSMU13_2003268147$ UNDOTBS2 OFFLINE
_SYSSMU14_200385032$ UNDOTBS2 OFFLINE
_SYSSMU15_2315478656$ UNDOTBS2 OFFLINE
_SYSSMU16_3694721358$ UNDOTBS2 OFFLINE
_SYSSMU17_302315325$ UNDOTBS2 OFFLINE
_SYSSMU18_2589589835$ UNDOTBS2 OFFLINE
_SYSSMU19_2290367767$ UNDOTBS2 OFFLINE
_SYSSMU20_459963109$ UNDOTBS2 OFFLINE

21 rows selected.

SQL>
  SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/system01.dbf
/u02/oradata/CDB1/sysaux01.dbf
/u02/oradata/CDB1/undotbs01.dbf
/u02/oradata/CDB1/pdbseed/system01.dbf
/u02/oradata/CDB1/pdbseed/sysaux01.dbf
/u02/oradata/CDB1/users01.dbf
/u02/oradata/CDB1/pdbseed/undotbs01.dbf
/u02/oradata/CDB1/pdb1/system01.dbf
/u02/oradata/CDB1/pdb1/sysaux01.dbf
/u02/oradata/CDB1/pdb1/undotbs01.dbf
/u02/oradata/CDB1/pdb1/users01.dbf
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/pdb1/undotbs02.dbf
12 rows selected.
SQL> create undo tablespace undotbs2 datafile &#39;/u02/oradata/CDB1/undotbs02.dbf&#39; size 10m;
Tablespace created.
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/system01.dbf
/u02/oradata/CDB1/sysaux01.dbf
/u02/oradata/CDB1/undotbs01.dbf
/u02/oradata/CDB1/pdbseed/system01.dbf
/u02/oradata/CDB1/pdbseed/sysaux01.dbf
/u02/oradata/CDB1/users01.dbf
/u02/oradata/CDB1/pdbseed/undotbs01.dbf
/u02/oradata/CDB1/pdb1/system01.dbf
/u02/oradata/CDB1/pdb1/sysaux01.dbf
/u02/oradata/CDB1/pdb1/undotbs01.dbf
/u02/oradata/CDB1/pdb1/users01.dbf
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/pdb1/undotbs02.dbf
/u02/oradata/CDB1/undotbs02.dbf
13 rows selected.
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_1261223759$ UNDOTBS1 ONLINE
_SYSSMU2_27624015$ UNDOTBS1 ONLINE
_SYSSMU3_2421748942$ UNDOTBS1 ONLINE
_SYSSMU4_625702278$ UNDOTBS1 ONLINE
_SYSSMU5_2101348960$ UNDOTBS1 ONLINE
_SYSSMU6_813816332$ UNDOTBS1 ONLINE
_SYSSMU7_2329891355$ UNDOTBS1 ONLINE
_SYSSMU8_399776867$ UNDOTBS1 ONLINE
_SYSSMU9_1692468413$ UNDOTBS1 ONLINE
_SYSSMU10_930580995$ UNDOTBS1 ONLINE
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
_SYSSMU11_819496071$ UNDOTBS2 OFFLINE
_SYSSMU12_3852438105$ UNDOTBS2 OFFLINE
_SYSSMU13_4053449264$ UNDOTBS2 OFFLINE
_SYSSMU14_3568283922$ UNDOTBS2 OFFLINE
_SYSSMU15_4273800205$ UNDOTBS2 OFFLINE
_SYSSMU16_3358818169$ UNDOTBS2 OFFLINE
_SYSSMU17_1656102559$ UNDOTBS2 OFFLINE
_SYSSMU18_3046128593$ UNDOTBS2 OFFLINE
_SYSSMU19_2820437463$ UNDOTBS2 OFFLINE
_SYSSMU20_1569246834$ UNDOTBS2 OFFLINE
21 rows selected.
SQL>
  SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/system01.dbf
/u02/oradata/CDB1/sysaux01.dbf
/u02/oradata/CDB1/undotbs01.dbf
/u02/oradata/CDB1/pdbseed/system01.dbf
/u02/oradata/CDB1/pdbseed/sysaux01.dbf
/u02/oradata/CDB1/users01.dbf
/u02/oradata/CDB1/pdbseed/undotbs01.dbf
/u02/oradata/CDB1/pdb1/system01.dbf
/u02/oradata/CDB1/pdb1/sysaux01.dbf
/u02/oradata/CDB1/pdb1/undotbs01.dbf
/u02/oradata/CDB1/pdb1/users01.dbf
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/pdb1/undotbs02.dbf
12 rows selected.
SQL> create undo tablespace undotbs2 datafile &#39;/u02/oradata/CDB1/undotbs02.dbf&#39; size 10m;
Tablespace created.
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/system01.dbf
/u02/oradata/CDB1/sysaux01.dbf
/u02/oradata/CDB1/undotbs01.dbf
/u02/oradata/CDB1/pdbseed/system01.dbf
/u02/oradata/CDB1/pdbseed/sysaux01.dbf
/u02/oradata/CDB1/users01.dbf
/u02/oradata/CDB1/pdbseed/undotbs01.dbf
/u02/oradata/CDB1/pdb1/system01.dbf
/u02/oradata/CDB1/pdb1/sysaux01.dbf
/u02/oradata/CDB1/pdb1/undotbs01.dbf
/u02/oradata/CDB1/pdb1/users01.dbf
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/pdb1/undotbs02.dbf
/u02/oradata/CDB1/undotbs02.dbf
13 rows selected.
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_1261223759$ UNDOTBS1 ONLINE
_SYSSMU2_27624015$ UNDOTBS1 ONLINE
_SYSSMU3_2421748942$ UNDOTBS1 ONLINE
_SYSSMU4_625702278$ UNDOTBS1 ONLINE
_SYSSMU5_2101348960$ UNDOTBS1 ONLINE
_SYSSMU6_813816332$ UNDOTBS1 ONLINE
_SYSSMU7_2329891355$ UNDOTBS1 ONLINE
_SYSSMU8_399776867$ UNDOTBS1 ONLINE
_SYSSMU9_1692468413$ UNDOTBS1 ONLINE
_SYSSMU10_930580995$ UNDOTBS1 ONLINE
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
_SYSSMU11_819496071$ UNDOTBS2 OFFLINE
_SYSSMU12_3852438105$ UNDOTBS2 OFFLINE
_SYSSMU13_4053449264$ UNDOTBS2 OFFLINE
_SYSSMU14_3568283922$ UNDOTBS2 OFFLINE
_SYSSMU15_4273800205$ UNDOTBS2 OFFLINE
_SYSSMU16_3358818169$ UNDOTBS2 OFFLINE
_SYSSMU17_1656102559$ UNDOTBS2 OFFLINE
_SYSSMU18_3046128593$ UNDOTBS2 OFFLINE
_SYSSMU19_2820437463$ UNDOTBS2 OFFLINE
_SYSSMU20_1569246834$ UNDOTBS2 OFFLINE
21 rows selected.
SQL> show user
USER is "SYS"
SQL> col username for a10
SQL> select s.USERNAME,t.XIDUSN,t.USED_UBLK from v$session s, v$transaction t where t.SES_ADDR=s.SADDR;
USERNAME XIDUSN USED_UBLK
---------- ---------- ----------
SCOTT 8 20
SCOTT 2 1
SQL>
SQL> select name from v$rollname where usn=8;
NAME
------------------------------
_SYSSMU8_399776867$
SQL> select name from v$rollname where usn=2;
NAME
------------------------------
_SYSSMU2_27624015$
SQL>
  撤消手动管理
  SQL>
SQL> show parameter undo_management
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
SQL> show parameter undo_tablespace
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace string UNDOTBS1
SQL>
SQL> alter system set undo_management=manual scope=spfile
2 ;
System altered.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>
SQL> startup
ORACLE instance started.
Total System Global Area 629145392 bytes
Fixed Size 9137968 bytes
Variable Size 184549376 bytes
Database Buffers 427819008 bytes
Redo Buffers 7639040 bytes
Database mounted.
Database opened.
SQL> show parameter undo_management
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string MANUAL
SQL>
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_1261223759$ UNDOTBS1 OFFLINE
_SYSSMU2_27624015$ UNDOTBS1 OFFLINE
_SYSSMU3_2421748942$ UNDOTBS1 OFFLINE
_SYSSMU4_625702278$ UNDOTBS1 OFFLINE
_SYSSMU5_2101348960$ UNDOTBS1 OFFLINE
_SYSSMU6_813816332$ UNDOTBS1 OFFLINE
_SYSSMU7_2329891355$ UNDOTBS1 OFFLINE
_SYSSMU8_399776867$ UNDOTBS1 OFFLINE
_SYSSMU9_1692468413$ UNDOTBS1 OFFLINE
_SYSSMU10_930580995$ UNDOTBS1 OFFLINE
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
_SYSSMU11_819496071$ UNDOTBS2 OFFLINE
_SYSSMU12_3852438105$ UNDOTBS2 OFFLINE
_SYSSMU13_4053449264$ UNDOTBS2 OFFLINE
_SYSSMU14_3568283922$ UNDOTBS2 OFFLINE
_SYSSMU15_4273800205$ UNDOTBS2 OFFLINE
_SYSSMU16_3358818169$ UNDOTBS2 OFFLINE
_SYSSMU17_1656102559$ UNDOTBS2 OFFLINE
_SYSSMU18_3046128593$ UNDOTBS2 OFFLINE
_SYSSMU19_2820437463$ UNDOTBS2 OFFLINE
_SYSSMU20_1569246834$ UNDOTBS2 OFFLINE
21 rows selected.
SQL>
  切换到手动管理 UNDO 表空间以执行更新语句时,会遇到以下错误:
  [oracle@oracle-db-19c ~]$
[oracle@oracle-db-19c ~]$ sqlplus scott/tiger@PDB1
SQL*Plus: Release 19.0.0.0.0 - Production on Wed Nov 23 11:04:26 2022
<p>
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Last Successful login time: Wed Nov 23 2022 10:46:24 +08:00
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> show user
USER is "SCOTT"
SQL>
SQL> set pagesize 200
SQL> set linesize 200
SQL>
SQL> update e01 set sal=sal+1;
update e01 set sal=sal+1
*
ERROR at line 1:
ORA-01552: cannot use system rollback segment for non-system tablespace &#39;USERS&#39;
SQL> </p>
  将表 e01 移动到系统表空间后,表更新可用。
  SQL>
SQL> alter table e01 move tablespace system;
Table altered.
SQL>
SQL> update e01 set sal=sal+1;
14 rows updated.
SQL> roll
Rollback complete.
SQL>
SQL>
  尝试在 Scott 用户下进行表构建实验:
  SQL>
SQL>
SQL> select * from tab
2 ;
TNAME TABTYPE CLUSTERID
-------------------------------------------------------------------------------------------------------------------------------- ------------- ----------
T02 TABLE
T01 TABLE
T03 TABLE
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
DETAIL_DEPT TABLE
VU10 VIEW
VUTEST VIEW
E01 TABLE
TEMP TABLE
TEMP02 TABLE
OB1 TABLE
14 rows selected.
SQL>
SQL>
SQL>
SQL> create table e02 as select * from emp;
create table e02 as select * from emp
*
ERROR at line 1:
ORA-01552: cannot use system rollback segment for non-system tablespace &#39;USERS&#39;
SQL> desc e02;
ERROR:
ORA-04043: object e02 does not exist
SQL> create table e02 as select * from emp where 1=0;
Table created.
SQL> desc e02;
Name Null? Type
----------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------
EMPNO NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
SQL>
  结论:可以创建一个空表,但不能创建收录
数据的表。表之所以能成功,是因为deferred_segment_creation是开放的。(延迟段创建)。
  SQL>显示参数段
  名称类型值
  ------------------------------------ ----------- ------------------------------
  deferred_segment_creation布尔值为 TRUE
  rollback_segments字符串
  transactions_per_rollback_segment整数 5
  SQL>
  让我们尝试关闭此延迟分段创建,以查看 SCOTT 用户是否可以继续创建表?如下图所示:
  [oracle@oracle-db-19c ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Wed Nov 23 15:55:34 2022
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> alter session set container=PDB1;
Session altered.
SQL> show con_name;
CON_NAME
------------------------------
PDB1
SQL> show parameter segment
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation boolean TRUE
rollback_segments string
transactions_per_rollback_segment integer 5
SQL> alter system set deferred_segment_creation=FALSE;
System altered.
SQL> show parameter segment
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation boolean FALSE
rollback_segments string
transactions_per_rollback_segment integer 5
SQL>
  结论是,您可以简单地创建一个没有数据的表,但不能创建一个带有数字的表。
  SQL> create table e02 as select * from emp;
create table e02 as select * from emp
*
ERROR at line 1:
ORA-01552: cannot use system rollback segment for non-system tablespace &#39;USERS&#39;
SQL> create table e03 as select * from emp where 1=0;
Table created.
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
-------------------------------------------------------------------------------------------------------------------------------- ------------- ----------
T02 TABLE
T01 TABLE
T03 TABLE
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
DETAIL_DEPT TABLE
VU10 VIEW
VUTEST VIEW
E01 TABLE
TEMP TABLE
TEMP02 TABLE
E03 TABLE
OB1 TABLE
15 rows selected.
SQL>
  手动管理回滚段:
  创建回滚段 RBS1 表空间 UNDOTBS1;
  创建回滚段 RBS2 表空间 UNDOTBS1;
  创建回滚段 RBS3 表空间 UNDOTBS1;
  更改系统集 rollback_segments=&#39;RBS1&#39;,&#39;RBS2&#39;, &#39;RBS3&#39; 范围=spfile;
  SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_3588498444$ UNDOTBS1 OFFLINE
_SYSSMU2_2971032042$ UNDOTBS1 OFFLINE
_SYSSMU3_3657342154$ UNDOTBS1 OFFLINE
_SYSSMU4_811969446$ UNDOTBS1 OFFLINE
_SYSSMU5_3018429039$ UNDOTBS1 OFFLINE
_SYSSMU6_442110264$ UNDOTBS1 OFFLINE
_SYSSMU7_2728255665$ UNDOTBS1 OFFLINE
_SYSSMU8_801938064$ UNDOTBS1 OFFLINE
_SYSSMU9_647420285$ UNDOTBS1 OFFLINE
_SYSSMU10_2262159254$ UNDOTBS1 OFFLINE
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
_SYSSMU11_2950309372$ UNDOTBS2 OFFLINE
_SYSSMU12_3550765581$ UNDOTBS2 OFFLINE
_SYSSMU13_2003268147$ UNDOTBS2 OFFLINE
_SYSSMU14_200385032$ UNDOTBS2 OFFLINE
_SYSSMU15_2315478656$ UNDOTBS2 OFFLINE
_SYSSMU16_3694721358$ UNDOTBS2 OFFLINE
_SYSSMU17_302315325$ UNDOTBS2 OFFLINE
_SYSSMU18_2589589835$ UNDOTBS2 OFFLINE
_SYSSMU19_2290367767$ UNDOTBS2 OFFLINE
_SYSSMU20_459963109$ UNDOTBS2 OFFLINE
21 rows selected.
SQL> create rollback segment rbs1 tablespace UNDOTBS1;
Rollback segment created.
SQL>
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_3588498444$ UNDOTBS1 OFFLINE
_SYSSMU2_2971032042$ UNDOTBS1 OFFLINE
_SYSSMU3_3657342154$ UNDOTBS1 OFFLINE
_SYSSMU4_811969446$ UNDOTBS1 OFFLINE
_SYSSMU5_3018429039$ UNDOTBS1 OFFLINE
_SYSSMU6_442110264$ UNDOTBS1 OFFLINE
_SYSSMU7_2728255665$ UNDOTBS1 OFFLINE
_SYSSMU8_801938064$ UNDOTBS1 OFFLINE
_SYSSMU9_647420285$ UNDOTBS1 OFFLINE
_SYSSMU10_2262159254$ UNDOTBS1 OFFLINE
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
RBS1 UNDOTBS1 OFFLINE
_SYSSMU11_2950309372$ UNDOTBS2 OFFLINE
_SYSSMU12_3550765581$ UNDOTBS2 OFFLINE
_SYSSMU13_2003268147$ UNDOTBS2 OFFLINE
_SYSSMU14_200385032$ UNDOTBS2 OFFLINE
_SYSSMU15_2315478656$ UNDOTBS2 OFFLINE
_SYSSMU16_3694721358$ UNDOTBS2 OFFLINE
_SYSSMU17_302315325$ UNDOTBS2 OFFLINE
_SYSSMU18_2589589835$ UNDOTBS2 OFFLINE
_SYSSMU19_2290367767$ UNDOTBS2 OFFLINE
_SYSSMU20_459963109$ UNDOTBS2 OFFLINE
22 rows selected.
SQL>
  SQL> show parameter rollback
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
fast_start_parallel_rollback string LOW
rollback_segments string
transactions_per_rollback_segment integer 5
SQL>
SQL> shutdown immediate
Pluggable Database closed.
SQL> startup
Pluggable Database opened.
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_3588498444$ UNDOTBS1 OFFLINE
_SYSSMU2_2971032042$ UNDOTBS1 OFFLINE
_SYSSMU3_3657342154$ UNDOTBS1 OFFLINE
_SYSSMU4_811969446$ UNDOTBS1 OFFLINE
_SYSSMU5_3018429039$ UNDOTBS1 OFFLINE
_SYSSMU6_442110264$ UNDOTBS1 OFFLINE
_SYSSMU7_2728255665$ UNDOTBS1 OFFLINE
_SYSSMU8_801938064$ UNDOTBS1 OFFLINE
_SYSSMU9_647420285$ UNDOTBS1 OFFLINE
_SYSSMU10_2262159254$ UNDOTBS1 OFFLINE
RBS1 UNDOTBS1 OFFLINE
_SYSSMU11_2950309372$ UNDOTBS2 OFFLINE
_SYSSMU12_3550765581$ UNDOTBS2 OFFLINE
_SYSSMU13_2003268147$ UNDOTBS2 OFFLINE
_SYSSMU14_200385032$ UNDOTBS2 OFFLINE
_SYSSMU15_2315478656$ UNDOTBS2 OFFLINE
_SYSSMU16_3694721358$ UNDOTBS2 OFFLINE
_SYSSMU17_302315325$ UNDOTBS2 OFFLINE
_SYSSMU18_2589589835$ UNDOTBS2 OFFLINE
_SYSSMU19_2290367767$ UNDOTBS2 OFFLINE
_SYSSMU20_459963109$ UNDOTBS2 OFFLINE
22 rows selected.
SQL>
SQL>
SQL> alter system set rollback_segments=&#39;RBS1&#39; scope=spfile;
System altered.
SQL> startup force
Pluggable Database opened.
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_3588498444$ UNDOTBS1 OFFLINE
_SYSSMU2_2971032042$ UNDOTBS1 OFFLINE
_SYSSMU3_3657342154$ UNDOTBS1 OFFLINE
_SYSSMU4_811969446$ UNDOTBS1 OFFLINE
_SYSSMU5_3018429039$ UNDOTBS1 OFFLINE
_SYSSMU6_442110264$ UNDOTBS1 OFFLINE
_SYSSMU7_2728255665$ UNDOTBS1 OFFLINE
_SYSSMU8_801938064$ UNDOTBS1 OFFLINE
_SYSSMU9_647420285$ UNDOTBS1 OFFLINE
_SYSSMU10_2262159254$ UNDOTBS1 OFFLINE
RBS1 UNDOTBS1 ONLINE
_SYSSMU11_2950309372$ UNDOTBS2 OFFLINE
_SYSSMU12_3550765581$ UNDOTBS2 OFFLINE
_SYSSMU13_2003268147$ UNDOTBS2 OFFLINE
_SYSSMU14_200385032$ UNDOTBS2 OFFLINE
_SYSSMU15_2315478656$ UNDOTBS2 OFFLINE
_SYSSMU16_3694721358$ UNDOTBS2 OFFLINE
_SYSSMU17_302315325$ UNDOTBS2 OFFLINE
_SYSSMU18_2589589835$ UNDOTBS2 OFFLINE
_SYSSMU19_2290367767$ UNDOTBS2 OFFLINE
_SYSSMU20_459963109$ UNDOTBS2 OFFLINE
22 rows selected.
SQL>
  为 DML 操作提供闪回处理
  闪回查询:
  SQL> select * from e01;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
<p>
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 24-JAN-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 02-APR-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL> update e01 set sal = 1;
14 rows updated.
SQL> commit;
Commit complete.
SQL> rollback;
Rollback complete.
SQL> select * from e01;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 1 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1 500 30
7566 JONES MANAGER 7839 02-APR-81 1 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 1 30
7782 CLARK MANAGER 7839 09-JUN-81 1 10
7788 SCOTT ANALYST 7566 24-JAN-87 1 20
7839 KING PRESIDENT 17-NOV-81 1 10
7844 TURNER SALESMAN 7698 08-SEP-81 1 0 30
7876 ADAMS CLERK 7788 02-APR-87 1 20
7900 JAMES CLERK 7698 03-DEC-81 1 30
7902 FORD ANALYST 7566 03-DEC-81 1 20
7934 MILLER CLERK 7782 23-JAN-82 1 10
14 rows selected.
SQL> select * from e01 as of timestamp(sysdate-5/1440);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 24-JAN-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 02-APR-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL> alter table e01 enable row movement;
Table altered.
SQL> flashback table e01 to timestamp(sysdate-5/1440);
Flashback complete.
SQL> select * from e01;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 24-JAN-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 02-APR-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL></p>
  您可以闪回 15 分 900 秒。
  SQL> select * from e01 as of timestamp(sysdate-15/1440);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 24-JAN-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 02-APR-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL>
  闪回版本查询
  SQL> update e01 set sal=sal+100 where deptno=10;
3 rows updated.
SQL> commit;
Commit complete.
SQL> update e01 set sal=sal*1.1 where deptno=30;
6 rows updated.
SQL> commit;
Commit complete.
SQL> update e01 set sal=3;
14 rows updated.
SQL> commit;
Commit complete.
SQL> select * from e01;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 3 20
7499 ALLEN SALESMAN 7698 20-FEB-81 3 300 30
7521 WARD SALESMAN 7698 22-FEB-81 3 500 30
7566 JONES MANAGER 7839 02-APR-81 3 20
7654 MARTIN SALESMAN 7698 28-SEP-81 3 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 3 30
7782 CLARK MANAGER 7839 09-JUN-81 3 10
7788 SCOTT ANALYST 7566 24-JAN-87 3 20
7839 KING PRESIDENT 17-NOV-81 3 10
7844 TURNER SALESMAN 7698 08-SEP-81 3 0 30
7876 ADAMS CLERK 7788 02-APR-87 3 20
7900 JAMES CLERK 7698 03-DEC-81 3 30
7902 FORD ANALYST 7566 03-DEC-81 3 20
7934 MILLER CLERK 7782 23-JAN-82 3 10
14 rows selected.
SQL> --闪回版本查询
SQL> select versions_startscn,versions_endscn,versions_operation,versions_xid,sal from e01 versions between scn_minvalue and maxvalue where empno=7369;
select versions_startscn,versions_endscn,versions_operation,versions_xid,sal from e01 versions between scn_minvalue and maxvalue where empno=7369
*
ERROR at line 1:
ORA-00905: missing keyword
SQL> select
2 versions_startscn,
3 versions_endscn,
4 versions_operation,
5 versions_xid,
6 sal
7 from e01
8 versions between scn minvalue and maxvalue
9 where empno=7369;
VERSIONS_STARTSCN VERSIONS_ENDSCN V VERSIONS_XID SAL
----------------- --------------- - ---------------- ----------
17826843 U 03000300BC030000 3
17826652 17826843 I 070010006E030000 800
17826652 D 070010006E030000 1
17825320 17826652 U 03002000BB030000 1
17825320 800
SQL>
SQL> col versions_starttime for a25;
SQL> col versions_endtime for a25;
SQL> select
2 versions_starttime
3 versions_endtime,
4 --versions_startscn,
5 --versions_endscn,
6 versions_operation,
7 versions_xid,
8 sal
9 from e01
10 versions between scn minvalue and maxvalue
11 where empno=7369;
VERSIONS_ENDTIME V VERSIONS_XID SAL
------------------------- - ---------------- ----------
23-NOV-22 09.55.07 PM U 03000300BC030000 3
23-NOV-22 09.50.16 PM I 070010006E030000 800
23-NOV-22 09.50.16 PM D 070010006E030000 1
1
SQL> --闪回版本查询
SQL> select * from e01 as of scn 17826652;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 24-JAN-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 02-APR-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL> flashback table e01 to scn 17826652;
Flashback complete.
SQL> select * from e01;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 24-JAN-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 02-APR-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL>
  注意:为了进行闪回表操作,您必须首先打开行移动,如果不打开行移动,您将无法执行闪回操作。
  SQL> alter table e01 enable row movement;
Table altered.
  启用追加日志数据模式:
  SQL>
SQL> alter database add supplemental log data;
Database altered.
SQL>
  SQL>
SQL> update e01 set sal=sal*1.15 where deptno=30;
6 rows updated.
SQL>
SQL> select
2 --versions_starttime
3 --versions_endtime,
4 versions_startscn,
5 versions_endscn,
6 versions_operation,
7 versions_xid,
8 sal
9 from e01
10 versions between scn minvalue and maxvalue
11 where empno=7844;
VERSIONS_STARTSCN VERSIONS_ENDSCN V VERSIONS_XID SAL
----------------- --------------- - ---------------- ----------
17846142 I 02000B0061030000 1500
17846142 D 02000B0061030000 3
17846142 3
SQL>
  闪回事务查询
  
select
--versions_starttime
--versions_endtime,
versions_startscn,
versions_endscn,
versions_operation,
versions_xid,
sal
from e01
versions between scn minvalue and maxvalue
where empno=7844;
---闪回事务查询,sys用户才可以查询
SQL> select undo_sql from flashback_transaction_query where xid=&#39;02000B0061030000&#39;;
UNDO_SQL
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
16 rows selected.
SQL>
  事实:大数据采集手段_大数据采集和处理的内容
  大数据采集方式_大数据采集处理内容 大数据开启了数据大规模生产、共享和应用的时代,给技术和商业带来了巨大的变革。麦肯锡研究表明,在医疗、零售和制造领域,大数据每年可以提高劳动生产率0.5-1个百分点。大数据在核心领域的渗透速度是有目共睹的。但调查显示,未被利用的信息比例高达99.4%,这很大程度上是由于无法获取和采集
高价值信息。因此,在大数据时代的背景下,如何从大数据中采集
有用的信息已经是大数据发展的关键因素之一,那么什么是大数据...
  大家好,我是建筑先生,一个会写代码会吟诗的架构师。今天就来说说大数据采集的手段_大数据采集处理的内容,希望能帮助大家进步!!!
  大数据开启了数据大规模生产、共享和应用的时代,给技术和商业带来了巨大变革。麦肯锡研究表明,在医疗、零售和制造领域,大数据每年可以提高劳动生产率0.5-1个百分点。大数据在核心领域的渗透速度是有目共睹的。但调查显示,未被利用的信息比例高达99.4%,这很大程度上是由于无法获取和采集
高价值信息。因此,在大数据时代的背景下,如何从大数据中采集
有用的信息已经是大数据发展的关键因素之一,那么什么是大数据采集
技术呢?本期为大家介绍大数据采集技术,
  ▌什么是数据采集

  数据采集​​(Data Acquisition,DAQ),又称数据采集,是指从传感器等被测器件等模拟和数字被测单元自动采集信息的过程。数据分类 在新一代数据体系中,对传统数据体系中没有考虑到的新数据源进行归纳和分类,可分为上网行为数据和内容数据两大类。
  上网行为数据:页面数据、交互数据、表单数据、会话数据等。
  内容数据:应用日志、电子文档、机器数据、语音数据、社交媒体数据等。
  大数据的主要来源:1)商业数据2)互联网数据3)传感器数据
  ▌数据采集与大数据采集的区别
  
  ▌传统数据采集的不足
  传统的数据采集来源单一,存储、管理和分析的数据量较小,大部分可以通过关系数据库和并行数据仓库进行处理。在依靠并行计算提高数据处理速度方面,传统的并行数据库技术追求高一致性和容错性。按照CAP理论,其可用性和可扩展性是很难保证的。
  ▌大数据采集新方法
  系统日志采集
方法
  很多互联网公司都有自己的海量数据采集工具,多用于系统日志采集,比如Hadoop的Chukwa、Cloudera的Flume、Facebook的Scribe等,这些工具采用分布式架构,可以满足单机上百MB的日志数据第二。采集和传输要求。
  网络数据获取方式
  网络数据采集是指通过网络爬虫或网站公共API从网站获取数据信息。该方法可以将网页中的非结构化数据提取出来,存储为统一的本地数据文件,并进行结构化存储。支持图片、音频、视频等文件或附件的采集
,附件与文本可自动关联。除了网络中收录
的内容外,还可以使用 DPI 或 DFI 等带宽管理技术处理网络流量的采集

  其他数据采集
方法
  对于企业生产经营数据或学科研究数据等保密要求高的数据,可通过与企业或研究机构合作,采用特定系统接口等相关方式采集
数据。
  ▌大数据采集平台
  
  最后给大家介绍几个应用广泛的大数据采集平台,供大家参考。
  1)阿帕奇水槽
  Flume是Apache下一个开源、高可靠、高扩展、易于管理、支持客户扩展的数据采集系统。Flume是使用JRuby构建的,所以它依赖于Java运行环境。
  2)流利
  Fluentd 是另一个开源数据采集
框架。Fluentd使用C/Ruby开发,使用JSON文件统一日志数据。其可插拔架构支持各种类型和格式的数据源和数据输出。最后,它还同时提供了高可靠性和良好的可扩展性。Treasure Data, Inc 为该产品提供支持和维护。
  3) 日志存储
  Logstash是著名的开源数据栈ELK(ElasticSearch、Logstash、Kibana)中的L。Logstash 使用 JRuby 开发,所有运行时都依赖于 JVM。
  4)Splunk转发器
  Splunk 是一个分布式机器数据平台,主要有三个角色: Search Head 负责数据的搜索和处理,提供搜索过程中的信息提取;Indexer负责数据的存储和索引;Forwarder负责数据的采集、清洗、变形,并发送给Indexer
  很多初学者对大数据的概念比较模糊。什么是大数据,它能做什么,什么时候学,应该走什么路线,学完后往哪里发展,想了解更多,想学习欢迎同学们加入大数据学习扣群:805127855,里面有海量干货(零基础进阶经典实战)分享给大家,更有清华毕业资深大数据讲师免费授课,分享国内最全。大数据高端实战实战学习流程体系 查看全部

  解决方案:UNDO自动管理和手工管理、闪回操作、表空间的空间管理算法
  撤消表空间 --“ 使用回滚段在数据修改前保存旧映像
  如何管理回滚段:
  SQL>
SQL> show parameter undo_management

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
SQL> show parameter undo_tablespace

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace string UNDOTBS1
SQL>
  SQL>
SQL>
SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/system01.dbf
/u02/oradata/CDB1/sysaux01.dbf
/u02/oradata/CDB1/undotbs01.dbf
/u02/oradata/CDB1/pdbseed/system01.dbf
/u02/oradata/CDB1/pdbseed/sysaux01.dbf
/u02/oradata/CDB1/users01.dbf
/u02/oradata/CDB1/pdbseed/undotbs01.dbf
/u02/oradata/CDB1/pdb1/system01.dbf
/u02/oradata/CDB1/pdb1/sysaux01.dbf
/u02/oradata/CDB1/pdb1/undotbs01.dbf
/u02/oradata/CDB1/pdb1/users01.dbf

11 rows selected.

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT
SQL>
SQL> alter session set container=PDB1;

Session altered.

SQL> create undo tablespace undotbs2 datafile &#39;/u02/oradata/CDB1/pdb1/undotbs02.dbf&#39; size 10m;

Tablespace created.

SQL>
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;

SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_3588498444$ UNDOTBS1 ONLINE
_SYSSMU2_2971032042$ UNDOTBS1 ONLINE
_SYSSMU3_3657342154$ UNDOTBS1 ONLINE
_SYSSMU4_811969446$ UNDOTBS1 ONLINE
_SYSSMU5_3018429039$ UNDOTBS1 ONLINE
_SYSSMU6_442110264$ UNDOTBS1 ONLINE
_SYSSMU7_2728255665$ UNDOTBS1 ONLINE
_SYSSMU8_801938064$ UNDOTBS1 ONLINE
_SYSSMU9_647420285$ UNDOTBS1 ONLINE
_SYSSMU10_2262159254$ UNDOTBS1 ONLINE

SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
_SYSSMU11_2950309372$ UNDOTBS2 OFFLINE
_SYSSMU12_3550765581$ UNDOTBS2 OFFLINE
_SYSSMU13_2003268147$ UNDOTBS2 OFFLINE
_SYSSMU14_200385032$ UNDOTBS2 OFFLINE
_SYSSMU15_2315478656$ UNDOTBS2 OFFLINE
_SYSSMU16_3694721358$ UNDOTBS2 OFFLINE
_SYSSMU17_302315325$ UNDOTBS2 OFFLINE
_SYSSMU18_2589589835$ UNDOTBS2 OFFLINE
_SYSSMU19_2290367767$ UNDOTBS2 OFFLINE
_SYSSMU20_459963109$ UNDOTBS2 OFFLINE

21 rows selected.

SQL>
  SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/system01.dbf
/u02/oradata/CDB1/sysaux01.dbf
/u02/oradata/CDB1/undotbs01.dbf
/u02/oradata/CDB1/pdbseed/system01.dbf
/u02/oradata/CDB1/pdbseed/sysaux01.dbf
/u02/oradata/CDB1/users01.dbf
/u02/oradata/CDB1/pdbseed/undotbs01.dbf
/u02/oradata/CDB1/pdb1/system01.dbf
/u02/oradata/CDB1/pdb1/sysaux01.dbf
/u02/oradata/CDB1/pdb1/undotbs01.dbf
/u02/oradata/CDB1/pdb1/users01.dbf
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/pdb1/undotbs02.dbf
12 rows selected.
SQL> create undo tablespace undotbs2 datafile &#39;/u02/oradata/CDB1/undotbs02.dbf&#39; size 10m;
Tablespace created.
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/system01.dbf
/u02/oradata/CDB1/sysaux01.dbf
/u02/oradata/CDB1/undotbs01.dbf
/u02/oradata/CDB1/pdbseed/system01.dbf
/u02/oradata/CDB1/pdbseed/sysaux01.dbf
/u02/oradata/CDB1/users01.dbf
/u02/oradata/CDB1/pdbseed/undotbs01.dbf
/u02/oradata/CDB1/pdb1/system01.dbf
/u02/oradata/CDB1/pdb1/sysaux01.dbf
/u02/oradata/CDB1/pdb1/undotbs01.dbf
/u02/oradata/CDB1/pdb1/users01.dbf
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/pdb1/undotbs02.dbf
/u02/oradata/CDB1/undotbs02.dbf
13 rows selected.
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_1261223759$ UNDOTBS1 ONLINE
_SYSSMU2_27624015$ UNDOTBS1 ONLINE
_SYSSMU3_2421748942$ UNDOTBS1 ONLINE
_SYSSMU4_625702278$ UNDOTBS1 ONLINE
_SYSSMU5_2101348960$ UNDOTBS1 ONLINE
_SYSSMU6_813816332$ UNDOTBS1 ONLINE
_SYSSMU7_2329891355$ UNDOTBS1 ONLINE
_SYSSMU8_399776867$ UNDOTBS1 ONLINE
_SYSSMU9_1692468413$ UNDOTBS1 ONLINE
_SYSSMU10_930580995$ UNDOTBS1 ONLINE
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
_SYSSMU11_819496071$ UNDOTBS2 OFFLINE
_SYSSMU12_3852438105$ UNDOTBS2 OFFLINE
_SYSSMU13_4053449264$ UNDOTBS2 OFFLINE
_SYSSMU14_3568283922$ UNDOTBS2 OFFLINE
_SYSSMU15_4273800205$ UNDOTBS2 OFFLINE
_SYSSMU16_3358818169$ UNDOTBS2 OFFLINE
_SYSSMU17_1656102559$ UNDOTBS2 OFFLINE
_SYSSMU18_3046128593$ UNDOTBS2 OFFLINE
_SYSSMU19_2820437463$ UNDOTBS2 OFFLINE
_SYSSMU20_1569246834$ UNDOTBS2 OFFLINE
21 rows selected.
SQL>
  SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/system01.dbf
/u02/oradata/CDB1/sysaux01.dbf
/u02/oradata/CDB1/undotbs01.dbf
/u02/oradata/CDB1/pdbseed/system01.dbf
/u02/oradata/CDB1/pdbseed/sysaux01.dbf
/u02/oradata/CDB1/users01.dbf
/u02/oradata/CDB1/pdbseed/undotbs01.dbf
/u02/oradata/CDB1/pdb1/system01.dbf
/u02/oradata/CDB1/pdb1/sysaux01.dbf
/u02/oradata/CDB1/pdb1/undotbs01.dbf
/u02/oradata/CDB1/pdb1/users01.dbf
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/pdb1/undotbs02.dbf
12 rows selected.
SQL> create undo tablespace undotbs2 datafile &#39;/u02/oradata/CDB1/undotbs02.dbf&#39; size 10m;
Tablespace created.
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/system01.dbf
/u02/oradata/CDB1/sysaux01.dbf
/u02/oradata/CDB1/undotbs01.dbf
/u02/oradata/CDB1/pdbseed/system01.dbf
/u02/oradata/CDB1/pdbseed/sysaux01.dbf
/u02/oradata/CDB1/users01.dbf
/u02/oradata/CDB1/pdbseed/undotbs01.dbf
/u02/oradata/CDB1/pdb1/system01.dbf
/u02/oradata/CDB1/pdb1/sysaux01.dbf
/u02/oradata/CDB1/pdb1/undotbs01.dbf
/u02/oradata/CDB1/pdb1/users01.dbf
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/pdb1/undotbs02.dbf
/u02/oradata/CDB1/undotbs02.dbf
13 rows selected.
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_1261223759$ UNDOTBS1 ONLINE
_SYSSMU2_27624015$ UNDOTBS1 ONLINE
_SYSSMU3_2421748942$ UNDOTBS1 ONLINE
_SYSSMU4_625702278$ UNDOTBS1 ONLINE
_SYSSMU5_2101348960$ UNDOTBS1 ONLINE
_SYSSMU6_813816332$ UNDOTBS1 ONLINE
_SYSSMU7_2329891355$ UNDOTBS1 ONLINE
_SYSSMU8_399776867$ UNDOTBS1 ONLINE
_SYSSMU9_1692468413$ UNDOTBS1 ONLINE
_SYSSMU10_930580995$ UNDOTBS1 ONLINE
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
_SYSSMU11_819496071$ UNDOTBS2 OFFLINE
_SYSSMU12_3852438105$ UNDOTBS2 OFFLINE
_SYSSMU13_4053449264$ UNDOTBS2 OFFLINE
_SYSSMU14_3568283922$ UNDOTBS2 OFFLINE
_SYSSMU15_4273800205$ UNDOTBS2 OFFLINE
_SYSSMU16_3358818169$ UNDOTBS2 OFFLINE
_SYSSMU17_1656102559$ UNDOTBS2 OFFLINE
_SYSSMU18_3046128593$ UNDOTBS2 OFFLINE
_SYSSMU19_2820437463$ UNDOTBS2 OFFLINE
_SYSSMU20_1569246834$ UNDOTBS2 OFFLINE
21 rows selected.
SQL> show user
USER is "SYS"
SQL> col username for a10
SQL> select s.USERNAME,t.XIDUSN,t.USED_UBLK from v$session s, v$transaction t where t.SES_ADDR=s.SADDR;
USERNAME XIDUSN USED_UBLK
---------- ---------- ----------
SCOTT 8 20
SCOTT 2 1
SQL>
SQL> select name from v$rollname where usn=8;
NAME
------------------------------
_SYSSMU8_399776867$
SQL> select name from v$rollname where usn=2;
NAME
------------------------------
_SYSSMU2_27624015$
SQL>
  撤消手动管理
  SQL>
SQL> show parameter undo_management
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
SQL> show parameter undo_tablespace
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace string UNDOTBS1
SQL>
SQL> alter system set undo_management=manual scope=spfile
2 ;
System altered.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>
SQL> startup
ORACLE instance started.
Total System Global Area 629145392 bytes
Fixed Size 9137968 bytes
Variable Size 184549376 bytes
Database Buffers 427819008 bytes
Redo Buffers 7639040 bytes
Database mounted.
Database opened.
SQL> show parameter undo_management
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string MANUAL
SQL>
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_1261223759$ UNDOTBS1 OFFLINE
_SYSSMU2_27624015$ UNDOTBS1 OFFLINE
_SYSSMU3_2421748942$ UNDOTBS1 OFFLINE
_SYSSMU4_625702278$ UNDOTBS1 OFFLINE
_SYSSMU5_2101348960$ UNDOTBS1 OFFLINE
_SYSSMU6_813816332$ UNDOTBS1 OFFLINE
_SYSSMU7_2329891355$ UNDOTBS1 OFFLINE
_SYSSMU8_399776867$ UNDOTBS1 OFFLINE
_SYSSMU9_1692468413$ UNDOTBS1 OFFLINE
_SYSSMU10_930580995$ UNDOTBS1 OFFLINE
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
_SYSSMU11_819496071$ UNDOTBS2 OFFLINE
_SYSSMU12_3852438105$ UNDOTBS2 OFFLINE
_SYSSMU13_4053449264$ UNDOTBS2 OFFLINE
_SYSSMU14_3568283922$ UNDOTBS2 OFFLINE
_SYSSMU15_4273800205$ UNDOTBS2 OFFLINE
_SYSSMU16_3358818169$ UNDOTBS2 OFFLINE
_SYSSMU17_1656102559$ UNDOTBS2 OFFLINE
_SYSSMU18_3046128593$ UNDOTBS2 OFFLINE
_SYSSMU19_2820437463$ UNDOTBS2 OFFLINE
_SYSSMU20_1569246834$ UNDOTBS2 OFFLINE
21 rows selected.
SQL>
  切换到手动管理 UNDO 表空间以执行更新语句时,会遇到以下错误:
  [oracle@oracle-db-19c ~]$
[oracle@oracle-db-19c ~]$ sqlplus scott/tiger@PDB1
SQL*Plus: Release 19.0.0.0.0 - Production on Wed Nov 23 11:04:26 2022
<p>
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Last Successful login time: Wed Nov 23 2022 10:46:24 +08:00
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> show user
USER is "SCOTT"
SQL>
SQL> set pagesize 200
SQL> set linesize 200
SQL>
SQL> update e01 set sal=sal+1;
update e01 set sal=sal+1
*
ERROR at line 1:
ORA-01552: cannot use system rollback segment for non-system tablespace &#39;USERS&#39;
SQL> </p>
  将表 e01 移动到系统表空间后,表更新可用。
  SQL>
SQL> alter table e01 move tablespace system;
Table altered.
SQL>
SQL> update e01 set sal=sal+1;
14 rows updated.
SQL> roll
Rollback complete.
SQL>
SQL>
  尝试在 Scott 用户下进行表构建实验:
  SQL>
SQL>
SQL> select * from tab
2 ;
TNAME TABTYPE CLUSTERID
-------------------------------------------------------------------------------------------------------------------------------- ------------- ----------
T02 TABLE
T01 TABLE
T03 TABLE
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
DETAIL_DEPT TABLE
VU10 VIEW
VUTEST VIEW
E01 TABLE
TEMP TABLE
TEMP02 TABLE
OB1 TABLE
14 rows selected.
SQL>
SQL>
SQL>
SQL> create table e02 as select * from emp;
create table e02 as select * from emp
*
ERROR at line 1:
ORA-01552: cannot use system rollback segment for non-system tablespace &#39;USERS&#39;
SQL> desc e02;
ERROR:
ORA-04043: object e02 does not exist
SQL> create table e02 as select * from emp where 1=0;
Table created.
SQL> desc e02;
Name Null? Type
----------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------
EMPNO NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
SQL>
  结论:可以创建一个空表,但不能创建收录
数据的表。表之所以能成功,是因为deferred_segment_creation是开放的。(延迟段创建)。
  SQL>显示参数段
  名称类型值
  ------------------------------------ ----------- ------------------------------
  deferred_segment_creation布尔值为 TRUE
  rollback_segments字符串
  transactions_per_rollback_segment整数 5
  SQL>
  让我们尝试关闭此延迟分段创建,以查看 SCOTT 用户是否可以继续创建表?如下图所示:
  [oracle@oracle-db-19c ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Wed Nov 23 15:55:34 2022
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> alter session set container=PDB1;
Session altered.
SQL> show con_name;
CON_NAME
------------------------------
PDB1
SQL> show parameter segment
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation boolean TRUE
rollback_segments string
transactions_per_rollback_segment integer 5
SQL> alter system set deferred_segment_creation=FALSE;
System altered.
SQL> show parameter segment
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation boolean FALSE
rollback_segments string
transactions_per_rollback_segment integer 5
SQL>
  结论是,您可以简单地创建一个没有数据的表,但不能创建一个带有数字的表。
  SQL> create table e02 as select * from emp;
create table e02 as select * from emp
*
ERROR at line 1:
ORA-01552: cannot use system rollback segment for non-system tablespace &#39;USERS&#39;
SQL> create table e03 as select * from emp where 1=0;
Table created.
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
-------------------------------------------------------------------------------------------------------------------------------- ------------- ----------
T02 TABLE
T01 TABLE
T03 TABLE
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
DETAIL_DEPT TABLE
VU10 VIEW
VUTEST VIEW
E01 TABLE
TEMP TABLE
TEMP02 TABLE
E03 TABLE
OB1 TABLE
15 rows selected.
SQL>
  手动管理回滚段:
  创建回滚段 RBS1 表空间 UNDOTBS1;
  创建回滚段 RBS2 表空间 UNDOTBS1;
  创建回滚段 RBS3 表空间 UNDOTBS1;
  更改系统集 rollback_segments=&#39;RBS1&#39;,&#39;RBS2&#39;, &#39;RBS3&#39; 范围=spfile;
  SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_3588498444$ UNDOTBS1 OFFLINE
_SYSSMU2_2971032042$ UNDOTBS1 OFFLINE
_SYSSMU3_3657342154$ UNDOTBS1 OFFLINE
_SYSSMU4_811969446$ UNDOTBS1 OFFLINE
_SYSSMU5_3018429039$ UNDOTBS1 OFFLINE
_SYSSMU6_442110264$ UNDOTBS1 OFFLINE
_SYSSMU7_2728255665$ UNDOTBS1 OFFLINE
_SYSSMU8_801938064$ UNDOTBS1 OFFLINE
_SYSSMU9_647420285$ UNDOTBS1 OFFLINE
_SYSSMU10_2262159254$ UNDOTBS1 OFFLINE
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
_SYSSMU11_2950309372$ UNDOTBS2 OFFLINE
_SYSSMU12_3550765581$ UNDOTBS2 OFFLINE
_SYSSMU13_2003268147$ UNDOTBS2 OFFLINE
_SYSSMU14_200385032$ UNDOTBS2 OFFLINE
_SYSSMU15_2315478656$ UNDOTBS2 OFFLINE
_SYSSMU16_3694721358$ UNDOTBS2 OFFLINE
_SYSSMU17_302315325$ UNDOTBS2 OFFLINE
_SYSSMU18_2589589835$ UNDOTBS2 OFFLINE
_SYSSMU19_2290367767$ UNDOTBS2 OFFLINE
_SYSSMU20_459963109$ UNDOTBS2 OFFLINE
21 rows selected.
SQL> create rollback segment rbs1 tablespace UNDOTBS1;
Rollback segment created.
SQL>
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_3588498444$ UNDOTBS1 OFFLINE
_SYSSMU2_2971032042$ UNDOTBS1 OFFLINE
_SYSSMU3_3657342154$ UNDOTBS1 OFFLINE
_SYSSMU4_811969446$ UNDOTBS1 OFFLINE
_SYSSMU5_3018429039$ UNDOTBS1 OFFLINE
_SYSSMU6_442110264$ UNDOTBS1 OFFLINE
_SYSSMU7_2728255665$ UNDOTBS1 OFFLINE
_SYSSMU8_801938064$ UNDOTBS1 OFFLINE
_SYSSMU9_647420285$ UNDOTBS1 OFFLINE
_SYSSMU10_2262159254$ UNDOTBS1 OFFLINE
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
RBS1 UNDOTBS1 OFFLINE
_SYSSMU11_2950309372$ UNDOTBS2 OFFLINE
_SYSSMU12_3550765581$ UNDOTBS2 OFFLINE
_SYSSMU13_2003268147$ UNDOTBS2 OFFLINE
_SYSSMU14_200385032$ UNDOTBS2 OFFLINE
_SYSSMU15_2315478656$ UNDOTBS2 OFFLINE
_SYSSMU16_3694721358$ UNDOTBS2 OFFLINE
_SYSSMU17_302315325$ UNDOTBS2 OFFLINE
_SYSSMU18_2589589835$ UNDOTBS2 OFFLINE
_SYSSMU19_2290367767$ UNDOTBS2 OFFLINE
_SYSSMU20_459963109$ UNDOTBS2 OFFLINE
22 rows selected.
SQL>
  SQL> show parameter rollback
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
fast_start_parallel_rollback string LOW
rollback_segments string
transactions_per_rollback_segment integer 5
SQL>
SQL> shutdown immediate
Pluggable Database closed.
SQL> startup
Pluggable Database opened.
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_3588498444$ UNDOTBS1 OFFLINE
_SYSSMU2_2971032042$ UNDOTBS1 OFFLINE
_SYSSMU3_3657342154$ UNDOTBS1 OFFLINE
_SYSSMU4_811969446$ UNDOTBS1 OFFLINE
_SYSSMU5_3018429039$ UNDOTBS1 OFFLINE
_SYSSMU6_442110264$ UNDOTBS1 OFFLINE
_SYSSMU7_2728255665$ UNDOTBS1 OFFLINE
_SYSSMU8_801938064$ UNDOTBS1 OFFLINE
_SYSSMU9_647420285$ UNDOTBS1 OFFLINE
_SYSSMU10_2262159254$ UNDOTBS1 OFFLINE
RBS1 UNDOTBS1 OFFLINE
_SYSSMU11_2950309372$ UNDOTBS2 OFFLINE
_SYSSMU12_3550765581$ UNDOTBS2 OFFLINE
_SYSSMU13_2003268147$ UNDOTBS2 OFFLINE
_SYSSMU14_200385032$ UNDOTBS2 OFFLINE
_SYSSMU15_2315478656$ UNDOTBS2 OFFLINE
_SYSSMU16_3694721358$ UNDOTBS2 OFFLINE
_SYSSMU17_302315325$ UNDOTBS2 OFFLINE
_SYSSMU18_2589589835$ UNDOTBS2 OFFLINE
_SYSSMU19_2290367767$ UNDOTBS2 OFFLINE
_SYSSMU20_459963109$ UNDOTBS2 OFFLINE
22 rows selected.
SQL>
SQL>
SQL> alter system set rollback_segments=&#39;RBS1&#39; scope=spfile;
System altered.
SQL> startup force
Pluggable Database opened.
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_3588498444$ UNDOTBS1 OFFLINE
_SYSSMU2_2971032042$ UNDOTBS1 OFFLINE
_SYSSMU3_3657342154$ UNDOTBS1 OFFLINE
_SYSSMU4_811969446$ UNDOTBS1 OFFLINE
_SYSSMU5_3018429039$ UNDOTBS1 OFFLINE
_SYSSMU6_442110264$ UNDOTBS1 OFFLINE
_SYSSMU7_2728255665$ UNDOTBS1 OFFLINE
_SYSSMU8_801938064$ UNDOTBS1 OFFLINE
_SYSSMU9_647420285$ UNDOTBS1 OFFLINE
_SYSSMU10_2262159254$ UNDOTBS1 OFFLINE
RBS1 UNDOTBS1 ONLINE
_SYSSMU11_2950309372$ UNDOTBS2 OFFLINE
_SYSSMU12_3550765581$ UNDOTBS2 OFFLINE
_SYSSMU13_2003268147$ UNDOTBS2 OFFLINE
_SYSSMU14_200385032$ UNDOTBS2 OFFLINE
_SYSSMU15_2315478656$ UNDOTBS2 OFFLINE
_SYSSMU16_3694721358$ UNDOTBS2 OFFLINE
_SYSSMU17_302315325$ UNDOTBS2 OFFLINE
_SYSSMU18_2589589835$ UNDOTBS2 OFFLINE
_SYSSMU19_2290367767$ UNDOTBS2 OFFLINE
_SYSSMU20_459963109$ UNDOTBS2 OFFLINE
22 rows selected.
SQL>
  为 DML 操作提供闪回处理
  闪回查询:
  SQL> select * from e01;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
<p>
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 24-JAN-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 02-APR-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL> update e01 set sal = 1;
14 rows updated.
SQL> commit;
Commit complete.
SQL> rollback;
Rollback complete.
SQL> select * from e01;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 1 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1 500 30
7566 JONES MANAGER 7839 02-APR-81 1 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 1 30
7782 CLARK MANAGER 7839 09-JUN-81 1 10
7788 SCOTT ANALYST 7566 24-JAN-87 1 20
7839 KING PRESIDENT 17-NOV-81 1 10
7844 TURNER SALESMAN 7698 08-SEP-81 1 0 30
7876 ADAMS CLERK 7788 02-APR-87 1 20
7900 JAMES CLERK 7698 03-DEC-81 1 30
7902 FORD ANALYST 7566 03-DEC-81 1 20
7934 MILLER CLERK 7782 23-JAN-82 1 10
14 rows selected.
SQL> select * from e01 as of timestamp(sysdate-5/1440);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 24-JAN-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 02-APR-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL> alter table e01 enable row movement;
Table altered.
SQL> flashback table e01 to timestamp(sysdate-5/1440);
Flashback complete.
SQL> select * from e01;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 24-JAN-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 02-APR-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL></p>
  您可以闪回 15 分 900 秒。
  SQL> select * from e01 as of timestamp(sysdate-15/1440);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 24-JAN-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 02-APR-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL>
  闪回版本查询
  SQL> update e01 set sal=sal+100 where deptno=10;
3 rows updated.
SQL> commit;
Commit complete.
SQL> update e01 set sal=sal*1.1 where deptno=30;
6 rows updated.
SQL> commit;
Commit complete.
SQL> update e01 set sal=3;
14 rows updated.
SQL> commit;
Commit complete.
SQL> select * from e01;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 3 20
7499 ALLEN SALESMAN 7698 20-FEB-81 3 300 30
7521 WARD SALESMAN 7698 22-FEB-81 3 500 30
7566 JONES MANAGER 7839 02-APR-81 3 20
7654 MARTIN SALESMAN 7698 28-SEP-81 3 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 3 30
7782 CLARK MANAGER 7839 09-JUN-81 3 10
7788 SCOTT ANALYST 7566 24-JAN-87 3 20
7839 KING PRESIDENT 17-NOV-81 3 10
7844 TURNER SALESMAN 7698 08-SEP-81 3 0 30
7876 ADAMS CLERK 7788 02-APR-87 3 20
7900 JAMES CLERK 7698 03-DEC-81 3 30
7902 FORD ANALYST 7566 03-DEC-81 3 20
7934 MILLER CLERK 7782 23-JAN-82 3 10
14 rows selected.
SQL> --闪回版本查询
SQL> select versions_startscn,versions_endscn,versions_operation,versions_xid,sal from e01 versions between scn_minvalue and maxvalue where empno=7369;
select versions_startscn,versions_endscn,versions_operation,versions_xid,sal from e01 versions between scn_minvalue and maxvalue where empno=7369
*
ERROR at line 1:
ORA-00905: missing keyword
SQL> select
2 versions_startscn,
3 versions_endscn,
4 versions_operation,
5 versions_xid,
6 sal
7 from e01
8 versions between scn minvalue and maxvalue
9 where empno=7369;
VERSIONS_STARTSCN VERSIONS_ENDSCN V VERSIONS_XID SAL
----------------- --------------- - ---------------- ----------
17826843 U 03000300BC030000 3
17826652 17826843 I 070010006E030000 800
17826652 D 070010006E030000 1
17825320 17826652 U 03002000BB030000 1
17825320 800
SQL>
SQL> col versions_starttime for a25;
SQL> col versions_endtime for a25;
SQL> select
2 versions_starttime
3 versions_endtime,
4 --versions_startscn,
5 --versions_endscn,
6 versions_operation,
7 versions_xid,
8 sal
9 from e01
10 versions between scn minvalue and maxvalue
11 where empno=7369;
VERSIONS_ENDTIME V VERSIONS_XID SAL
------------------------- - ---------------- ----------
23-NOV-22 09.55.07 PM U 03000300BC030000 3
23-NOV-22 09.50.16 PM I 070010006E030000 800
23-NOV-22 09.50.16 PM D 070010006E030000 1
1
SQL> --闪回版本查询
SQL> select * from e01 as of scn 17826652;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 24-JAN-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 02-APR-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL> flashback table e01 to scn 17826652;
Flashback complete.
SQL> select * from e01;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 24-JAN-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 02-APR-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL>
  注意:为了进行闪回表操作,您必须首先打开行移动,如果不打开行移动,您将无法执行闪回操作。
  SQL> alter table e01 enable row movement;
Table altered.
  启用追加日志数据模式:
  SQL>
SQL> alter database add supplemental log data;
Database altered.
SQL>
  SQL>
SQL> update e01 set sal=sal*1.15 where deptno=30;
6 rows updated.
SQL>
SQL> select
2 --versions_starttime
3 --versions_endtime,
4 versions_startscn,
5 versions_endscn,
6 versions_operation,
7 versions_xid,
8 sal
9 from e01
10 versions between scn minvalue and maxvalue
11 where empno=7844;
VERSIONS_STARTSCN VERSIONS_ENDSCN V VERSIONS_XID SAL
----------------- --------------- - ---------------- ----------
17846142 I 02000B0061030000 1500
17846142 D 02000B0061030000 3
17846142 3
SQL>
  闪回事务查询
  
select
--versions_starttime
--versions_endtime,
versions_startscn,
versions_endscn,
versions_operation,
versions_xid,
sal
from e01
versions between scn minvalue and maxvalue
where empno=7844;
---闪回事务查询,sys用户才可以查询
SQL> select undo_sql from flashback_transaction_query where xid=&#39;02000B0061030000&#39;;
UNDO_SQL
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
16 rows selected.
SQL>
  事实:大数据采集手段_大数据采集和处理的内容
  大数据采集方式_大数据采集处理内容 大数据开启了数据大规模生产、共享和应用的时代,给技术和商业带来了巨大的变革。麦肯锡研究表明,在医疗、零售和制造领域,大数据每年可以提高劳动生产率0.5-1个百分点。大数据在核心领域的渗透速度是有目共睹的。但调查显示,未被利用的信息比例高达99.4%,这很大程度上是由于无法获取和采集
高价值信息。因此,在大数据时代的背景下,如何从大数据中采集
有用的信息已经是大数据发展的关键因素之一,那么什么是大数据...
  大家好,我是建筑先生,一个会写代码会吟诗的架构师。今天就来说说大数据采集的手段_大数据采集处理的内容,希望能帮助大家进步!!!
  大数据开启了数据大规模生产、共享和应用的时代,给技术和商业带来了巨大变革。麦肯锡研究表明,在医疗、零售和制造领域,大数据每年可以提高劳动生产率0.5-1个百分点。大数据在核心领域的渗透速度是有目共睹的。但调查显示,未被利用的信息比例高达99.4%,这很大程度上是由于无法获取和采集
高价值信息。因此,在大数据时代的背景下,如何从大数据中采集
有用的信息已经是大数据发展的关键因素之一,那么什么是大数据采集
技术呢?本期为大家介绍大数据采集技术,
  ▌什么是数据采集

  数据采集​​(Data Acquisition,DAQ),又称数据采集,是指从传感器等被测器件等模拟和数字被测单元自动采集信息的过程。数据分类 在新一代数据体系中,对传统数据体系中没有考虑到的新数据源进行归纳和分类,可分为上网行为数据和内容数据两大类。
  上网行为数据:页面数据、交互数据、表单数据、会话数据等。
  内容数据:应用日志、电子文档、机器数据、语音数据、社交媒体数据等。
  大数据的主要来源:1)商业数据2)互联网数据3)传感器数据
  ▌数据采集与大数据采集的区别
  
  ▌传统数据采集的不足
  传统的数据采集来源单一,存储、管理和分析的数据量较小,大部分可以通过关系数据库和并行数据仓库进行处理。在依靠并行计算提高数据处理速度方面,传统的并行数据库技术追求高一致性和容错性。按照CAP理论,其可用性和可扩展性是很难保证的。
  ▌大数据采集新方法
  系统日志采集
方法
  很多互联网公司都有自己的海量数据采集工具,多用于系统日志采集,比如Hadoop的Chukwa、Cloudera的Flume、Facebook的Scribe等,这些工具采用分布式架构,可以满足单机上百MB的日志数据第二。采集和传输要求。
  网络数据获取方式
  网络数据采集是指通过网络爬虫或网站公共API从网站获取数据信息。该方法可以将网页中的非结构化数据提取出来,存储为统一的本地数据文件,并进行结构化存储。支持图片、音频、视频等文件或附件的采集
,附件与文本可自动关联。除了网络中收录
的内容外,还可以使用 DPI 或 DFI 等带宽管理技术处理网络流量的采集

  其他数据采集
方法
  对于企业生产经营数据或学科研究数据等保密要求高的数据,可通过与企业或研究机构合作,采用特定系统接口等相关方式采集
数据。
  ▌大数据采集平台
  
  最后给大家介绍几个应用广泛的大数据采集平台,供大家参考。
  1)阿帕奇水槽
  Flume是Apache下一个开源、高可靠、高扩展、易于管理、支持客户扩展的数据采集系统。Flume是使用JRuby构建的,所以它依赖于Java运行环境。
  2)流利
  Fluentd 是另一个开源数据采集
框架。Fluentd使用C/Ruby开发,使用JSON文件统一日志数据。其可插拔架构支持各种类型和格式的数据源和数据输出。最后,它还同时提供了高可靠性和良好的可扩展性。Treasure Data, Inc 为该产品提供支持和维护。
  3) 日志存储
  Logstash是著名的开源数据栈ELK(ElasticSearch、Logstash、Kibana)中的L。Logstash 使用 JRuby 开发,所有运行时都依赖于 JVM。
  4)Splunk转发器
  Splunk 是一个分布式机器数据平台,主要有三个角色: Search Head 负责数据的搜索和处理,提供搜索过程中的信息提取;Indexer负责数据的存储和索引;Forwarder负责数据的采集、清洗、变形,并发送给Indexer
  很多初学者对大数据的概念比较模糊。什么是大数据,它能做什么,什么时候学,应该走什么路线,学完后往哪里发展,想了解更多,想学习欢迎同学们加入大数据学习扣群:805127855,里面有海量干货(零基础进阶经典实战)分享给大家,更有清华毕业资深大数据讲师免费授课,分享国内最全。大数据高端实战实战学习流程体系

解决方案:一款基于AI算法的调查问卷:从产品运营,到技术研发全过程深度剖析

采集交流优采云 发表了文章 • 0 个评论 • 40 次浏览 • 2022-11-23 21:42 • 来自相关话题

  解决方案:一款基于AI算法的调查问卷:从产品运营,到技术研发全过程深度剖析
  我用最简单粗暴的形式,给大家讲讲一个横跨运营、产品、技术三个部门的问卷调查项目背后发生的事情。生命周期,并从代码层面展示了一套初级人工智能算法是如何挖掘用户数据的,那么这套算法对商城等线上产品有什么作用呢?简单来说,产品之间的相关性是通过算法计算出来的。下面我从运营、产品、技术三个维度带大家一步步做这个项目。
  项目总体步骤
  项目背景
  广电智能机顶盒覆盖率高达80%,覆盖数千万用户。我们的产品是基于广电内网智能机顶盒的网上超市业务。以新零售为切入点,用户在家用机顶盒下单,配送到社区附近的超市,双十二需要提前备货,库存准确与否直接影响成败本次活动的。商家希望能够预知某种商品的需求,提前备货。运营部门需要线上线下配合做好。活动,所以除了提前了解客户对不同产品的需求外,最重要的是做出准确的推荐,
  第一步:运营部门任务
  线下运营方案:线下运营的主要流程是先拿出一个线下的促销方案,然后市场部拿着这个方案和之前合作过的超市商谈促销细节,请他们提供场地支持和优惠券支持,并敲定具体的推广地点和时间,然后进入小区找小区物业或居委会协商在小区进行本地推送的时间和地点。由于是政府项目,居委会积极响应,活动进行得很顺利。后期,我们请当地的推送团队带上易拉宝和DM单,同时进入小区和周边超市进行预热宣传。由于本文主要讲解线上操作,所以这里不再赘述线下操作。我已经描述过了,我会发一篇后续文章来一步步指导你。
  在线新媒体运营计划: 关于在线新媒体运营部分,这里简单介绍一下。主要渠道为地方各大垂直领域的自媒体、报纸、地方电视媒体报道等。
  线上产品运营方案:这次主要讲线上产品运营。拿到这个项目只需要老板一句话。要做双12,销量一定要翻倍。自己找资源协调,自己想方案,运营工作就是这样。一开始,你无从下手,你不知道先做什么,然后你需要有强烈的目标感。迷茫的时候,想想源头。我为什么要这样做?对于这次活动,如果要做线上运营,第一步就是基础数据分析。那么有人会说,如果是冷启动阶段,没有数据怎么办。当然,还有其他的数据分析渠道。后面再说,先看下图,是双十一期间的销售数据。
  1.首先分析一下这次活动的目的
  基于这三个目的,我们不仅要做同比数据对比,还要关注双11期间的数据。上图是双11期间的后台统计。最后,我们从数据中分析出几款购买频率比较高的产品。发现米粉油等刚需品的购买频率最高,其次是酒水饮料,所以这些产品是本次问卷涉及的主要维度,并基于这些进行深度数据挖掘方面。
  2、要有一个稳定而强大的执行团队,团队协调也是一种运营
  只有有了产品,新媒体和本地推广才能介入。否则连问卷都没有,就去宣传预热,你的投入就白费了。
  
  事实上,产品部门和运营部门的主要矛盾在于工作内容的界限模糊。有些产品的工作其实离不开运维提出的建议,甚至有些运维人员还要为产品写需求文档。所以后期会出现一个现象,很明显就是运营人员的价值输出。产品经理会拿去给老板讨功劳,说这个产品的idea是自己的idea,会让运营人员很不爽。舒适,后期直接导致产品缺乏创意,如何才能取得好的运营效果?
  因此,更靠谱的方案是统一团队KPI。运营、产品、技术三个部门的KPI相互关联,利益共同体,优劣分明。唯一的入口和出口,项目经理的核心作用是降低团队内部和团队之间的沟通成本,克服项目中出现的问题。
  相信大家都遇到过那种,你有事问他,明明听不懂就假装不屑的回答,或者直接给你一个QQ号或者手机号,让你自己沟通低效的领导无形中增加了团队内部大量的沟通成本,导致项目成本居高不下,团队人员流失率增加。有了强大的团队,就到了设计产品的时候了。
  3.产品设计思路是做一个H5做的问卷
  H5问卷的最大优势是多平台适配,开发周期短,开发成本低。非常适合线上线下多渠道的推广活动。有人会说,这和普通的问卷没什么区别。常见的问卷都是这种形式,无非是让用户做一些选择题。其实问卷的背后是用户画像,这是一个很大的话题。那些普通的问卷缺乏用户参与感。一个很简单的例子,当你删除电脑软件的时候,他会问你为什么删除。有多少人真的会按照自己的意愿去选择,点右上角的关闭按钮就可以了。说到底,这种问卷缺乏参与感。
  问题一:如何解决问卷调查参与感低的问题
  那么如何解决以往调查没有参与感的问题呢?这很简单。我用倒计时十秒抢答,让用户有一种紧迫感,用户也不知道还剩下多少问题,总觉得下一次就是下一次。红包准备好了,就做到最后,但是不建议太多,10-15个左右就够了,保证1分钟内用户可以选择就可以了。
  问题二:如何解决用户身份与奖品绑定步骤问题,层次太深
  所谓的用户身份绑定步骤太深了,就是在问卷调查涉及到奖品的时候,需要给用户绑定奖品。手机号登录,用户需要操作的流程是输入手机号点击发送验证码--&gt;点击短信推送输入短信详情--&gt;记住验证码--&gt; 返回调查页面 --&gt; 输入验证码点击确定,我之前做过数据分析,每增加一个用户等级,用户流失率会增加20%,也就是之前的问卷调查法会流失80%以上的用户,那我给你算一下,你花1W用钱推,比如获客成本是2元,5,可吸引000人参与问卷调查。经过以上四步,每一步都会流失20%的用户,即最终流失5000*80%=4000人。也就是说,真正的获客成本从2元增加到了10元。如果你这次活动吸引了一万人,你的老板就要多花八万元。10万人呢,10万人,现在你能看出用户层级有多重要吗?
  所以要解决这个问题,我们需要尽可能的降低用户等级,能在一级解决的都在一级解决,所以我用服务器直接分配用户唯一优惠码并绑定它在后台奖励。用户只需要在最后一页点击保存优惠码图片,支付时直接使用即可。两个问题的解决方案如下图所示:
  4. 运营产品规划案例的交付、审核和分发
  至此,线上运营产品规划案例完成,采集
UE和问卷调查需要采集
的用户标签,下发给产品部。其实大家可以看到运营部门其实已经帮产品做了一部分工作,所以这就是刚才说的运营和产品工作内容界限模糊的原因。
  
  第二步:产品部任务一,编写需求文档
  需求文档的原则是将运营部门的用户需求转化为技术可以理解的功能需求,从控件的大小,组件颜色的颜色编号,到每个功能的细节,以及甚至一些技术选型。并且要体现数据交互策略,从而节省技术部门的沟通成本。由于本项目主要配合运营时间节点,适合采用敏捷开发方式。我直接把需求文档和UE图整合起来,效果如下。
  2. 产品资料交付技术部。开发说的“不可能”是真的吗?
  拿着需求文档和技术部开产品会,经常遇到的问题就是技术部会找各种借口说实现不了。最后为了保证基本功能,对产品进行妥协,对运营进行妥协,以保证按时上线。只是大家只能为惨不忍睹的PVUV买单,奖金什么的都别想了。真的不可能吗?技术部的人真的很懒吗?真的是技术部的人多报了工期?
  技术部和产品运营部性格最大的不同,一个是想一劳永逸,一个是不断想开发新玩法,不断提升用户体验。对于技术部门人员来说,他们认为最理想的系统是健壮的系统。技术部门提出什么要求,不需要改代码,告诉他们后台怎么配置就可以了。对于产品运营者来说,每一个活动都必须是不同的、不同的、有新数据的。埋了,所以就出现了上面的矛盾,那么怎么解决呢?
  1.先尽快提出需求,切记今天不要提出来,这种行为会让技术部门很反感。
  2、一切以运营部门的标准为准,因为运营部门是与市场关系最密切的部门,所以提出的建议和诉求是市场调研和数据分析的结果,确保满足需求运营部门是大前提。
  3. 如果现有需求与原有的技术选型和数据架构有太多冲突,只能深入探讨,抽丝剥茧,在保证运营需求的前提下,做一些适当的妥协。有时候技术解决不了的问题,可以通过优化交互设计来解决,比如列表页的点赞功能。如果每次都放like的话,服务器压力还是挺大的。如果数据库不用redis,服务器容易宕机,更换数据库成本太高。建一个项目太不现实了,所以通过优化交互设计,把点赞功能放多一些,评论功能放浅一些,
  4、产品操作人员多了解一些技术知识是非常有必要的。至少在和技术部门交涉的时候,他们可以知道自己是不是在夸大问题。,那就只能直接把需求文档设计稿发项目立项邮件@Boss@各部局长,从上到下分配任务。
  第三步:技术部任务 1. 获取需求文档并分配任务
  本次问卷调查项目,需要用到的技术岗位有web前端、测试工程师、java后端工程师、项目经理。这四个岗位的任务由项目经理根据要求分配到各个岗位,可以根据时间进度安排。开发完成,测试通过上线后,项目迭代结束。
  项目经理的工作职责:控制项目整体进度和成本,发现需求问题及时与其他部门沟通,编写接口文档,攻克技术难题。Java后台任务:完善接口文档,根据需求文档和接口文档搭建后台数据库,实现接口函数,实现相关算法函数。Web前端任务:实现问卷页面效果与后台接口对接,适配不同分辨率的设备。测试任务:根据需求文档编写测试用例,测试项目整体功能,做好适配测试和jmeter压力测试。2.专注于关联算法,最基础的人工智能,
  这种线上运营的本质之一就是利用关联算法来增加用户非理性购买的概率,达到提升消费转化的效果。那么什么是关联算法呢?最简单的例子,你去淘宝看一个包包,然后拉到页面底部,会有一个猜你喜欢的,里面的内容是根据关联算法计算出来的,然后精准推送给你,所以很多人说,我知道这个叫关联算法,但是作为运营商,你如何使用关联算法,作为技术人员开发关联算法应该从哪里入手呢?把我用java实现的关联算法代码拿出来给大家参考。
  技巧:自媒体实时热点工具分享,追热点的自媒体工具,不错过自媒体运营方法
  自媒体人想要在最短的时间内获得更多的流量,最好的捷径就是关注热点。追热点之后,很有可能制造出爆款文章。
  如何提高追热点的速度,首先你得有一个好的内容源,也就是说有热点你要及时知道,还得能快速搜索素材. 这个一般需要借助工具,下面就给大家推荐一下。几个让你更好关注热点的自媒体工具:
  一、今日头条:热词分析
  打开今日头条作者首页,点击功能实验室,会看到一个热词分析工具,点击进入分析页面。
  
  热词分析工具:会有最新的实时热点文章,关键词和具体的热点情况。您可以随时了解热门事件,也可以搜索关键词查看相关热度。
  2、编写简单——实时热点监控
  打开易转,进入数据研究院,右侧会有实时热点监测页面,里面有今天的热词,明天的发现,还有今天的热点图。在实时热点栏目中,可以看到百度热搜、微博热搜、各自媒体平台的热搜。掌握。
  
  3.微博热搜榜
  这应该是大家最常用的平台了。微博用户多,信息流通速度快。是追热点必不可少的工具。
  不过,微博的一大优势就是可以帮助你及时掌握实时热点。缺点是微博内容比较混乱,不利于采集
信息。过滤信息需要时间。
  好吧,这里有一些重要的工具,我今天要告诉你,以帮助大家加快速度。 查看全部

  解决方案:一款基于AI算法的调查问卷:从产品运营,到技术研发全过程深度剖析
  我用最简单粗暴的形式,给大家讲讲一个横跨运营、产品、技术三个部门的问卷调查项目背后发生的事情。生命周期,并从代码层面展示了一套初级人工智能算法是如何挖掘用户数据的,那么这套算法对商城等线上产品有什么作用呢?简单来说,产品之间的相关性是通过算法计算出来的。下面我从运营、产品、技术三个维度带大家一步步做这个项目。
  项目总体步骤
  项目背景
  广电智能机顶盒覆盖率高达80%,覆盖数千万用户。我们的产品是基于广电内网智能机顶盒的网上超市业务。以新零售为切入点,用户在家用机顶盒下单,配送到社区附近的超市,双十二需要提前备货,库存准确与否直接影响成败本次活动的。商家希望能够预知某种商品的需求,提前备货。运营部门需要线上线下配合做好。活动,所以除了提前了解客户对不同产品的需求外,最重要的是做出准确的推荐,
  第一步:运营部门任务
  线下运营方案:线下运营的主要流程是先拿出一个线下的促销方案,然后市场部拿着这个方案和之前合作过的超市商谈促销细节,请他们提供场地支持和优惠券支持,并敲定具体的推广地点和时间,然后进入小区找小区物业或居委会协商在小区进行本地推送的时间和地点。由于是政府项目,居委会积极响应,活动进行得很顺利。后期,我们请当地的推送团队带上易拉宝和DM单,同时进入小区和周边超市进行预热宣传。由于本文主要讲解线上操作,所以这里不再赘述线下操作。我已经描述过了,我会发一篇后续文章来一步步指导你。
  在线新媒体运营计划: 关于在线新媒体运营部分,这里简单介绍一下。主要渠道为地方各大垂直领域的自媒体、报纸、地方电视媒体报道等。
  线上产品运营方案:这次主要讲线上产品运营。拿到这个项目只需要老板一句话。要做双12,销量一定要翻倍。自己找资源协调,自己想方案,运营工作就是这样。一开始,你无从下手,你不知道先做什么,然后你需要有强烈的目标感。迷茫的时候,想想源头。我为什么要这样做?对于这次活动,如果要做线上运营,第一步就是基础数据分析。那么有人会说,如果是冷启动阶段,没有数据怎么办。当然,还有其他的数据分析渠道。后面再说,先看下图,是双十一期间的销售数据。
  1.首先分析一下这次活动的目的
  基于这三个目的,我们不仅要做同比数据对比,还要关注双11期间的数据。上图是双11期间的后台统计。最后,我们从数据中分析出几款购买频率比较高的产品。发现米粉油等刚需品的购买频率最高,其次是酒水饮料,所以这些产品是本次问卷涉及的主要维度,并基于这些进行深度数据挖掘方面。
  2、要有一个稳定而强大的执行团队,团队协调也是一种运营
  只有有了产品,新媒体和本地推广才能介入。否则连问卷都没有,就去宣传预热,你的投入就白费了。
  
  事实上,产品部门和运营部门的主要矛盾在于工作内容的界限模糊。有些产品的工作其实离不开运维提出的建议,甚至有些运维人员还要为产品写需求文档。所以后期会出现一个现象,很明显就是运营人员的价值输出。产品经理会拿去给老板讨功劳,说这个产品的idea是自己的idea,会让运营人员很不爽。舒适,后期直接导致产品缺乏创意,如何才能取得好的运营效果?
  因此,更靠谱的方案是统一团队KPI。运营、产品、技术三个部门的KPI相互关联,利益共同体,优劣分明。唯一的入口和出口,项目经理的核心作用是降低团队内部和团队之间的沟通成本,克服项目中出现的问题。
  相信大家都遇到过那种,你有事问他,明明听不懂就假装不屑的回答,或者直接给你一个QQ号或者手机号,让你自己沟通低效的领导无形中增加了团队内部大量的沟通成本,导致项目成本居高不下,团队人员流失率增加。有了强大的团队,就到了设计产品的时候了。
  3.产品设计思路是做一个H5做的问卷
  H5问卷的最大优势是多平台适配,开发周期短,开发成本低。非常适合线上线下多渠道的推广活动。有人会说,这和普通的问卷没什么区别。常见的问卷都是这种形式,无非是让用户做一些选择题。其实问卷的背后是用户画像,这是一个很大的话题。那些普通的问卷缺乏用户参与感。一个很简单的例子,当你删除电脑软件的时候,他会问你为什么删除。有多少人真的会按照自己的意愿去选择,点右上角的关闭按钮就可以了。说到底,这种问卷缺乏参与感。
  问题一:如何解决问卷调查参与感低的问题
  那么如何解决以往调查没有参与感的问题呢?这很简单。我用倒计时十秒抢答,让用户有一种紧迫感,用户也不知道还剩下多少问题,总觉得下一次就是下一次。红包准备好了,就做到最后,但是不建议太多,10-15个左右就够了,保证1分钟内用户可以选择就可以了。
  问题二:如何解决用户身份与奖品绑定步骤问题,层次太深
  所谓的用户身份绑定步骤太深了,就是在问卷调查涉及到奖品的时候,需要给用户绑定奖品。手机号登录,用户需要操作的流程是输入手机号点击发送验证码--&gt;点击短信推送输入短信详情--&gt;记住验证码--&gt; 返回调查页面 --&gt; 输入验证码点击确定,我之前做过数据分析,每增加一个用户等级,用户流失率会增加20%,也就是之前的问卷调查法会流失80%以上的用户,那我给你算一下,你花1W用钱推,比如获客成本是2元,5,可吸引000人参与问卷调查。经过以上四步,每一步都会流失20%的用户,即最终流失5000*80%=4000人。也就是说,真正的获客成本从2元增加到了10元。如果你这次活动吸引了一万人,你的老板就要多花八万元。10万人呢,10万人,现在你能看出用户层级有多重要吗?
  所以要解决这个问题,我们需要尽可能的降低用户等级,能在一级解决的都在一级解决,所以我用服务器直接分配用户唯一优惠码并绑定它在后台奖励。用户只需要在最后一页点击保存优惠码图片,支付时直接使用即可。两个问题的解决方案如下图所示:
  4. 运营产品规划案例的交付、审核和分发
  至此,线上运营产品规划案例完成,采集
UE和问卷调查需要采集
的用户标签,下发给产品部。其实大家可以看到运营部门其实已经帮产品做了一部分工作,所以这就是刚才说的运营和产品工作内容界限模糊的原因。
  
  第二步:产品部任务一,编写需求文档
  需求文档的原则是将运营部门的用户需求转化为技术可以理解的功能需求,从控件的大小,组件颜色的颜色编号,到每个功能的细节,以及甚至一些技术选型。并且要体现数据交互策略,从而节省技术部门的沟通成本。由于本项目主要配合运营时间节点,适合采用敏捷开发方式。我直接把需求文档和UE图整合起来,效果如下。
  2. 产品资料交付技术部。开发说的“不可能”是真的吗?
  拿着需求文档和技术部开产品会,经常遇到的问题就是技术部会找各种借口说实现不了。最后为了保证基本功能,对产品进行妥协,对运营进行妥协,以保证按时上线。只是大家只能为惨不忍睹的PVUV买单,奖金什么的都别想了。真的不可能吗?技术部的人真的很懒吗?真的是技术部的人多报了工期?
  技术部和产品运营部性格最大的不同,一个是想一劳永逸,一个是不断想开发新玩法,不断提升用户体验。对于技术部门人员来说,他们认为最理想的系统是健壮的系统。技术部门提出什么要求,不需要改代码,告诉他们后台怎么配置就可以了。对于产品运营者来说,每一个活动都必须是不同的、不同的、有新数据的。埋了,所以就出现了上面的矛盾,那么怎么解决呢?
  1.先尽快提出需求,切记今天不要提出来,这种行为会让技术部门很反感。
  2、一切以运营部门的标准为准,因为运营部门是与市场关系最密切的部门,所以提出的建议和诉求是市场调研和数据分析的结果,确保满足需求运营部门是大前提。
  3. 如果现有需求与原有的技术选型和数据架构有太多冲突,只能深入探讨,抽丝剥茧,在保证运营需求的前提下,做一些适当的妥协。有时候技术解决不了的问题,可以通过优化交互设计来解决,比如列表页的点赞功能。如果每次都放like的话,服务器压力还是挺大的。如果数据库不用redis,服务器容易宕机,更换数据库成本太高。建一个项目太不现实了,所以通过优化交互设计,把点赞功能放多一些,评论功能放浅一些,
  4、产品操作人员多了解一些技术知识是非常有必要的。至少在和技术部门交涉的时候,他们可以知道自己是不是在夸大问题。,那就只能直接把需求文档设计稿发项目立项邮件@Boss@各部局长,从上到下分配任务。
  第三步:技术部任务 1. 获取需求文档并分配任务
  本次问卷调查项目,需要用到的技术岗位有web前端、测试工程师、java后端工程师、项目经理。这四个岗位的任务由项目经理根据要求分配到各个岗位,可以根据时间进度安排。开发完成,测试通过上线后,项目迭代结束。
  项目经理的工作职责:控制项目整体进度和成本,发现需求问题及时与其他部门沟通,编写接口文档,攻克技术难题。Java后台任务:完善接口文档,根据需求文档和接口文档搭建后台数据库,实现接口函数,实现相关算法函数。Web前端任务:实现问卷页面效果与后台接口对接,适配不同分辨率的设备。测试任务:根据需求文档编写测试用例,测试项目整体功能,做好适配测试和jmeter压力测试。2.专注于关联算法,最基础的人工智能,
  这种线上运营的本质之一就是利用关联算法来增加用户非理性购买的概率,达到提升消费转化的效果。那么什么是关联算法呢?最简单的例子,你去淘宝看一个包包,然后拉到页面底部,会有一个猜你喜欢的,里面的内容是根据关联算法计算出来的,然后精准推送给你,所以很多人说,我知道这个叫关联算法,但是作为运营商,你如何使用关联算法,作为技术人员开发关联算法应该从哪里入手呢?把我用java实现的关联算法代码拿出来给大家参考。
  技巧:自媒体实时热点工具分享,追热点的自媒体工具,不错过自媒体运营方法
  自媒体人想要在最短的时间内获得更多的流量,最好的捷径就是关注热点。追热点之后,很有可能制造出爆款文章。
  如何提高追热点的速度,首先你得有一个好的内容源,也就是说有热点你要及时知道,还得能快速搜索素材. 这个一般需要借助工具,下面就给大家推荐一下。几个让你更好关注热点的自媒体工具:
  一、今日头条:热词分析
  打开今日头条作者首页,点击功能实验室,会看到一个热词分析工具,点击进入分析页面。
  
  热词分析工具:会有最新的实时热点文章,关键词和具体的热点情况。您可以随时了解热门事件,也可以搜索关键词查看相关热度。
  2、编写简单——实时热点监控
  打开易转,进入数据研究院,右侧会有实时热点监测页面,里面有今天的热词,明天的发现,还有今天的热点图。在实时热点栏目中,可以看到百度热搜、微博热搜、各自媒体平台的热搜。掌握。
  
  3.微博热搜榜
  这应该是大家最常用的平台了。微博用户多,信息流通速度快。是追热点必不可少的工具。
  不过,微博的一大优势就是可以帮助你及时掌握实时热点。缺点是微博内容比较混乱,不利于采集
信息。过滤信息需要时间。
  好吧,这里有一些重要的工具,我今天要告诉你,以帮助大家加快速度。

解决方案:【机器学习】一文彻底搞懂自动机器学习AutoML:Auto-Sklearn

采集交流优采云 发表了文章 • 0 个评论 • 70 次浏览 • 2022-11-22 05:18 • 来自相关话题

  解决方案:【机器学习】一文彻底搞懂自动机器学习AutoML:Auto-Sklearn
  本文将系统全面地介绍自动机器学习常用的框架之一:Auto-Sklearn,介绍安装使用,分类回归小案例,介绍一些使用手册。自动机器学习
  自动化机器学习 AutoML 是机器学习中一个相对较新的领域。它主要自动化机器学习中所有耗时的过程,例如数据预处理、最优算法选择、超参数调优等,可以节省大量构建机器的时间。在学习模型的过程中。
  Automatic Machine Learning AutoML:对于,让表示特征向量,表示相应的目标值。给定训练数据集和从与其相同的数据分布中提取的测试数据集的特征向量,以及资源预算和损失度量,AutoML 问题是自动为测试集生成预测,而 AutoML 问题的解决方案损失值。
  AutoML 是为数据集的数据转换、模型和模型配置发现性能最佳的管道的过程。
  AutoML 通常涉及使用复杂的优化算法(例如贝叶斯优化)来有效地导航可能模型和模型配置的空间,并快速发现对给定预测建模任务最有效的算法。它允许非专业的机器学习从业者快速轻松地发现对给定数据集有效甚至最佳的方法,几乎​​不需要技术背景或直接输入。
  如果你用过sklearn,应该不难理解上面的定义。下面结合一张流程图来进一步理解。
  Auto-Sklearn 系统概述Auto-Sklearn
  Auto-Sklearn 是一个开源库,用于在 Python 中执行 AutoML。它利用流行的 Scikit-Learn 机器学习库进行数据转换和机器学习算法。
  它是由 Matthias Feurer 等人开发的。并在他们 2015 年题为“高效且稳健的自动化机器学习 [1]”的论文中进行了描述。
  …我们引入了一个基于 scikit-learn 的强大的新 AutoML 系统(使用 15 个分类器、14 种特征预处理方法和 4 种数据预处理方法,产生具有 110 个超参数的结构化假设空间)
  我们介绍了一个基于 scikit-learn 的强大的新 AutoML 系统(使用 15 个分类器、14 种特征预处理方法和 4 种数据预处理方法,产生了一个具有 110 个超参数的结构化假设空间)。
  Auto-Sklearn 的好处是,除了发现数据预处理和模型来为数据集执行之外,它还能够从在类似数据集上表现良好的模型中学习,并可以自动创建性能最佳的集成作为优化过程的一部分找到的模型。
  这个系统,我们称之为 AUTO-SKLEARN,通过自动考虑过去在类似数据集上的表现,并通过在优化期间评估的模型构建集成,改进了现有的 AutoML 方法。
  我们称之为 AUTO-SKLEARN 的这个系统通过自动考虑过去在类似数据集上的表现并通过优化期间评估的模型构建集成来改进现有的 AutoML 方法。
  Auto-Sklearn 是对通用 AutoML 方法的改进。自动机器学习框架采用贝叶斯超参数优化方法来有效地发现给定数据集的最佳性能模型管道。
  这里添加了两个额外的组件:
  这种元学习方法是对用于优化 ML 框架的贝叶斯优化的补充。对于与整个 ML 框架一样大的超参数空间,贝叶斯优化起步缓慢。选择了几种配置用于基于元学习的种子贝叶斯优化。这种通过元学习的方法可以称为热启动优化方法。再加上多模型自动集成的方式,整个机器学习过程高度自动化,将大大节省用户的时间。从这个过程来看,机器学习用户可以有更多的时间来选择数据和思考要处理的问题。
  贝叶斯优化
  贝叶斯优化的原理是利用已有样本在优化目标函数方面的表现来构建后验模型。后验模型上的每个点都是高斯分布,具有均值和方差。如果该点是已有的样本点,均值为优化目标函数在该点的值,方差为0。其他未知样本点的均值和方差由后验概率拟合,不一定接近真正的价值。然后用一个采集函数不断测试这些未知样本点对应的优化目标函数值,不断更新后验概率模型。由于采集函数可以兼顾Explore/Exploit,将选择更多具有良好性能和高潜力的点。因此,当资源预算耗尽时,往往可以得到很好的优化结果。即寻找优化目标函数中的局部最优参数。
  贝叶斯优化
  上图是贝叶斯优化应用于简单一维问题的实验图。这些图显示了四次迭代后高斯过程对目标函数的逼近。下面以t=3为例介绍图中各部分的作用。
  上图中的两个评价黑点和一个红色评价是备选模型经过三次评价后的初始值估计,会影响下一个点的选择,可以画出很多通过这三个点的曲线。黑色虚线曲线是实际的真实目标函数(通常是未知的)。黑色实线是代理模型目标函数的平均值。紫色区域是代理模型目标函数的方差。绿色阴影部分是指采集函数的值,取最大值的点作为下一个采样点。只有三个点,拟合效果稍差。黑点越多,黑色实线和黑色虚线之间的面积越小,误差越小,
  安装和使用 Auto-Sklearn
  Auto-sklearn 提供开箱即用的监督式自动机器学习。从名字就可以看出,auto-sklearn是基于机器学习库scikit-learn构建的,可以自动搜索新数据集的学习算法,并优化其超参数。因此,它将机器学习用户从繁琐的任务中解放出来,让他们有更多时间专注于实际问题。
  这里可以参考auto-sklearn官方文档[2]。
  Ubuntu
  >>> sudo apt-get install build-essential swig<br />>>> conda install gxx_linux-64 gcc_linux-64 swig<br />>>> curl `https://raw.githubusercontent. ... s.txt` | xargs -n 1 -L 1 pip install<br />>>> pip install auto-sklearn<br />
  蟒蛇
  pip install auto-sklearn<br />
  安装后,我们可以导入库并打印版本号以确认安装成功:
  # print autosklearn version<br />import autosklearn<br />print('autosklearn: %s' % autosklearn.__version__)<br />
  您的版本号应该相同或更高。
  autosklearn: 0.6.0<br />
  根据预测任务,无论是分类还是回归,都可以创建和配置 AutoSklearnClassifier[3] 或 AutoSklearnRegressor[4] 类的实例,将其拟合到数据集,仅此而已。然后可以直接使用生成的模型进行预测或保存到文件(使用 pickle)供以后使用。
  AutoSklearn 类参数
  AutoSklearn 类提供了大量的配置选项作为参数。
  默认情况下,搜索将在搜索过程中使用数据集的训练测试拆分,为了速度和简单性,这里建议使用默认值。
  参数n_jobs可以设置为系统的核心数,如果有8个核心,则n_jobs=8。
  通常,优化过程会连续运行并以分钟为单位。默认情况下,它将运行一小时。
  这里建议将time_left_for_this_task参数设置为这个任务的最大时间(你希望进程运行的秒数)。例如,对于许多小型预测建模任务(行数少于 1,000 的数据集)来说,不到 5-10 分钟就足够了。如果不指定该参数,进程将连续运行,以分钟计,进程运行一小时,即60分钟。此示例通过 per_run_time_limit 参数将分配给每个模型评估的时间限制为 30 秒。例如:
  # define search<br />model = AutoSklearnClassifier(time_left_for_this_task=5*60, <br />                              per_run_time_limit=30,<br />                              n_jobs=8)<br />
  还有其他参数,如 ensemble_size、initial_configurations_via_metallearning 可用于微调分类器。默认情况下,上述搜索命令会创建一组性能最佳的模型。为了避免过度拟合,我们可以通过更改设置 ensemble_size = 1 和 initial_configurations_via_metallearning = 0 来禁用它。我们在设置分类器时排除了这些以保持方法简单。
  在运行结束时,可以访问模型列表以及其他详细信息。sprint_statistics() 函数总结了最终模型的搜索和性能。
  # summarize performance<br />print(model.sprint_statistics())<br />
  分类任务
  在本节中,我们将使用 Auto-Sklearn 来发现 Sonar 数据集的模型。
  
  Sonar 数据集 [5] 是一个标准的机器学习数据集,由 208 行数据和 60 个数字输入变量和一个具有两个类值的目标变量组成,例如二分类。
  使用重复分层 10 折交叉验证的测试框架,重复 3 次,朴素模型可以达到约 53% 的准确度。性能最好的模型在相同的测试框架上达到了大约 88% 的准确率。这为该数据集提供了预期的性能范围。
  该数据集涉及预测声纳返回是指示岩石还是模拟地雷。
  # summarize the sonar dataset<br />from pandas import read_csv<br /># load dataset<br />dataframe = read_csv(data, header=None)<br /># split into input and output elements<br />data = dataframe.values<br />X, y = data[:, :-1], data[:, -1]<br />print(X.shape, y.shape)<br />
  运行该示例会下载数据集并将其拆分为输入和输出元素。您可以看到具有 60 个输入变量的 208 行数据。
  (208, 60) (208,)<br />
  首先,将数据集分为训练集和测试集,目标是在训练集上找到一个好的模型,然后评估在 holdout 测试集上找到的模型的性能。
  # split into train and test sets<br />X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1)<br />
  使用以下命令从 autosklearn 导入分类模型。
  from autosklearn.classification import AutoSklearnClassifier<br />
  AutoSklearnClassifier 配置为使用 8 个内核运行 5 分钟,并将每个模型评估限制为 30 秒。
  # define search<br />model = AutoSklearnClassifier(time_left_for_this_task=5*60,<br />                              per_run_time_limit=30, n_jobs=8,<br />                              tmp_folder='/temp/autosklearn_classification_example_tmp')<br />
  这里提供了一个临时的日志保存路径,方便我们后面打印运行明细。
  然后在训练数据集上执行搜索。
  # perform the search<br />model.fit(X_train, y_train)<br />
  报告搜索摘要和最佳性能模型。
  # summarize<br />print(model.sprint_statistics())<br />
  可以使用以下命令为搜索考虑的所有模型打印排行榜。
  # leaderboard<br />print(model.leaderboard())<br />
  可以使用以下命令打印有关所考虑模型的信息。
  print(model.show_models())<br />
  我们还可以使用SMOTE、集成学习(bagging、boosting)、NearMiss算法等技术来解决数据集中的不平衡问题。
  最后评估模型在测试数据集上的性能。
  # evaluate best model<br />y_pred = model.predict(X_test)<br />acc = accuracy_score(y_test, y_pred)<br />print("Accuracy: %.3f" % acc)<br />
  也可以打印集成的最终分数和混淆矩阵。
  # Score of the final ensemble<br />from sklearn.metrics import accuracy_score<br />m1_acc_score= accuracy_score(y_test, y_pred)<br />m1_acc_score<br />from sklearn.metrics import confusion_matrix, accuracy_score<br />y_pred= model.predict(X_test)<br />conf_matrix= confusion_matrix(y_pred, y_test)<br />sns.heatmap(conf_matrix, annot=True)<br />
  运行结束时,打印的摘要显示评估了 1,054 个模型,最终模型的估计性能为 91%。
  auto-sklearn results:<br />Dataset name: f4c282bd4b56d4db7e5f7fe1a6a8edeb<br />Metric: accuracy<br />Best validation score: 0.913043<br />Number of target algorithm runs: 1054<br />Number of successful target algorithm runs: 952<br />Number of crashed target algorithm runs: 94<br />Number of target algorithms that exceeded the time limit: 8<br />Number of target algorithms that exceeded the memory limit: 0<br />
  然后在 holdout 数据集上对该模型进行评估,发现其分类准确率达到 81.2%,相当熟练。
  Accuracy: 0.812<br />
  返回任务
  在本节中,Auto-Sklearn 用于挖掘汽车保险数据集的模型。
  汽车保险数据集 [6] 是一个标准的机器学习数据集,由 63 行数据、一个数字输入变量和一个数字目标变量组成。
  使用具有重复分层 10 折交叉验证和三个重复的测试框架,朴素模型实现了大约 66 的平均绝对误差 (MAE)。性能最佳的模型在同一测试框架上实现了大约 28 的 MAE。这为该数据集提供了预期的性能限制。
  该数据集涉及根据不同地理区域的索赔数量预测索赔总额(千瑞典克朗)。
  可以使用与上一节中相同的过程,尽管我们将使用 AutoSklearnRegressor 类而不是 AutoSklearnClassifier。
  默认情况下,回归器将优化指标。如果需要使用均值绝对误差或MAE,可以在调用fit()函数时通过metric参数指定。
  # example of auto-sklearn for the insurance regression dataset<br />from pandas import read_csv<br />from sklearn.model_selection import train_test_split<br />from sklearn.metrics import mean_absolute_error<br />from autosklearn.regression import AutoSklearnRegressor<br />from autosklearn.metrics import mean_absolute_error as auto_mean_absolute_error<br /># load dataset<br />dataframe = read_csv(data, header=None)<br /># split into input and output elements<br />data = dataframe.values<br />data = data.astype('float32')<br />X, y = data[:, :-1], data[:, -1]<br /># split into train and test sets<br />X_train, X_test, y_train, y_test = train_test_split(X, y, <br />                                                    test_size=0.33, <br />                                                    random_state=1)<br /># define search<br />model = AutoSklearnRegressor(time_left_for_this_task=5*60, <br />                             per_run_time_limit=30, n_jobs=8)<br /># perform the search<br />model.fit(X_train, y_train, metric=auto_mean_absolute_error)<br /># summarize<br />print(model.sprint_statistics())<br /># evaluate best model<br />y_hat = model.predict(X_test)<br />mae = mean_absolute_error(y_test, y_hat)<br />print("MAE: %.3f" % mae)<br />
  运行结束时,打印的摘要显示评估了 1,759 个模型,最终模型的估计性能为 29 MAE。
  auto-sklearn results:<br />Dataset name: ff51291d93f33237099d48c48ee0f9ad<br />Metric: mean_absolute_error<br />Best validation score: 29.911203<br />Number of target algorithm runs: 1759<br />Number of successful target algorithm runs: 1362<br />Number of crashed target algorithm runs: 394<br />Number of target algorithms that exceeded the time limit: 3<br />Number of target algorithms that exceeded the memory limit: 0<br />
  保存训练好的模型
  上面训练的分类和回归模型可以使用python包Pickle和JobLib保存。然后可以使用这些保存的模型直接对新数据进行预测。我们可以将模型保存为:
  1.泡菜
  import pickle<br /># save the model <br />filename = 'final_model.sav' <br />pickle.dump(model, open(filename, 'wb'))<br />
  这里的“wb”参数表示我们正在以二进制方式将文件写入磁盘。此外,我们可以将这个保存的模型加载为:
  #load the model<br />loaded_model = pickle.load(open(filename, 'rb'))<br />result = loaded_model.score(X_test, Y_test)<br />print(result)<br />
  这里的“rb”命令意味着我们正在以二进制模式读取文件
  2. 工作库
  同样,我们可以使用以下命令将训练好的模型保存在 JobLib 中。
  
  import joblib<br /># save the model <br />filename = 'final_model.sav'<br />joblib.dump(model, filename)<br />
  我们也可以稍后重新加载这些保存的模型来预测新数据。
  # load the model from disk<br />load_model = joblib.load(filename)<br />result = load_model.score(X_test, Y_test)<br />print(result)<br />
  用户手册地址
  让我们从几个方面解读用户手册[7]。
  时间和内存限制
  auto-sklearn 的一个关键特性是限制允许 scikit-learn 算法使用的资源(内存和时间)。特别是对于大型数据集(算法可能需要数小时和机器交换),一定要在一段时间后停止评估,以便在合理的时间内取得进展。因此,设置资源限制是优化时间和可测试模型数量之间的权衡。
  虽然 auto-sklearn 减轻了手动超参数调整的速度,但用户仍然需要设置内存和时间限制。大多数现代计算机上的 3GB 或 6GB 内存限制对于大多数数据集来说已经足够了。由于时间紧迫,很难给出明确的指导方针。如果可能,一个好的默认设置是总时间限制为一天,单次运行时间限制为 30 分钟。
  更多指南可以在 auto-sklearn/issues/142[8] 中找到。
  限制搜索空间
  除了使用所有可用的估计器之外,还可以限制 auto-sklearn 的搜索空间。以下示例显示如何排除所有预处理方法并将配置空间限制为仅使用随机森林。
  import autosklearn.classification<br /><br />automl = autosklearn.classification.AutoSklearnClassifier(<br />    include_estimators=["random_forest",], <br />   exclude_estimators=None,<br />    include_preprocessors=["no_preprocessing", ], <br />    exclude_preprocessors=None)<br /><br />automl.fit(X_train, y_train)<br />predictions = automl.predict(X_test)<br />
  注意:用于标识估计器和预处理器的字符串是不带 .py 的文件名。
  关闭预处理
  auto-sklearn中的预处理分为数据预处理和特征预处理。数据预处理包括分类特征的单热编码、缺失值的插补以及特征或样本的归一化。目前无法关闭这些步骤。特征预处理是一个单一的特征转换器,可以实现例如特征选择或将特征转换到不同的空间(如 PCA)。如上例所示,可以通过设置 include_preprocessors=["no_preprocessing"] 来关闭特征预处理。
  重采样策略
  可以在 auto-sklearn/examples/ 中找到使用 holdout 数据集和交叉验证的示例。
  结果检查
  Auto-sklearn 允许用户检查训练结果并查看相关统计数据。以下示例显示如何打印不同的统计信息以进行相应检查。
  import autosklearn.classification<br /><br />automl = autosklearn.classification.AutoSklearnClassifier()<br />automl.fit(X_train, y_train)<br />automl.cv_results_<br />automl.sprint_statistics()<br />automl.show_models()<br />
  并行计算
  auto-sklearn 通过共享文件系统上的数据共享支持并行执行。在这种模式下,SMAC 算法通过在每次迭代后将其训练数据写入磁盘来共享其模型的训练数据。在每次迭代开始时,SMAC 加载所有新发现的数据点。我们提供了一个实现 scikit-learn 的 n_jobs 功能的示例,以及一个关于如何手动启动多个 auto-sklearn 实例的示例。
  在默认模式下,auto-sklearn 已经使用了两个内核。第一个用于模型构建,第二个用于在每次新的机器学习模型完成训练时构建集成。序列示例显示了如何一次只使用一个内核按顺序运行这些任务。
  此外,根据 scikit-learn 和 numpy 安装,模型构建过程最多可以使用所有内核。这种行为是 auto-sklearn 所不希望的,很可能是由于从 pypi 安装 numpy 作为二进制轮(参见此处)。做 export OPENBLAS_NUM_THREADS=1 应该禁用此行为并使 numpy 一次只使用一个核心。
  香草自动sklearn
  auto-sklearn主要基于scikit-learn的封装。因此,可以遵循 scikit-learn 中的持久性示例。
  要在高效且稳健的自动机器学习材料中使用 vanilla auto-sklearn,请设置 ensemble_size=1 和 initial_configurations_via_metallearning=0。
  import autosklearn.classification<br />automl = autosklearn.classification.AutoSklearnClassifier(<br />    ensemble_size=1, initial_configurations_via_metalearning=0)<br />
  整体大小为 1 将导致始终选择在验证集上具有最佳测试性能的单个模型。将初始配置 meta-learn 设置为 0 将使 auto-sklearn 使用常规 SMAC 算法来设置新的超参数配置。
  参考文献[1]
  高效且强大的自动化机器学习:
  [2]
  Auto-sklearn官方文档:
  [3]
  AutoSklearnClassifier:#classification
  [4]
  AutoSklearnRegressor:#regression
  [5]
  声纳数据集:
  [6]
  汽车保险数据集:
  [7]
  用户手册:#manual
  [8]
  自动学习/问题/142:
  [9]
  [10]
  往期精彩回顾<br data-darkmode-bgcolor-16019459903493="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16019459903493="rgb(255, 255, 255)" data-darkmode-color-16019459903493="rgb(163, 163, 163)" data-darkmode-original-color-16019459903493="rgb(0, 0, 0)" data-darkmode-bgcolor-16359090834904="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16359090834904="#fff|rgb(255, 255, 255)" data-darkmode-color-16359090834904="rgb(163, 163, 163)" data-darkmode-original-color-16359090834904="#fff|rgb(0, 0, 0)|rgb(62, 62, 62)|rgb(0, 0, 0)|rgb(51, 141, 175)|rgb(0, 0, 0)" style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br data-darkmode-bgcolor-16019459903493="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16019459903493="rgb(255, 255, 255)" data-darkmode-color-16019459903493="rgb(163, 163, 163)" data-darkmode-original-color-16019459903493="rgb(0, 0, 0)" data-darkmode-bgcolor-16359090834904="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16359090834904="#fff|rgb(255, 255, 255)" data-darkmode-color-16359090834904="rgb(163, 163, 163)" data-darkmode-original-color-16359090834904="#fff|rgb(0, 0, 0)|rgb(62, 62, 62)|rgb(0, 0, 0)|rgb(51, 141, 175)|rgb(0, 0, 0)" style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br data-darkmode-bgcolor-16019459903493="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16019459903493="rgb(255, 255, 255)" data-darkmode-color-16019459903493="rgb(163, 163, 163)" data-darkmode-original-color-16019459903493="rgb(0, 0, 0)" data-darkmode-bgcolor-16359090834904="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16359090834904="#fff|rgb(255, 255, 255)" data-darkmode-color-16359090834904="rgb(163, 163, 163)" data-darkmode-original-color-16359090834904="#fff|rgb(0, 0, 0)|rgb(62, 62, 62)|rgb(0, 0, 0)|rgb(51, 141, 175)|rgb(0, 0, 0)" style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br data-darkmode-bgcolor-16019459903493="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16019459903493="rgb(255, 255, 255)" data-darkmode-color-16019459903493="rgb(163, 163, 163)" data-darkmode-original-color-16019459903493="rgb(0, 0, 0)" data-darkmode-bgcolor-16359090834904="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16359090834904="#fff|rgb(255, 255, 255)" data-darkmode-color-16359090834904="rgb(163, 163, 163)" data-darkmode-original-color-16359090834904="#fff|rgb(0, 0, 0)|rgb(62, 62, 62)|rgb(0, 0, 0)|rgb(51, 141, 175)|rgb(0, 0, 0)" style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载中国大学慕课《机器学习》(黄海广主讲)机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑<br data-darkmode-bgcolor-16019459903493="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16019459903493="rgb(255, 255, 255)" data-darkmode-color-16019459903493="rgb(39, 84, 255)" data-darkmode-original-color-16019459903493="rgb(2, 30, 170)" data-darkmode-bgcolor-16359090834904="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16359090834904="#fff|rgb(255, 255, 255)" data-darkmode-color-16359090834904="rgb(39, 84, 255)" data-darkmode-original-color-16359090834904="#fff|rgb(0, 0, 0)|rgb(62, 62, 62)|rgb(0, 0, 0)|rgb(51, 141, 175)|rgb(0, 0, 0)|rgb(2, 30, 170)" style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />AI基础下载机器学习交流qq群955171419,加入微信群请扫码:
  核心方法:网站标题seo怎么写?网站标题关键词写法规范-网站SEO标题分析工具
  网站标题seo,网站标题怎么写?网站标题的作用是什么?网站的标题决定了你网站的排名,为什么这么说呢。因为搜索引擎通过识别标题来识别你网站的主题和你网站的类型。同样,如果用户看到您的标题没有焦点,他们也不会点击进入。所以现在你知道标题的重要性了。
  常规标题写作技巧:
  1.标题核心词-标题核心词2-标题核心词3-品牌词
  2、标题核心词-吸引用户的词-品牌词
  为什么我的标题区间符号是:“-” 因为百度官方说统计区间符号是单杠。这是一个关于如何写标题的教程。使用这个免费的SEO工具,你只需要输入一个标题词,自动采集
页面排名的所有标题。我们只需要将这些数据导出到表中,进行分析,创建自己的标题写法即可。(注意:标题一般不要超过30个字符)
  一个新站想快速对其网站进行排名。方法其实很简单。只要认真按照我的方法去做,一定会有效果的。那到底是什么方法这么厉害呢?
  
  网站处于什么阶段?
  想要做好网站关键词排名,就像病人去看病一样。如果医生不明白他的病人怎么了,他就开药,有意识地打针。会发生什么?影响?连我们自己都不了解我们的网站,它现在是一个什么样的状态,我们该如何优化呢?因此,在前期,我们需要对网站进行阶段性判断。首先简单定位一下,可以分为初级、中期、高级3个阶段。阶段制定不同阶段的优化方法)。
  新站的优化方法应该在什么阶段?有基础的朋友,新站应该知道属于前期,也就是初期优化阶段。我们应该如何开始这个初级优化阶段?为了让更多的朋友看得清楚,李勇简单地将这个初步的优化过程分成了4个小部分给大家。请继续仔细阅读。
  1、分析新站的用户群体
  做网站首先要知道谁会访问我们的网站?他们为什么访问我们的网站?只有在你对你的网站用户有了详细的了解之后,你才能进行下一步,为他们提供有价值的内容。比如李勇的SEO博客访问者一般都是站长或者研究SEO的人,或者是做营销推广的人。他们为什么来访问李勇的SEO博客?因为这个博客上有他们需要的内容!
  2. 选择网站所有者 关键词
  
  一个网站主机关键词就相当于我们的名字,关键词的索引就相当于我们的人气,所以我们尽量选择最热门的,选择那个主机关键词我们确定(可以排名的是关键词),就像我的博客一样,主关键词是李勇SEO博客,因为我是做个人品牌的,所以你懂的,辅助的关键词包括合肥seo、合肥网站优化、合肥seo培训等,选择网站关键词可以说是看你提供的服务。如果你想做品牌,那没关系,主关键词就写你的品牌,如果你不是品牌,纯粹为了流量,建议选主关键词 有交通。
  3.定位网站栏目分类
  当用户进入你的网站时,他们基本上会查看你网站上的栏目,看是否有他们想看的内容,内容应该在那个栏目中。比如你去超市,如果你是买菜的话,你会直接去卖菜的地方。如果是买日用品,应该到卖日用品的地方去。网站栏目的分类我们要根据用户的需求来定位。
  仍然需要充分理解基本理论。这里需要注意的是,学习SEO优化方法需要与时俱进,紧跟搜索引擎的脚步。网上很多理论都与百度的算法渐行渐远。如果你认为自己已经掌握了 SEO 而停滞不前,你就会落后于“时间”。另外,我们需要找到最好的seo学习网站,这个怎么说呢?很多时候seo是一件很随意的事情,大家可以谈一谈,哪些是有根据的,哪些是典型的seo谬论,需要仔细甄别。高效学习SEO的精髓也在这里。
  关键词 是网站必不可少的东西。首先分析关键词的竞争力和搜索热度,准确识别长尾关键词。通常有两种新手。思路是专注于关键词,比如线上推广关键词,直接优化线上推广关键词。为什么?因为这个词有很多搜索量,但是有这样的想法。对于初学者来说,我想说的是,搜索量越大的关键词会更有竞争力,也更难优化,无法以吸引准确的客户,这些客户通常是长期搜索者。来自于结尾关键词,比如在前面加一个地区名“中山网络推广外包”,另一个想法是优化那些没有搜索量的词,为什么?因为这个词没有竞争力,每分钟都是优化的第一名,但是对于有这种想法的新手,我只想说,如果餐厅建在没有人的山顶上,还会有客人吗来吃饭?没有竞争力,没有搜索量,白费那么多力气做什么? 查看全部

  解决方案:【机器学习】一文彻底搞懂自动机器学习AutoML:Auto-Sklearn
  本文将系统全面地介绍自动机器学习常用的框架之一:Auto-Sklearn,介绍安装使用,分类回归小案例,介绍一些使用手册。自动机器学习
  自动化机器学习 AutoML 是机器学习中一个相对较新的领域。它主要自动化机器学习中所有耗时的过程,例如数据预处理、最优算法选择、超参数调优等,可以节省大量构建机器的时间。在学习模型的过程中。
  Automatic Machine Learning AutoML:对于,让表示特征向量,表示相应的目标值。给定训练数据集和从与其相同的数据分布中提取的测试数据集的特征向量,以及资源预算和损失度量,AutoML 问题是自动为测试集生成预测,而 AutoML 问题的解决方案损失值。
  AutoML 是为数据集的数据转换、模型和模型配置发现性能最佳的管道的过程。
  AutoML 通常涉及使用复杂的优化算法(例如贝叶斯优化)来有效地导航可能模型和模型配置的空间,并快速发现对给定预测建模任务最有效的算法。它允许非专业的机器学习从业者快速轻松地发现对给定数据集有效甚至最佳的方法,几乎​​不需要技术背景或直接输入。
  如果你用过sklearn,应该不难理解上面的定义。下面结合一张流程图来进一步理解。
  Auto-Sklearn 系统概述Auto-Sklearn
  Auto-Sklearn 是一个开源库,用于在 Python 中执行 AutoML。它利用流行的 Scikit-Learn 机器学习库进行数据转换和机器学习算法。
  它是由 Matthias Feurer 等人开发的。并在他们 2015 年题为“高效且稳健的自动化机器学习 [1]”的论文中进行了描述。
  …我们引入了一个基于 scikit-learn 的强大的新 AutoML 系统(使用 15 个分类器、14 种特征预处理方法和 4 种数据预处理方法,产生具有 110 个超参数的结构化假设空间)
  我们介绍了一个基于 scikit-learn 的强大的新 AutoML 系统(使用 15 个分类器、14 种特征预处理方法和 4 种数据预处理方法,产生了一个具有 110 个超参数的结构化假设空间)。
  Auto-Sklearn 的好处是,除了发现数据预处理和模型来为数据集执行之外,它还能够从在类似数据集上表现良好的模型中学习,并可以自动创建性能最佳的集成作为优化过程的一部分找到的模型。
  这个系统,我们称之为 AUTO-SKLEARN,通过自动考虑过去在类似数据集上的表现,并通过在优化期间评估的模型构建集成,改进了现有的 AutoML 方法。
  我们称之为 AUTO-SKLEARN 的这个系统通过自动考虑过去在类似数据集上的表现并通过优化期间评估的模型构建集成来改进现有的 AutoML 方法。
  Auto-Sklearn 是对通用 AutoML 方法的改进。自动机器学习框架采用贝叶斯超参数优化方法来有效地发现给定数据集的最佳性能模型管道。
  这里添加了两个额外的组件:
  这种元学习方法是对用于优化 ML 框架的贝叶斯优化的补充。对于与整个 ML 框架一样大的超参数空间,贝叶斯优化起步缓慢。选择了几种配置用于基于元学习的种子贝叶斯优化。这种通过元学习的方法可以称为热启动优化方法。再加上多模型自动集成的方式,整个机器学习过程高度自动化,将大大节省用户的时间。从这个过程来看,机器学习用户可以有更多的时间来选择数据和思考要处理的问题。
  贝叶斯优化
  贝叶斯优化的原理是利用已有样本在优化目标函数方面的表现来构建后验模型。后验模型上的每个点都是高斯分布,具有均值和方差。如果该点是已有的样本点,均值为优化目标函数在该点的值,方差为0。其他未知样本点的均值和方差由后验概率拟合,不一定接近真正的价值。然后用一个采集函数不断测试这些未知样本点对应的优化目标函数值,不断更新后验概率模型。由于采集函数可以兼顾Explore/Exploit,将选择更多具有良好性能和高潜力的点。因此,当资源预算耗尽时,往往可以得到很好的优化结果。即寻找优化目标函数中的局部最优参数。
  贝叶斯优化
  上图是贝叶斯优化应用于简单一维问题的实验图。这些图显示了四次迭代后高斯过程对目标函数的逼近。下面以t=3为例介绍图中各部分的作用。
  上图中的两个评价黑点和一个红色评价是备选模型经过三次评价后的初始值估计,会影响下一个点的选择,可以画出很多通过这三个点的曲线。黑色虚线曲线是实际的真实目标函数(通常是未知的)。黑色实线是代理模型目标函数的平均值。紫色区域是代理模型目标函数的方差。绿色阴影部分是指采集函数的值,取最大值的点作为下一个采样点。只有三个点,拟合效果稍差。黑点越多,黑色实线和黑色虚线之间的面积越小,误差越小,
  安装和使用 Auto-Sklearn
  Auto-sklearn 提供开箱即用的监督式自动机器学习。从名字就可以看出,auto-sklearn是基于机器学习库scikit-learn构建的,可以自动搜索新数据集的学习算法,并优化其超参数。因此,它将机器学习用户从繁琐的任务中解放出来,让他们有更多时间专注于实际问题。
  这里可以参考auto-sklearn官方文档[2]。
  Ubuntu
  >>> sudo apt-get install build-essential swig<br />>>> conda install gxx_linux-64 gcc_linux-64 swig<br />>>> curl `https://raw.githubusercontent. ... s.txt` | xargs -n 1 -L 1 pip install<br />>>> pip install auto-sklearn<br />
  蟒蛇
  pip install auto-sklearn<br />
  安装后,我们可以导入库并打印版本号以确认安装成功:
  # print autosklearn version<br />import autosklearn<br />print('autosklearn: %s' % autosklearn.__version__)<br />
  您的版本号应该相同或更高。
  autosklearn: 0.6.0<br />
  根据预测任务,无论是分类还是回归,都可以创建和配置 AutoSklearnClassifier[3] 或 AutoSklearnRegressor[4] 类的实例,将其拟合到数据集,仅此而已。然后可以直接使用生成的模型进行预测或保存到文件(使用 pickle)供以后使用。
  AutoSklearn 类参数
  AutoSklearn 类提供了大量的配置选项作为参数。
  默认情况下,搜索将在搜索过程中使用数据集的训练测试拆分,为了速度和简单性,这里建议使用默认值。
  参数n_jobs可以设置为系统的核心数,如果有8个核心,则n_jobs=8。
  通常,优化过程会连续运行并以分钟为单位。默认情况下,它将运行一小时。
  这里建议将time_left_for_this_task参数设置为这个任务的最大时间(你希望进程运行的秒数)。例如,对于许多小型预测建模任务(行数少于 1,000 的数据集)来说,不到 5-10 分钟就足够了。如果不指定该参数,进程将连续运行,以分钟计,进程运行一小时,即60分钟。此示例通过 per_run_time_limit 参数将分配给每个模型评估的时间限制为 30 秒。例如:
  # define search<br />model = AutoSklearnClassifier(time_left_for_this_task=5*60, <br />                              per_run_time_limit=30,<br />                              n_jobs=8)<br />
  还有其他参数,如 ensemble_size、initial_configurations_via_metallearning 可用于微调分类器。默认情况下,上述搜索命令会创建一组性能最佳的模型。为了避免过度拟合,我们可以通过更改设置 ensemble_size = 1 和 initial_configurations_via_metallearning = 0 来禁用它。我们在设置分类器时排除了这些以保持方法简单。
  在运行结束时,可以访问模型列表以及其他详细信息。sprint_statistics() 函数总结了最终模型的搜索和性能。
  # summarize performance<br />print(model.sprint_statistics())<br />
  分类任务
  在本节中,我们将使用 Auto-Sklearn 来发现 Sonar 数据集的模型。
  
  Sonar 数据集 [5] 是一个标准的机器学习数据集,由 208 行数据和 60 个数字输入变量和一个具有两个类值的目标变量组成,例如二分类。
  使用重复分层 10 折交叉验证的测试框架,重复 3 次,朴素模型可以达到约 53% 的准确度。性能最好的模型在相同的测试框架上达到了大约 88% 的准确率。这为该数据集提供了预期的性能范围。
  该数据集涉及预测声纳返回是指示岩石还是模拟地雷。
  # summarize the sonar dataset<br />from pandas import read_csv<br /># load dataset<br />dataframe = read_csv(data, header=None)<br /># split into input and output elements<br />data = dataframe.values<br />X, y = data[:, :-1], data[:, -1]<br />print(X.shape, y.shape)<br />
  运行该示例会下载数据集并将其拆分为输入和输出元素。您可以看到具有 60 个输入变量的 208 行数据。
  (208, 60) (208,)<br />
  首先,将数据集分为训练集和测试集,目标是在训练集上找到一个好的模型,然后评估在 holdout 测试集上找到的模型的性能。
  # split into train and test sets<br />X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1)<br />
  使用以下命令从 autosklearn 导入分类模型。
  from autosklearn.classification import AutoSklearnClassifier<br />
  AutoSklearnClassifier 配置为使用 8 个内核运行 5 分钟,并将每个模型评估限制为 30 秒。
  # define search<br />model = AutoSklearnClassifier(time_left_for_this_task=5*60,<br />                              per_run_time_limit=30, n_jobs=8,<br />                              tmp_folder='/temp/autosklearn_classification_example_tmp')<br />
  这里提供了一个临时的日志保存路径,方便我们后面打印运行明细。
  然后在训练数据集上执行搜索。
  # perform the search<br />model.fit(X_train, y_train)<br />
  报告搜索摘要和最佳性能模型。
  # summarize<br />print(model.sprint_statistics())<br />
  可以使用以下命令为搜索考虑的所有模型打印排行榜。
  # leaderboard<br />print(model.leaderboard())<br />
  可以使用以下命令打印有关所考虑模型的信息。
  print(model.show_models())<br />
  我们还可以使用SMOTE、集成学习(bagging、boosting)、NearMiss算法等技术来解决数据集中的不平衡问题。
  最后评估模型在测试数据集上的性能。
  # evaluate best model<br />y_pred = model.predict(X_test)<br />acc = accuracy_score(y_test, y_pred)<br />print("Accuracy: %.3f" % acc)<br />
  也可以打印集成的最终分数和混淆矩阵。
  # Score of the final ensemble<br />from sklearn.metrics import accuracy_score<br />m1_acc_score= accuracy_score(y_test, y_pred)<br />m1_acc_score<br />from sklearn.metrics import confusion_matrix, accuracy_score<br />y_pred= model.predict(X_test)<br />conf_matrix= confusion_matrix(y_pred, y_test)<br />sns.heatmap(conf_matrix, annot=True)<br />
  运行结束时,打印的摘要显示评估了 1,054 个模型,最终模型的估计性能为 91%。
  auto-sklearn results:<br />Dataset name: f4c282bd4b56d4db7e5f7fe1a6a8edeb<br />Metric: accuracy<br />Best validation score: 0.913043<br />Number of target algorithm runs: 1054<br />Number of successful target algorithm runs: 952<br />Number of crashed target algorithm runs: 94<br />Number of target algorithms that exceeded the time limit: 8<br />Number of target algorithms that exceeded the memory limit: 0<br />
  然后在 holdout 数据集上对该模型进行评估,发现其分类准确率达到 81.2%,相当熟练。
  Accuracy: 0.812<br />
  返回任务
  在本节中,Auto-Sklearn 用于挖掘汽车保险数据集的模型。
  汽车保险数据集 [6] 是一个标准的机器学习数据集,由 63 行数据、一个数字输入变量和一个数字目标变量组成。
  使用具有重复分层 10 折交叉验证和三个重复的测试框架,朴素模型实现了大约 66 的平均绝对误差 (MAE)。性能最佳的模型在同一测试框架上实现了大约 28 的 MAE。这为该数据集提供了预期的性能限制。
  该数据集涉及根据不同地理区域的索赔数量预测索赔总额(千瑞典克朗)。
  可以使用与上一节中相同的过程,尽管我们将使用 AutoSklearnRegressor 类而不是 AutoSklearnClassifier。
  默认情况下,回归器将优化指标。如果需要使用均值绝对误差或MAE,可以在调用fit()函数时通过metric参数指定。
  # example of auto-sklearn for the insurance regression dataset<br />from pandas import read_csv<br />from sklearn.model_selection import train_test_split<br />from sklearn.metrics import mean_absolute_error<br />from autosklearn.regression import AutoSklearnRegressor<br />from autosklearn.metrics import mean_absolute_error as auto_mean_absolute_error<br /># load dataset<br />dataframe = read_csv(data, header=None)<br /># split into input and output elements<br />data = dataframe.values<br />data = data.astype('float32')<br />X, y = data[:, :-1], data[:, -1]<br /># split into train and test sets<br />X_train, X_test, y_train, y_test = train_test_split(X, y, <br />                                                    test_size=0.33, <br />                                                    random_state=1)<br /># define search<br />model = AutoSklearnRegressor(time_left_for_this_task=5*60, <br />                             per_run_time_limit=30, n_jobs=8)<br /># perform the search<br />model.fit(X_train, y_train, metric=auto_mean_absolute_error)<br /># summarize<br />print(model.sprint_statistics())<br /># evaluate best model<br />y_hat = model.predict(X_test)<br />mae = mean_absolute_error(y_test, y_hat)<br />print("MAE: %.3f" % mae)<br />
  运行结束时,打印的摘要显示评估了 1,759 个模型,最终模型的估计性能为 29 MAE。
  auto-sklearn results:<br />Dataset name: ff51291d93f33237099d48c48ee0f9ad<br />Metric: mean_absolute_error<br />Best validation score: 29.911203<br />Number of target algorithm runs: 1759<br />Number of successful target algorithm runs: 1362<br />Number of crashed target algorithm runs: 394<br />Number of target algorithms that exceeded the time limit: 3<br />Number of target algorithms that exceeded the memory limit: 0<br />
  保存训练好的模型
  上面训练的分类和回归模型可以使用python包Pickle和JobLib保存。然后可以使用这些保存的模型直接对新数据进行预测。我们可以将模型保存为:
  1.泡菜
  import pickle<br /># save the model <br />filename = 'final_model.sav' <br />pickle.dump(model, open(filename, 'wb'))<br />
  这里的“wb”参数表示我们正在以二进制方式将文件写入磁盘。此外,我们可以将这个保存的模型加载为:
  #load the model<br />loaded_model = pickle.load(open(filename, 'rb'))<br />result = loaded_model.score(X_test, Y_test)<br />print(result)<br />
  这里的“rb”命令意味着我们正在以二进制模式读取文件
  2. 工作库
  同样,我们可以使用以下命令将训练好的模型保存在 JobLib 中。
  
  import joblib<br /># save the model <br />filename = 'final_model.sav'<br />joblib.dump(model, filename)<br />
  我们也可以稍后重新加载这些保存的模型来预测新数据。
  # load the model from disk<br />load_model = joblib.load(filename)<br />result = load_model.score(X_test, Y_test)<br />print(result)<br />
  用户手册地址
  让我们从几个方面解读用户手册[7]。
  时间和内存限制
  auto-sklearn 的一个关键特性是限制允许 scikit-learn 算法使用的资源(内存和时间)。特别是对于大型数据集(算法可能需要数小时和机器交换),一定要在一段时间后停止评估,以便在合理的时间内取得进展。因此,设置资源限制是优化时间和可测试模型数量之间的权衡。
  虽然 auto-sklearn 减轻了手动超参数调整的速度,但用户仍然需要设置内存和时间限制。大多数现代计算机上的 3GB 或 6GB 内存限制对于大多数数据集来说已经足够了。由于时间紧迫,很难给出明确的指导方针。如果可能,一个好的默认设置是总时间限制为一天,单次运行时间限制为 30 分钟。
  更多指南可以在 auto-sklearn/issues/142[8] 中找到。
  限制搜索空间
  除了使用所有可用的估计器之外,还可以限制 auto-sklearn 的搜索空间。以下示例显示如何排除所有预处理方法并将配置空间限制为仅使用随机森林。
  import autosklearn.classification<br /><br />automl = autosklearn.classification.AutoSklearnClassifier(<br />    include_estimators=["random_forest",], <br />   exclude_estimators=None,<br />    include_preprocessors=["no_preprocessing", ], <br />    exclude_preprocessors=None)<br /><br />automl.fit(X_train, y_train)<br />predictions = automl.predict(X_test)<br />
  注意:用于标识估计器和预处理器的字符串是不带 .py 的文件名。
  关闭预处理
  auto-sklearn中的预处理分为数据预处理和特征预处理。数据预处理包括分类特征的单热编码、缺失值的插补以及特征或样本的归一化。目前无法关闭这些步骤。特征预处理是一个单一的特征转换器,可以实现例如特征选择或将特征转换到不同的空间(如 PCA)。如上例所示,可以通过设置 include_preprocessors=["no_preprocessing"] 来关闭特征预处理。
  重采样策略
  可以在 auto-sklearn/examples/ 中找到使用 holdout 数据集和交叉验证的示例。
  结果检查
  Auto-sklearn 允许用户检查训练结果并查看相关统计数据。以下示例显示如何打印不同的统计信息以进行相应检查。
  import autosklearn.classification<br /><br />automl = autosklearn.classification.AutoSklearnClassifier()<br />automl.fit(X_train, y_train)<br />automl.cv_results_<br />automl.sprint_statistics()<br />automl.show_models()<br />
  并行计算
  auto-sklearn 通过共享文件系统上的数据共享支持并行执行。在这种模式下,SMAC 算法通过在每次迭代后将其训练数据写入磁盘来共享其模型的训练数据。在每次迭代开始时,SMAC 加载所有新发现的数据点。我们提供了一个实现 scikit-learn 的 n_jobs 功能的示例,以及一个关于如何手动启动多个 auto-sklearn 实例的示例。
  在默认模式下,auto-sklearn 已经使用了两个内核。第一个用于模型构建,第二个用于在每次新的机器学习模型完成训练时构建集成。序列示例显示了如何一次只使用一个内核按顺序运行这些任务。
  此外,根据 scikit-learn 和 numpy 安装,模型构建过程最多可以使用所有内核。这种行为是 auto-sklearn 所不希望的,很可能是由于从 pypi 安装 numpy 作为二进制轮(参见此处)。做 export OPENBLAS_NUM_THREADS=1 应该禁用此行为并使 numpy 一次只使用一个核心。
  香草自动sklearn
  auto-sklearn主要基于scikit-learn的封装。因此,可以遵循 scikit-learn 中的持久性示例。
  要在高效且稳健的自动机器学习材料中使用 vanilla auto-sklearn,请设置 ensemble_size=1 和 initial_configurations_via_metallearning=0。
  import autosklearn.classification<br />automl = autosklearn.classification.AutoSklearnClassifier(<br />    ensemble_size=1, initial_configurations_via_metalearning=0)<br />
  整体大小为 1 将导致始终选择在验证集上具有最佳测试性能的单个模型。将初始配置 meta-learn 设置为 0 将使 auto-sklearn 使用常规 SMAC 算法来设置新的超参数配置。
  参考文献[1]
  高效且强大的自动化机器学习:
  [2]
  Auto-sklearn官方文档:
  [3]
  AutoSklearnClassifier:#classification
  [4]
  AutoSklearnRegressor:#regression
  [5]
  声纳数据集:
  [6]
  汽车保险数据集:
  [7]
  用户手册:#manual
  [8]
  自动学习/问题/142:
  [9]
  [10]
  往期精彩回顾<br data-darkmode-bgcolor-16019459903493="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16019459903493="rgb(255, 255, 255)" data-darkmode-color-16019459903493="rgb(163, 163, 163)" data-darkmode-original-color-16019459903493="rgb(0, 0, 0)" data-darkmode-bgcolor-16359090834904="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16359090834904="#fff|rgb(255, 255, 255)" data-darkmode-color-16359090834904="rgb(163, 163, 163)" data-darkmode-original-color-16359090834904="#fff|rgb(0, 0, 0)|rgb(62, 62, 62)|rgb(0, 0, 0)|rgb(51, 141, 175)|rgb(0, 0, 0)" style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br data-darkmode-bgcolor-16019459903493="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16019459903493="rgb(255, 255, 255)" data-darkmode-color-16019459903493="rgb(163, 163, 163)" data-darkmode-original-color-16019459903493="rgb(0, 0, 0)" data-darkmode-bgcolor-16359090834904="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16359090834904="#fff|rgb(255, 255, 255)" data-darkmode-color-16359090834904="rgb(163, 163, 163)" data-darkmode-original-color-16359090834904="#fff|rgb(0, 0, 0)|rgb(62, 62, 62)|rgb(0, 0, 0)|rgb(51, 141, 175)|rgb(0, 0, 0)" style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br data-darkmode-bgcolor-16019459903493="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16019459903493="rgb(255, 255, 255)" data-darkmode-color-16019459903493="rgb(163, 163, 163)" data-darkmode-original-color-16019459903493="rgb(0, 0, 0)" data-darkmode-bgcolor-16359090834904="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16359090834904="#fff|rgb(255, 255, 255)" data-darkmode-color-16359090834904="rgb(163, 163, 163)" data-darkmode-original-color-16359090834904="#fff|rgb(0, 0, 0)|rgb(62, 62, 62)|rgb(0, 0, 0)|rgb(51, 141, 175)|rgb(0, 0, 0)" style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br data-darkmode-bgcolor-16019459903493="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16019459903493="rgb(255, 255, 255)" data-darkmode-color-16019459903493="rgb(163, 163, 163)" data-darkmode-original-color-16019459903493="rgb(0, 0, 0)" data-darkmode-bgcolor-16359090834904="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16359090834904="#fff|rgb(255, 255, 255)" data-darkmode-color-16359090834904="rgb(163, 163, 163)" data-darkmode-original-color-16359090834904="#fff|rgb(0, 0, 0)|rgb(62, 62, 62)|rgb(0, 0, 0)|rgb(51, 141, 175)|rgb(0, 0, 0)" style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载中国大学慕课《机器学习》(黄海广主讲)机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑<br data-darkmode-bgcolor-16019459903493="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16019459903493="rgb(255, 255, 255)" data-darkmode-color-16019459903493="rgb(39, 84, 255)" data-darkmode-original-color-16019459903493="rgb(2, 30, 170)" data-darkmode-bgcolor-16359090834904="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16359090834904="#fff|rgb(255, 255, 255)" data-darkmode-color-16359090834904="rgb(39, 84, 255)" data-darkmode-original-color-16359090834904="#fff|rgb(0, 0, 0)|rgb(62, 62, 62)|rgb(0, 0, 0)|rgb(51, 141, 175)|rgb(0, 0, 0)|rgb(2, 30, 170)" style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />AI基础下载机器学习交流qq群955171419,加入微信群请扫码:
  核心方法:网站标题seo怎么写?网站标题关键词写法规范-网站SEO标题分析工具
  网站标题seo,网站标题怎么写?网站标题的作用是什么?网站的标题决定了你网站的排名,为什么这么说呢。因为搜索引擎通过识别标题来识别你网站的主题和你网站的类型。同样,如果用户看到您的标题没有焦点,他们也不会点击进入。所以现在你知道标题的重要性了。
  常规标题写作技巧:
  1.标题核心词-标题核心词2-标题核心词3-品牌词
  2、标题核心词-吸引用户的词-品牌词
  为什么我的标题区间符号是:“-” 因为百度官方说统计区间符号是单杠。这是一个关于如何写标题的教程。使用这个免费的SEO工具,你只需要输入一个标题词,自动采集
页面排名的所有标题。我们只需要将这些数据导出到表中,进行分析,创建自己的标题写法即可。(注意:标题一般不要超过30个字符)
  一个新站想快速对其网站进行排名。方法其实很简单。只要认真按照我的方法去做,一定会有效果的。那到底是什么方法这么厉害呢?
  
  网站处于什么阶段?
  想要做好网站关键词排名,就像病人去看病一样。如果医生不明白他的病人怎么了,他就开药,有意识地打针。会发生什么?影响?连我们自己都不了解我们的网站,它现在是一个什么样的状态,我们该如何优化呢?因此,在前期,我们需要对网站进行阶段性判断。首先简单定位一下,可以分为初级、中期、高级3个阶段。阶段制定不同阶段的优化方法)。
  新站的优化方法应该在什么阶段?有基础的朋友,新站应该知道属于前期,也就是初期优化阶段。我们应该如何开始这个初级优化阶段?为了让更多的朋友看得清楚,李勇简单地将这个初步的优化过程分成了4个小部分给大家。请继续仔细阅读。
  1、分析新站的用户群体
  做网站首先要知道谁会访问我们的网站?他们为什么访问我们的网站?只有在你对你的网站用户有了详细的了解之后,你才能进行下一步,为他们提供有价值的内容。比如李勇的SEO博客访问者一般都是站长或者研究SEO的人,或者是做营销推广的人。他们为什么来访问李勇的SEO博客?因为这个博客上有他们需要的内容!
  2. 选择网站所有者 关键词
  
  一个网站主机关键词就相当于我们的名字,关键词的索引就相当于我们的人气,所以我们尽量选择最热门的,选择那个主机关键词我们确定(可以排名的是关键词),就像我的博客一样,主关键词是李勇SEO博客,因为我是做个人品牌的,所以你懂的,辅助的关键词包括合肥seo、合肥网站优化、合肥seo培训等,选择网站关键词可以说是看你提供的服务。如果你想做品牌,那没关系,主关键词就写你的品牌,如果你不是品牌,纯粹为了流量,建议选主关键词 有交通。
  3.定位网站栏目分类
  当用户进入你的网站时,他们基本上会查看你网站上的栏目,看是否有他们想看的内容,内容应该在那个栏目中。比如你去超市,如果你是买菜的话,你会直接去卖菜的地方。如果是买日用品,应该到卖日用品的地方去。网站栏目的分类我们要根据用户的需求来定位。
  仍然需要充分理解基本理论。这里需要注意的是,学习SEO优化方法需要与时俱进,紧跟搜索引擎的脚步。网上很多理论都与百度的算法渐行渐远。如果你认为自己已经掌握了 SEO 而停滞不前,你就会落后于“时间”。另外,我们需要找到最好的seo学习网站,这个怎么说呢?很多时候seo是一件很随意的事情,大家可以谈一谈,哪些是有根据的,哪些是典型的seo谬论,需要仔细甄别。高效学习SEO的精髓也在这里。
  关键词 是网站必不可少的东西。首先分析关键词的竞争力和搜索热度,准确识别长尾关键词。通常有两种新手。思路是专注于关键词,比如线上推广关键词,直接优化线上推广关键词。为什么?因为这个词有很多搜索量,但是有这样的想法。对于初学者来说,我想说的是,搜索量越大的关键词会更有竞争力,也更难优化,无法以吸引准确的客户,这些客户通常是长期搜索者。来自于结尾关键词,比如在前面加一个地区名“中山网络推广外包”,另一个想法是优化那些没有搜索量的词,为什么?因为这个词没有竞争力,每分钟都是优化的第一名,但是对于有这种想法的新手,我只想说,如果餐厅建在没有人的山顶上,还会有客人吗来吃饭?没有竞争力,没有搜索量,白费那么多力气做什么?

汇总:分页列表详细信息采集 | 2个月精通优采云 第1课

采集交流优采云 发表了文章 • 0 个评论 • 76 次浏览 • 2022-11-21 19:29 • 来自相关话题

  汇总:分页列表详细信息采集 | 2个月精通优采云
第1课
  在之前的教程中,我们以赶集网店铺数据采集和携程旅行数据为例,体验了一波优采云
采集数据的常(li)正(hai)操作。
  嗯?在这两个实战案例中,规则配置看起来很相似,采集过程也有点相似?
  来吧,是时候追本溯源,透过现象看本质了。
  网页内容由相似的块组成。需要点击“下一页”翻页,然后点击各个链接进入详情页采集数据。
  本文示例网站地址为:
  在开始采集之前,需要观察网页的结构,明确采集的内容。以示例URL为例,内容有4页,每页有3个电影链接。我们需要点击每部电影的链接,进入电影详情页,采集
电影的剧情、上映时间等字段。
  优采云
基于Firefox核心浏览器,通过模拟人的思维和操作,全自动提取网页内容。以示例 URL 为例。在优采云
中打开后,需要创建一个翻页循环,点击“下一页”,然后点击“下一页”自动翻页。然后建立一个电影链接列表循环,打开每部电影的链接,进入电影详情页。然后采集电影详情页的数据。
  1打开网页
  1) 登录优采云
7.0采集器,点击新建任务,选择“自定义采集”。进入任务配置页面
  2) 输入要采集的网址,点击“保存网址”。系统会进入流程设计页面,自动打开之前输入的网址
  2 创建翻页循环
  1) 用鼠标单击“下一页”按钮,在弹出的操作提示框中选择“循环单击下一页”。这一步会模拟手动,自动点击翻页
  
  3 创建循环列表
  1) 点击下图中第一部电影“教父2”的链接,该链接将被选中并标有绿色框
  2) 优采云
的智能算法会自动检测其他相似元素(在这种情况下,链接到其他两个电影标题)。在操作提示框中选择“全选”,优采云
会自动选择所有电影链接
  3) 选择“循环点击每个链接”,优采云
会自动逐一点击每个电影链接,进入电影详情页面
  4 提取数据
  1)在页面点击要提取的电影的title字段,title字段会被选中,选中后用红框标注
  2)在弹出的提示框中,选择“采集
该元素的文本”,表示要采集
页面中的文本数据
  3)同理,点击要采集的其他段,然后选择“采集该元素的文本”
  5 修改字段名称
  1) 点击“流程”按钮,显示“流程设计器”和“自定义当前操作”两个版块。(规则配置过程中可随时打开“流程”)
  2) 在如下界面中,修改字段名称。这里的字段名相当于表头,方便采集时区分各个字段类别。修改完成后点击“确定”保存
  
  6 开始采集
  1) 点击“保存并开始”,在弹出的对话框中选择“开始本地采集”。系统会在本地电脑上启动采集任务,采集数据
  2)任务采集完成后会弹出采集结束的提示,然后选择导出数据,这里以选择导出excel2007为例,然后点击确定
  3)选择文件存放路径,然后点击保存
  然后,我们在几分钟内得到了这样的数据
  动画模式是否让学习更愉快?
  如果您有任何建议或问题,请在 biubiubiu 给我留言!
  给大家的忠告
  学会了分页列表详情的采集
  趁热打铁
  更多实用教程
  汇总:文章采集软件大全
  推荐一:emlog文章自动采集
插件v5.3.1
  简介:从事网站编辑工作的朋友可能需要采集其他网站的内容。如果想快速采集
需要的文章,可以试试小编带来的这款emlog文章自动采集
插件。这是一款简单方便的文章采集
工具,可以帮助用户快速采集
网站上的文章发布到自己的博客中,还可以选择标签和分类。使用方法 1.设置采集时间 2.输入采集链接。如果需要分批,可以设置为txt文件 3.点击Analysis采集
文章信息 更新功能 1:新增用法...
  推荐二:小白短句 v1.1
  简介:向大家推荐一款简单易用的采集
软件“小白短句”。这个软件的界面非常清爽,没有任何捆绑和插件。用户可以使用本软件从网上随机搜集短句,找到你喜欢的句子提供全面精美的句子,使用起来非常方便,阅读效果也很好。欢迎大家下载使用~ 使用方法 运行软件,点击开始欣赏不一样的短句。每次点击都会获得新的短句 亮点 小优点...
  推荐三:zblog采集软件v1.1
  简介:zblog是一个基于Java语言编写的博客系统。很多朋友喜欢在上面发布或者浏览一些信息。今天小编带来的zblog采集
软件就是为本博客平台打造的采集
工具。是一个简单的小程序,具有采集
文章的功能。通过该软件,用户可以快速采集
其他网站的文章并发布到支持自定义采集
的zblog博客。软件功能 支持自动采集对方图片到你的网站 支持发布文章到标签栏 支持任意用户发布文章 支持采集内容,快速过滤内容 支持定时...
  emlog采集
器(自定义采集
规则)v1.3.2:
  简介:emlog采集器是一款为网站内容运营者开发的采集发布工具。它可以将规则导入软件集合。压缩包内附有采集规则样例,供参考。不会使用的朋友可以先看看,然后自己使用 编辑需要的采集
规则,采集
的文章可以在软件界面预览,支持一键发布多篇文章。软件特点 1.emlog采集器采集流程简单,自定义采集规则 2.软件采集可以导入规则,可以在TXT中预先编辑采集规则 3.新用户可以在里面设置新规则软件,然后保存起来以备下次使用 4....
  获取各平台今日热门文章v1.1:
  简介:想要快速获取最新的热点新闻文章,就试试这款获取各平台今日热搜文章的工具吧!本软件为用户提供了互联网上的热搜和采集
功能。它非常强大且易于使用。支持知乎、微博、百度、虎嗅、豆瓣等大家喜欢看的各种平台,让用户轻松上网。网络热点内容,快速查看最新消息!软件开发各平台今日热搜、热文采集,让你一览天下!在信息飞速传播的今天,流量为王,信息孤岛形成。有时我们不得不浏览各种平台和网站来查看最新消息。. . 第二...
  微信文章下载助手v1.1:
  简介:很多朋友平时喜欢在微信平台上浏览一些公众号的文章。如果看到自己需要的内容,想要保存下载,可以使用小编带来的这款微信文章下载助手。软件简单实用,功能强大。,可以帮助用户快速获取微信公众号发布的文章内容,支持抓取指定关键词或段落,保存在本地,方便后续操作。软件开发 经过一个月左右的断断续续的学习和两天的开发,已经实现了Go语言版的微信文章下载助手!它移植了我自己的同名Java项目,纯命令行操作,可以...
  zblog采集
插件v1.0.1:
  简介:zblog采集
插件是论坛网友制作的一款易语言小程序。它的主要功能是帮助用户从其他网站采集
文章资源,然后发布到指定的zblog博客上获得点击率。您可以自由自定义集合对象。收款规则定了,收款效率也很稳定。但是,由于该程序是用一种简单的语言编写的,因此在使用时需要添加信任。插件功能可以采集
其他网站的文章,发布到你的zblog博客上。
  伪原创文章采集
工具v1.1:
  简介:伪原创文章收录工具是一款简单易用的文章自动收录和优化小站长工具。您可以使用它来自动采集
目标站的文本。软件提供相似词替换功能,还支持用户自定义关键词替换,可以有效改善文章的虚假原创,使用方法也非常简单。只需三步即可完成。软件特色 自动采集目标站文章,重新制作伪原创。这个工具可以优化文章,让伪原创更好。自己选择...
  通用文章文本提取系统v1.0.0.2:
  简介:万能文章文本提取系统可以自动提取网站上的文章,非常方便。当我们在网上看到自己喜欢或需要的文章内容时,就可以使用本软件进行获取,全自动运行,使用非常简单,用户只需要输入文章地址即可实现一-点击提取,比复制更快更简单,支持批量操作!软件功能 1、软件无需编写规则,支持全自动采集 2、采集前,检查软件目录下是否有“采集存储配置.ini”和“采集链接.txt”两个文件。
  热门博客外推软件v1.3:
  简介:大众博客外推软件现有20000个采集模块,提供四种不同的更新模式,打破传统手动更新网站的方式,直接帮你批量采集其他博客和网站的内容,获取的数据你可以处理并发布,或导出为任意格式,省心省事,让您花最少的精力管理最多的网站。软件特色 现有20,000个采集模块 模块市场有20,000个采集模块,涵盖各种大型博客、新闻、论坛和门户网站。您可以随时使用这些模块或制作您需要的捕获模块。任何格式导入指南...
  
  emlog采集发布插件v1.1.0.1:
  简介:emlog采集发布插件非常智能,可以帮助用户快速采集网站文章内容。通过该软件可以自动采集网站整页文章的图文,并支持对采集内容进行二次编辑发布。当目标网站有文章更新时,还可以提醒用户,方便实用。软件特性支持显示效果设置标题样式文章自动采集HTML5代码编辑一键登录发布文章软件特性标签列表:使用自动标签后,如果列表中的文章收录
关键词,将自动添加标签文章发布...
  AI智能文章采集软件v1.4:
  简介:AI智能文章采集软件对于从事自媒体或者软文的朋友来说,一定是一款非常实用的文章采集加工神器。本软件不仅可以帮助用户采集
好文章,还可以进行伪原创加工,一键发布,加工后的文章原创率和收录率都在80%以上,大大提高了营销效果。我推荐大家尝试一下。相信你会喜欢的~ 软件特色 一篇好文章不仅可以收录你的软文,排名和转化都出彩,直接提升了营销效果。您可以选择今日头条、趣味头条、一点资讯、东方头条……
  知乎文章采集导出助手v1.1.2:
  简介:知乎文章采集
导出助手可以帮助用户批量下载导出知乎上的文章,支持导出知乎网站任意问答中的问答,以及问答评论区,还可以指定所有用户下的文章,包括文章内容和文章评论,导出格式以html格式为主,也可以导出pdf和Word格式。软件说明 1、可以帮助用户根据关键词采集
知乎上的文章内容,并支持批量下载导出;2、收录文章中的图片、视频格式不变;3.导出格式主要是html格式,也可以导出pd...
  沙漠采集器(今日文章合集)v1.0.0.1:
  简介:沙漠采集器可以高效快速的将各类爆款文章下载到本地。用户可以设置一个或多个关键字进行采集
。一个关键字可以采集
数万篇文章。它还支持过滤阅读时间、评论时间和时间。支持多线程下载图片,从事自媒体行业的朋友一定要试试这款文章采集工具!软件功能支持过滤阅读次数、评论次数、时间、图片多线程下载。包括但不限于:热点、图片、科技、娱乐、游戏、体育、汽车、财经、美食、军事、国际、时尚、旅游、探索、亲子、健康、美容、历史、...
  skycc文章采集工具v1.1:
  简介:一篇好的文章不仅可以让你的软文在采集
、排名、转化等方面大放异彩。直接提升营销效果。可以选择今日头条、趣头条、一点新闻、东方头条等各大自媒体平台的文章,进行热点文章的搜集。操作简单方便。只需输入关键词即可开始采集
文章,并可随时暂停。您也可以打开它查看文章的详细信息。做自媒体和发软文的朋友,如果有这个软件,可以借用一下...
  伪原创v1.1文章合集:
  介绍:伪原创文章采集主要是采集文章,替换为伪原创,根据定制生成伪原创。主要面向自媒体用户和软文用户。用户一键采集
相关文章。还增加了替换相似词的功能,进一步优化伪原创。它还增加了可自定义的关键字替换功能,可以由用户选择。...
  skycc文章采集批量伪原创工具v1.3:
  介绍:skycc文章采集批量伪原创工具,主要是自动批量采集文章,对采集到的文章进行批量伪原创,然后进行批量伪原创检查。也可以对单篇文章进行伪原创批处理。提高文章原创性,大大加速搜索引擎收录。注意:如果软件无法正常打开,请安装JAVA环境...
  奥本微信文章采集软件v2.1:
  简介:奥本微信文章采集软件是一款非常好用的微信文章采集器。本软件可以支持各种微信热门文章的搜索导出,还支持汽车、历史、笑话、生活、教育、健康、时尚等十几个热门栏目的文章搜索导出,软件搜索文章非常快,而且超级好用,非常适合从事自媒体行业的人下载使用。...
  优采云
智能文章采集系统v2016.04.09:
  简介:优采云
智能文章采集系统,不知道源码规则也能采集,只要是文章内容站,都可以快速采集优采云
智能文章采集系统,不知道源码规则也能采集,只要是文章内容类网站都能快速采集并自动伪原创中英文,原创度80%以上。自动去噪乱码和文章长度判断,获得干净整洁的文章内容。全球小语种支持,指定网站采集
,非文章源多线程多任务(Multisite)同步...
  多多极速蜘蛛v1.1:
  简介:多多快蜘蛛是多多软件出品的一款专业用于互联网文章和网址高效采集的产品。软件具有网站域名采集、文章智能采集、网站文件检测三大功能。打破了传统软件操作难、速度慢的局限,真正做到了1分钟上手,10分钟精通。使用MongoDB数据库可以真正实现分布式高速存储和提取。主要特点: 分布式极速采集任务分配给多个客户端,具有...
  
  宏业文章采集
器v3.7:
  简介:红叶文章采集器是一款超强的网站文章采集器。它的英文名字是Fast_Spider。它属于蜘蛛爬虫程序。必备文章价值和浏览价值,自动HTM-TXT转换。本软件为绿色软件,解压后即可使用!红叶文章采集器软件特点(1)本软件采用北大天网MD5指纹加权算法,...
  麒麟文章采集工具v1.1:
  介绍:麒麟文章采集软件,采集站内文章,不再需要写采集规则,因为不是每个人都会写,也不是适合所有站点。并且可以收录未收录的文章,一般网站都可以收录。麒麟文章采集软件操作方法:只需输入网址,设置好要采集的文章后缀的URL,即可采集本站文章的所有内容,包括文章标题,文章链接地址文章,文章采集
后...
  优采云
万能文章采集器v3.2.6.1:
  简介:优采云
是优采云
软件出品的一款万能文章采集软件。只需输入关键词就可以采集
各种网页和新闻,也可以采集
指定列表页(栏目页)的文章。注意:微信引擎有严格的限制,请将采集线程数设置为1,否则很容易生成验证码。特点: 1、依托优采云
软件优质的通用文本识别智能算法,可实现对任意网页文本的自动提取,有效率达95%以上。2. 只需键入 关键词 即可...
  WEB基础高性能网络爬虫文章采集
器v6.1:
  简介:基于WEB的高性能网页爬虫文章采集器是一款通用的网页采集爬虫。它可以在不配置模板的情况下采集
世界上任何网站的精华文章。WEB基础高性能网络爬虫文章采集
器是一个网络蜘蛛爬虫程序,用于从指定网站采集
大量精华文章,并将垃圾网页信息直接丢弃,只保存有阅读价值和浏览的精华文章值,并自动执行HTM-TXT转换,并提取标题,正...
  展越高性能网络爬虫文章采集器v6.1:
  简介:赞悦高性能网络爬虫文章采集器是一款通用的网页爬虫。它可以在不配置模板的情况下采集
世界上任何网站的精华文章。本软件全称为赞悦高性能网页爬虫文章采集器,属于网页蜘蛛爬虫程序。用于采集
指定网站的大量精华文章,会直接丢弃其中的垃圾网页信息,只保存有阅读价值和浏览价值的。精华文章,自动HTM-TXT转换,并提取...
  智汇seo软件v1.7:
  简介:智汇seo软件是一款集网站自动更新、长尾关键词自动组合、文章采集
、文章伪原创等功能为一体的多功能网站优化推广软件。本软件需要.net framework 2.0以上的运行环境。功能一:多任务定时自动更新网站(无人值守) 您可以根据需要自由设置采集时间和发布更新文章的时间间隔,尽可能科学自动化地管理您的网站。你...
  甲子博客营销助手v7.1:
  简介:甲子博客营销助手是一款博客推广软件。推广思路: 1、采集
各大网站的热门博文 2、自动添加你设置的链接地址 3、自动发布到各大博客网站 4、自动推广你的博客(漫游、加好友、留言等) 如果有数以百万计的文章在网上流传,有你的链接,不断被转发和搜索……
  猪浏览器(原猪采集器
)v2.2.3.5:
  简介:小猪浏览器(原小猪采集器
)致力于服务草根站长。是站长必备的工具箱和浏览器。小猪浏览器集成了小猪采集
助手、推广助手、搜索助手、投票助手、采集
脚本、文章编辑、采集
夹、图片管理、站长工具等大量功能。注意:小猪浏览器程序一定要放在英文目录下。.....
  站长之星v2.0.3.2:
  简介:站长之星是集文章采集、文章处理、文章发布于一体的专业网站群内容管理系统。界面美观,操作简单,功能强大。站长星拥有完整灵活的执行流程引擎、配置扩展机制和插件系统。你只需要提供一个目标关键词,就可以得到很多相关的关键词(即长尾关键词),然后用这个... &nbsp;
  以上内容是小​​编整理的关于文章采集软件百科的相关攻略内容。如有不妥,请及时与我们联系。想要了解更多文章采集
的最新攻略和资讯,请多多关注全茶网
  关键词:
  文章合集 查看全部

  汇总:分页列表详细信息采集 | 2个月精通优采云
第1课
  在之前的教程中,我们以赶集网店铺数据采集和携程旅行数据为例,体验了一波优采云
采集数据的常(li)正(hai)操作。
  嗯?在这两个实战案例中,规则配置看起来很相似,采集过程也有点相似?
  来吧,是时候追本溯源,透过现象看本质了。
  网页内容由相似的块组成。需要点击“下一页”翻页,然后点击各个链接进入详情页采集数据。
  本文示例网站地址为:
  在开始采集之前,需要观察网页的结构,明确采集的内容。以示例URL为例,内容有4页,每页有3个电影链接。我们需要点击每部电影的链接,进入电影详情页,采集
电影的剧情、上映时间等字段。
  优采云
基于Firefox核心浏览器,通过模拟人的思维和操作,全自动提取网页内容。以示例 URL 为例。在优采云
中打开后,需要创建一个翻页循环,点击“下一页”,然后点击“下一页”自动翻页。然后建立一个电影链接列表循环,打开每部电影的链接,进入电影详情页。然后采集电影详情页的数据。
  1打开网页
  1) 登录优采云
7.0采集器,点击新建任务,选择“自定义采集”。进入任务配置页面
  2) 输入要采集的网址,点击“保存网址”。系统会进入流程设计页面,自动打开之前输入的网址
  2 创建翻页循环
  1) 用鼠标单击“下一页”按钮,在弹出的操作提示框中选择“循环单击下一页”。这一步会模拟手动,自动点击翻页
  
  3 创建循环列表
  1) 点击下图中第一部电影“教父2”的链接,该链接将被选中并标有绿色框
  2) 优采云
的智能算法会自动检测其他相似元素(在这种情况下,链接到其他两个电影标题)。在操作提示框中选择“全选”,优采云
会自动选择所有电影链接
  3) 选择“循环点击每个链接”,优采云
会自动逐一点击每个电影链接,进入电影详情页面
  4 提取数据
  1)在页面点击要提取的电影的title字段,title字段会被选中,选中后用红框标注
  2)在弹出的提示框中,选择“采集
该元素的文本”,表示要采集
页面中的文本数据
  3)同理,点击要采集的其他段,然后选择“采集该元素的文本”
  5 修改字段名称
  1) 点击“流程”按钮,显示“流程设计器”和“自定义当前操作”两个版块。(规则配置过程中可随时打开“流程”)
  2) 在如下界面中,修改字段名称。这里的字段名相当于表头,方便采集时区分各个字段类别。修改完成后点击“确定”保存
  
  6 开始采集
  1) 点击“保存并开始”,在弹出的对话框中选择“开始本地采集”。系统会在本地电脑上启动采集任务,采集数据
  2)任务采集完成后会弹出采集结束的提示,然后选择导出数据,这里以选择导出excel2007为例,然后点击确定
  3)选择文件存放路径,然后点击保存
  然后,我们在几分钟内得到了这样的数据
  动画模式是否让学习更愉快?
  如果您有任何建议或问题,请在 biubiubiu 给我留言!
  给大家的忠告
  学会了分页列表详情的采集
  趁热打铁
  更多实用教程
  汇总:文章采集软件大全
  推荐一:emlog文章自动采集
插件v5.3.1
  简介:从事网站编辑工作的朋友可能需要采集其他网站的内容。如果想快速采集
需要的文章,可以试试小编带来的这款emlog文章自动采集
插件。这是一款简单方便的文章采集
工具,可以帮助用户快速采集
网站上的文章发布到自己的博客中,还可以选择标签和分类。使用方法 1.设置采集时间 2.输入采集链接。如果需要分批,可以设置为txt文件 3.点击Analysis采集
文章信息 更新功能 1:新增用法...
  推荐二:小白短句 v1.1
  简介:向大家推荐一款简单易用的采集
软件“小白短句”。这个软件的界面非常清爽,没有任何捆绑和插件。用户可以使用本软件从网上随机搜集短句,找到你喜欢的句子提供全面精美的句子,使用起来非常方便,阅读效果也很好。欢迎大家下载使用~ 使用方法 运行软件,点击开始欣赏不一样的短句。每次点击都会获得新的短句 亮点 小优点...
  推荐三:zblog采集软件v1.1
  简介:zblog是一个基于Java语言编写的博客系统。很多朋友喜欢在上面发布或者浏览一些信息。今天小编带来的zblog采集
软件就是为本博客平台打造的采集
工具。是一个简单的小程序,具有采集
文章的功能。通过该软件,用户可以快速采集
其他网站的文章并发布到支持自定义采集
的zblog博客。软件功能 支持自动采集对方图片到你的网站 支持发布文章到标签栏 支持任意用户发布文章 支持采集内容,快速过滤内容 支持定时...
  emlog采集
器(自定义采集
规则)v1.3.2:
  简介:emlog采集器是一款为网站内容运营者开发的采集发布工具。它可以将规则导入软件集合。压缩包内附有采集规则样例,供参考。不会使用的朋友可以先看看,然后自己使用 编辑需要的采集
规则,采集
的文章可以在软件界面预览,支持一键发布多篇文章。软件特点 1.emlog采集器采集流程简单,自定义采集规则 2.软件采集可以导入规则,可以在TXT中预先编辑采集规则 3.新用户可以在里面设置新规则软件,然后保存起来以备下次使用 4....
  获取各平台今日热门文章v1.1:
  简介:想要快速获取最新的热点新闻文章,就试试这款获取各平台今日热搜文章的工具吧!本软件为用户提供了互联网上的热搜和采集
功能。它非常强大且易于使用。支持知乎、微博、百度、虎嗅、豆瓣等大家喜欢看的各种平台,让用户轻松上网。网络热点内容,快速查看最新消息!软件开发各平台今日热搜、热文采集,让你一览天下!在信息飞速传播的今天,流量为王,信息孤岛形成。有时我们不得不浏览各种平台和网站来查看最新消息。. . 第二...
  微信文章下载助手v1.1:
  简介:很多朋友平时喜欢在微信平台上浏览一些公众号的文章。如果看到自己需要的内容,想要保存下载,可以使用小编带来的这款微信文章下载助手。软件简单实用,功能强大。,可以帮助用户快速获取微信公众号发布的文章内容,支持抓取指定关键词或段落,保存在本地,方便后续操作。软件开发 经过一个月左右的断断续续的学习和两天的开发,已经实现了Go语言版的微信文章下载助手!它移植了我自己的同名Java项目,纯命令行操作,可以...
  zblog采集
插件v1.0.1:
  简介:zblog采集
插件是论坛网友制作的一款易语言小程序。它的主要功能是帮助用户从其他网站采集
文章资源,然后发布到指定的zblog博客上获得点击率。您可以自由自定义集合对象。收款规则定了,收款效率也很稳定。但是,由于该程序是用一种简单的语言编写的,因此在使用时需要添加信任。插件功能可以采集
其他网站的文章,发布到你的zblog博客上。
  伪原创文章采集
工具v1.1:
  简介:伪原创文章收录工具是一款简单易用的文章自动收录和优化小站长工具。您可以使用它来自动采集
目标站的文本。软件提供相似词替换功能,还支持用户自定义关键词替换,可以有效改善文章的虚假原创,使用方法也非常简单。只需三步即可完成。软件特色 自动采集目标站文章,重新制作伪原创。这个工具可以优化文章,让伪原创更好。自己选择...
  通用文章文本提取系统v1.0.0.2:
  简介:万能文章文本提取系统可以自动提取网站上的文章,非常方便。当我们在网上看到自己喜欢或需要的文章内容时,就可以使用本软件进行获取,全自动运行,使用非常简单,用户只需要输入文章地址即可实现一-点击提取,比复制更快更简单,支持批量操作!软件功能 1、软件无需编写规则,支持全自动采集 2、采集前,检查软件目录下是否有“采集存储配置.ini”和“采集链接.txt”两个文件。
  热门博客外推软件v1.3:
  简介:大众博客外推软件现有20000个采集模块,提供四种不同的更新模式,打破传统手动更新网站的方式,直接帮你批量采集其他博客和网站的内容,获取的数据你可以处理并发布,或导出为任意格式,省心省事,让您花最少的精力管理最多的网站。软件特色 现有20,000个采集模块 模块市场有20,000个采集模块,涵盖各种大型博客、新闻、论坛和门户网站。您可以随时使用这些模块或制作您需要的捕获模块。任何格式导入指南...
  
  emlog采集发布插件v1.1.0.1:
  简介:emlog采集发布插件非常智能,可以帮助用户快速采集网站文章内容。通过该软件可以自动采集网站整页文章的图文,并支持对采集内容进行二次编辑发布。当目标网站有文章更新时,还可以提醒用户,方便实用。软件特性支持显示效果设置标题样式文章自动采集HTML5代码编辑一键登录发布文章软件特性标签列表:使用自动标签后,如果列表中的文章收录
关键词,将自动添加标签文章发布...
  AI智能文章采集软件v1.4:
  简介:AI智能文章采集软件对于从事自媒体或者软文的朋友来说,一定是一款非常实用的文章采集加工神器。本软件不仅可以帮助用户采集
好文章,还可以进行伪原创加工,一键发布,加工后的文章原创率和收录率都在80%以上,大大提高了营销效果。我推荐大家尝试一下。相信你会喜欢的~ 软件特色 一篇好文章不仅可以收录你的软文,排名和转化都出彩,直接提升了营销效果。您可以选择今日头条、趣味头条、一点资讯、东方头条……
  知乎文章采集导出助手v1.1.2:
  简介:知乎文章采集
导出助手可以帮助用户批量下载导出知乎上的文章,支持导出知乎网站任意问答中的问答,以及问答评论区,还可以指定所有用户下的文章,包括文章内容和文章评论,导出格式以html格式为主,也可以导出pdf和Word格式。软件说明 1、可以帮助用户根据关键词采集
知乎上的文章内容,并支持批量下载导出;2、收录文章中的图片、视频格式不变;3.导出格式主要是html格式,也可以导出pd...
  沙漠采集器(今日文章合集)v1.0.0.1:
  简介:沙漠采集器可以高效快速的将各类爆款文章下载到本地。用户可以设置一个或多个关键字进行采集
。一个关键字可以采集
数万篇文章。它还支持过滤阅读时间、评论时间和时间。支持多线程下载图片,从事自媒体行业的朋友一定要试试这款文章采集工具!软件功能支持过滤阅读次数、评论次数、时间、图片多线程下载。包括但不限于:热点、图片、科技、娱乐、游戏、体育、汽车、财经、美食、军事、国际、时尚、旅游、探索、亲子、健康、美容、历史、...
  skycc文章采集工具v1.1:
  简介:一篇好的文章不仅可以让你的软文在采集
、排名、转化等方面大放异彩。直接提升营销效果。可以选择今日头条、趣头条、一点新闻、东方头条等各大自媒体平台的文章,进行热点文章的搜集。操作简单方便。只需输入关键词即可开始采集
文章,并可随时暂停。您也可以打开它查看文章的详细信息。做自媒体和发软文的朋友,如果有这个软件,可以借用一下...
  伪原创v1.1文章合集:
  介绍:伪原创文章采集主要是采集文章,替换为伪原创,根据定制生成伪原创。主要面向自媒体用户和软文用户。用户一键采集
相关文章。还增加了替换相似词的功能,进一步优化伪原创。它还增加了可自定义的关键字替换功能,可以由用户选择。...
  skycc文章采集批量伪原创工具v1.3:
  介绍:skycc文章采集批量伪原创工具,主要是自动批量采集文章,对采集到的文章进行批量伪原创,然后进行批量伪原创检查。也可以对单篇文章进行伪原创批处理。提高文章原创性,大大加速搜索引擎收录。注意:如果软件无法正常打开,请安装JAVA环境...
  奥本微信文章采集软件v2.1:
  简介:奥本微信文章采集软件是一款非常好用的微信文章采集器。本软件可以支持各种微信热门文章的搜索导出,还支持汽车、历史、笑话、生活、教育、健康、时尚等十几个热门栏目的文章搜索导出,软件搜索文章非常快,而且超级好用,非常适合从事自媒体行业的人下载使用。...
  优采云
智能文章采集系统v2016.04.09:
  简介:优采云
智能文章采集系统,不知道源码规则也能采集,只要是文章内容站,都可以快速采集优采云
智能文章采集系统,不知道源码规则也能采集,只要是文章内容类网站都能快速采集并自动伪原创中英文,原创度80%以上。自动去噪乱码和文章长度判断,获得干净整洁的文章内容。全球小语种支持,指定网站采集
,非文章源多线程多任务(Multisite)同步...
  多多极速蜘蛛v1.1:
  简介:多多快蜘蛛是多多软件出品的一款专业用于互联网文章和网址高效采集的产品。软件具有网站域名采集、文章智能采集、网站文件检测三大功能。打破了传统软件操作难、速度慢的局限,真正做到了1分钟上手,10分钟精通。使用MongoDB数据库可以真正实现分布式高速存储和提取。主要特点: 分布式极速采集任务分配给多个客户端,具有...
  
  宏业文章采集
器v3.7:
  简介:红叶文章采集器是一款超强的网站文章采集器。它的英文名字是Fast_Spider。它属于蜘蛛爬虫程序。必备文章价值和浏览价值,自动HTM-TXT转换。本软件为绿色软件,解压后即可使用!红叶文章采集器软件特点(1)本软件采用北大天网MD5指纹加权算法,...
  麒麟文章采集工具v1.1:
  介绍:麒麟文章采集软件,采集站内文章,不再需要写采集规则,因为不是每个人都会写,也不是适合所有站点。并且可以收录未收录的文章,一般网站都可以收录。麒麟文章采集软件操作方法:只需输入网址,设置好要采集的文章后缀的URL,即可采集本站文章的所有内容,包括文章标题,文章链接地址文章,文章采集
后...
  优采云
万能文章采集器v3.2.6.1:
  简介:优采云
是优采云
软件出品的一款万能文章采集软件。只需输入关键词就可以采集
各种网页和新闻,也可以采集
指定列表页(栏目页)的文章。注意:微信引擎有严格的限制,请将采集线程数设置为1,否则很容易生成验证码。特点: 1、依托优采云
软件优质的通用文本识别智能算法,可实现对任意网页文本的自动提取,有效率达95%以上。2. 只需键入 关键词 即可...
  WEB基础高性能网络爬虫文章采集
器v6.1:
  简介:基于WEB的高性能网页爬虫文章采集器是一款通用的网页采集爬虫。它可以在不配置模板的情况下采集
世界上任何网站的精华文章。WEB基础高性能网络爬虫文章采集
器是一个网络蜘蛛爬虫程序,用于从指定网站采集
大量精华文章,并将垃圾网页信息直接丢弃,只保存有阅读价值和浏览的精华文章值,并自动执行HTM-TXT转换,并提取标题,正...
  展越高性能网络爬虫文章采集器v6.1:
  简介:赞悦高性能网络爬虫文章采集器是一款通用的网页爬虫。它可以在不配置模板的情况下采集
世界上任何网站的精华文章。本软件全称为赞悦高性能网页爬虫文章采集器,属于网页蜘蛛爬虫程序。用于采集
指定网站的大量精华文章,会直接丢弃其中的垃圾网页信息,只保存有阅读价值和浏览价值的。精华文章,自动HTM-TXT转换,并提取...
  智汇seo软件v1.7:
  简介:智汇seo软件是一款集网站自动更新、长尾关键词自动组合、文章采集
、文章伪原创等功能为一体的多功能网站优化推广软件。本软件需要.net framework 2.0以上的运行环境。功能一:多任务定时自动更新网站(无人值守) 您可以根据需要自由设置采集时间和发布更新文章的时间间隔,尽可能科学自动化地管理您的网站。你...
  甲子博客营销助手v7.1:
  简介:甲子博客营销助手是一款博客推广软件。推广思路: 1、采集
各大网站的热门博文 2、自动添加你设置的链接地址 3、自动发布到各大博客网站 4、自动推广你的博客(漫游、加好友、留言等) 如果有数以百万计的文章在网上流传,有你的链接,不断被转发和搜索……
  猪浏览器(原猪采集器
)v2.2.3.5:
  简介:小猪浏览器(原小猪采集器
)致力于服务草根站长。是站长必备的工具箱和浏览器。小猪浏览器集成了小猪采集
助手、推广助手、搜索助手、投票助手、采集
脚本、文章编辑、采集
夹、图片管理、站长工具等大量功能。注意:小猪浏览器程序一定要放在英文目录下。.....
  站长之星v2.0.3.2:
  简介:站长之星是集文章采集、文章处理、文章发布于一体的专业网站群内容管理系统。界面美观,操作简单,功能强大。站长星拥有完整灵活的执行流程引擎、配置扩展机制和插件系统。你只需要提供一个目标关键词,就可以得到很多相关的关键词(即长尾关键词),然后用这个... &nbsp;
  以上内容是小​​编整理的关于文章采集软件百科的相关攻略内容。如有不妥,请及时与我们联系。想要了解更多文章采集
的最新攻略和资讯,请多多关注全茶网
  关键词:
  文章合集

汇总:算法自动采集列表页微信相关推文,自动过滤各种性质的软文

采集交流优采云 发表了文章 • 0 个评论 • 62 次浏览 • 2022-11-21 11:40 • 来自相关话题

  汇总:算法自动采集列表页微信相关推文,自动过滤各种性质的软文
  算法自动采集列表页微信相关推文,自动过滤各种性质的软文,无需一一手动操作。一键过滤关键词相关、建议的软文内容等常见违规推文即可。
  搜狗。以前用百度搜过的数据库里的那个用了百度的想换一个。自从用了这个,以前用百度搜的根本不用动脑子了,因为搜不到比它更好的。
  
  站长推广:各种网站购买广告位推广,现在广告主都用百度,推广成本高;搜狗推广推广网站;资源互换:或类似于中介的形式,按照成交量收费。
  搜狗啊!百度自从作大了莆田系医院后就死的一干二净。
  谢邀没用过,
  
  不好。因为ios上,只要真正的软文,都不推荐用搜狗搜索,而是点开即收藏。(百度经验这类算是伪软文吧)不过,对于app本身有推荐的,百度搜索肯定比不上ios上的搜狗。不过既然阿里想做手机,我估计ios上搜狗会有比搜狗搜索更好的地方,比如只推送验证码。
  前两天用搜狗搜索了下搜索引擎和资源大战,也就是你说的那些内容,准确率还可以,但是基本还是和谷歌某些验证码识别有差距。另外,我用手机浏览器都有很多伪原创很多未被收录了,搜狗搜索确实很不适应。
  我觉得大家发的就是比较真实的,根据百度搜狗的识别来,我再来几条比较真实的。我没试过。都是从看到的一些内容来的,不一定是百度自己发的。纯属参考:视频:这个视频是百度百科搜出来的,有句话有误解在,选择性收看在。但说实话我真的不喜欢这种感觉,从百度百科看出来的人物,真的没有耐心去阅读前面的那句话:谷歌搜索关键词:13节气注意事项来搜:第一个网站上面讲的非常清楚第二个,你看搜索里的那句话的后面大体也能猜出来点啥原因,这次更是愣是查出来的差不多了。
  可能也就选择性地看第一遍吧(360手机助手很多伪原创我也看了,连文章本身大概的意思都看不出来,也难怪,你不是内容搜索)如果你是换机后想看谷歌搜索里的那句话,也可以尝试一下使用搜狗搜索看看:谷歌搜索识别:248413页谷歌识别:184903页谷歌识别:222664页谷歌识别:264358页谷歌识别:51838页谷歌识别:19658页谷歌识别:23186页谷歌识别:264358页谷歌识别:215456页谷歌识别:20822页谷歌识别:28152页谷歌识别:21192页谷歌识别:187406页谷歌识别:26409页谷歌识别:20688页谷歌识别:22298页谷歌识别:23739页谷歌识别:15792页谷歌识别:139658页谷歌识别:17566页谷歌识别:10401页谷歌识别:136649页谷歌识别。 查看全部

  汇总:算法自动采集列表页微信相关推文,自动过滤各种性质的软文
  算法自动采集列表页微信相关推文,自动过滤各种性质的软文,无需一一手动操作。一键过滤关键词相关、建议的软文内容等常见违规推文即可。
  搜狗。以前用百度搜过的数据库里的那个用了百度的想换一个。自从用了这个,以前用百度搜的根本不用动脑子了,因为搜不到比它更好的。
  
  站长推广:各种网站购买广告位推广,现在广告主都用百度,推广成本高;搜狗推广推广网站;资源互换:或类似于中介的形式,按照成交量收费。
  搜狗啊!百度自从作大了莆田系医院后就死的一干二净。
  谢邀没用过,
  
  不好。因为ios上,只要真正的软文,都不推荐用搜狗搜索,而是点开即收藏。(百度经验这类算是伪软文吧)不过,对于app本身有推荐的,百度搜索肯定比不上ios上的搜狗。不过既然阿里想做手机,我估计ios上搜狗会有比搜狗搜索更好的地方,比如只推送验证码。
  前两天用搜狗搜索了下搜索引擎和资源大战,也就是你说的那些内容,准确率还可以,但是基本还是和谷歌某些验证码识别有差距。另外,我用手机浏览器都有很多伪原创很多未被收录了,搜狗搜索确实很不适应。
  我觉得大家发的就是比较真实的,根据百度搜狗的识别来,我再来几条比较真实的。我没试过。都是从看到的一些内容来的,不一定是百度自己发的。纯属参考:视频:这个视频是百度百科搜出来的,有句话有误解在,选择性收看在。但说实话我真的不喜欢这种感觉,从百度百科看出来的人物,真的没有耐心去阅读前面的那句话:谷歌搜索关键词:13节气注意事项来搜:第一个网站上面讲的非常清楚第二个,你看搜索里的那句话的后面大体也能猜出来点啥原因,这次更是愣是查出来的差不多了。
  可能也就选择性地看第一遍吧(360手机助手很多伪原创我也看了,连文章本身大概的意思都看不出来,也难怪,你不是内容搜索)如果你是换机后想看谷歌搜索里的那句话,也可以尝试一下使用搜狗搜索看看:谷歌搜索识别:248413页谷歌识别:184903页谷歌识别:222664页谷歌识别:264358页谷歌识别:51838页谷歌识别:19658页谷歌识别:23186页谷歌识别:264358页谷歌识别:215456页谷歌识别:20822页谷歌识别:28152页谷歌识别:21192页谷歌识别:187406页谷歌识别:26409页谷歌识别:20688页谷歌识别:22298页谷歌识别:23739页谷歌识别:15792页谷歌识别:139658页谷歌识别:17566页谷歌识别:10401页谷歌识别:136649页谷歌识别。

解决方案:算法自动采集列表信息的模板很多,题主加定位

采集交流优采云 发表了文章 • 0 个评论 • 36 次浏览 • 2022-11-19 07:11 • 来自相关话题

  解决方案:算法自动采集列表信息的模板很多,题主加定位
  算法自动采集列表信息的模板很多,题主加定位,地点和类型。选定一个模板之后可以在网站首页看到推荐的分页列表,点击后可查看详情。这是个rank模式的爬虫,采集目标是你感兴趣的网站列表页。前端每个页面的抓取开销比较大,可以考虑采用分布式、redis等设备保存数据。
  scrapygallery
  去阿里定向搜索某几个列表,然后在某个列表中搜索关键词,
  
  爬虫么。
  用js抓网页源码保存到数据库中。
  我用github-foxmylengger/scrapy-webdriver:webdriver:compiledandbuiltwithreact-nativeforreact。jsprogramming。focusingoncreatingconsole。js,advancingreactwebdevelopmenttoenhanceandadvanceyourwebbrowserserver。
  
  从哪儿抓数据,
  我个人觉得和某一需求有关,如果有需求就去抓、如果没有需求你有空要做的工作那么多,你的兴趣点在哪里就去哪儿抓,如果你有一堆需求并没有那么多兴趣在哪个领域,那么肯定去什么分类找某一个,
  爬虫么?
  先说你的需求,要是这样要计算的话,就得把所有的需求要具体说一下了,比如你要干什么?确定好这个再去看就好了啊,到底一个大数据库要多少内存,多少带宽。而且好多例子要具体说的,比如规模,好多都不太清楚。 查看全部

  解决方案:算法自动采集列表信息的模板很多,题主加定位
  算法自动采集列表信息的模板很多,题主加定位,地点和类型。选定一个模板之后可以在网站首页看到推荐的分页列表,点击后可查看详情。这是个rank模式的爬虫,采集目标是你感兴趣的网站列表页。前端每个页面的抓取开销比较大,可以考虑采用分布式、redis等设备保存数据。
  scrapygallery
  去阿里定向搜索某几个列表,然后在某个列表中搜索关键词
  
  爬虫么。
  用js抓网页源码保存到数据库中。
  我用github-foxmylengger/scrapy-webdriver:webdriver:compiledandbuiltwithreact-nativeforreact。jsprogramming。focusingoncreatingconsole。js,advancingreactwebdevelopmenttoenhanceandadvanceyourwebbrowserserver。
  
  从哪儿抓数据,
  我个人觉得和某一需求有关,如果有需求就去抓、如果没有需求你有空要做的工作那么多,你的兴趣点在哪里就去哪儿抓,如果你有一堆需求并没有那么多兴趣在哪个领域,那么肯定去什么分类找某一个,
  爬虫么?
  先说你的需求,要是这样要计算的话,就得把所有的需求要具体说一下了,比如你要干什么?确定好这个再去看就好了啊,到底一个大数据库要多少内存,多少带宽。而且好多例子要具体说的,比如规模,好多都不太清楚。

解决方案:网络结构自动设计算法——BlockQNN

采集交流优采云 发表了文章 • 0 个评论 • 40 次浏览 • 2022-11-19 06:08 • 来自相关话题

  解决方案:网络结构自动设计算法——BlockQNN
  以下是商汤科技在大规模分布式训练领域发表的一篇重磅口头报告(口头)论文,提出了一种基于分布式训练的深度强化学习BlockQNN算法,用于自动设计神经网络结构。本文由商汤科技实习研究员钟昭在商汤研究院副院长严俊杰、研究经理吴伟指导下撰写。
  神经网络结构设计一直是深度学习的核心问题。在基于深度学习的分类、检测、分割和跟踪任务中,基础神经网络的结构对整体算法的性能具有决定性的影响。传统的神经网络结构设计需要大量的专业知识和试错成本,甚至需要一些灵感和“魔笔”,每年只有少数几个影响更大的新网络结构被设计出来,因此手工设计网络结构是极其困难的。网络结构的自动设计/搜索方法近年来受到广泛关注,它试图将人们从复杂繁琐的网络设计参数中解放出来,以实现自动化深度学习的目标(如图1所示)。
  图 1:(从左到右)。
  从人工设计的网络结构到
  网络结构由算法自动设计
  最近的网络结构自动设计/搜索算法通常需要大量的计算资源(例如,谷歌的 NAS 算法需要数百个 GPU 和近一个月的训练时间),并且由此产生的模型移植性不高,难以实现真正的实际使用。本文提出的BlockQNN算法可以解决现有网络结构自动设计/搜索方法的效率和泛化问题。
  基于“块”的网络结构表示
  目前主流的深度神经网络结构极其复杂,其深度往往达到上百层,直接搜索整个网络结构的搜索空间非常大,这也是以往的自动网络结构设计/搜索算法效率相对低下的原因之一。同时,直接设计整个网络的策略将导致网络结构不被通用化。例如,基于CIFAR数据集搜索的网络结构由于其数据输入的大小限制,仅适用于处理32x32分辨率的数据,这使得搜索网络结构的泛化性能较弱。
  针对这些问题,本文借鉴了现代主流深度神经网络的设计思路,如ResNet、Inception等网络。这些网络由相同结构的子网的重复组合形成,本文称之为块。通过设计块结构,可以大大减少网络结构的搜索空间,并且块结构本身具有很强的泛化性,对于不同的数据集或任务,只需要叠加不同数量的块(如图2所示)。
  图2:
  基于区块设计的网络整体框架
  左边是CIFAR的框架,右边是ImageNet的框架。
  表一:
  网络结构编码表
  为了表示网络块结构,本文设计了一套网络结构编码,将神经网络视为有向无环图,每个节点代表网络中的每一层,边缘代表数据流的方向。整个编码包括神经网络的层序号、类型、内核的大小以及两个序号节点的序号。可以使用这种编码来表示任意神经网络结构,例如 ResNet 和 Inception 的块结构,可以使用图 3 中的编码来表示。
  图3:
  Inception 和 Resnet 中的块结构编码表示
  基于强化学习的网络结构自动设计
  下一个核心问题是如何获得最优的网络结构。尽管通过设计大大减少了网络结构的搜索空间,但对所有可能结构的直接暴力搜索仍然是计算密集型的。因此,该文提出一种基于强化学习的网络设计方法,该方法可以自动学习网络结构。在网络设计中的强化学习中,本文将当前神经网络层定义为强化学习中的
  
  当前状态,将下一层结构的决策定义为强化学习中的动作。此处使用先前定义的神经网络结构编码来表示网络的每一层。这样,通过一系列动作决策,可以获得代表块结构的代码(如图4所示),所提出的强化学习算法通过优化找到最优的动作决策序列。本文采用Q学习算法进行学习,具体公式不展开。
  图4:
  基于强化学习的自动化网络结构设计流程
  值得注意的是,与一般的强化学习问题不同,这个任务只有在决定结束整个序列后(即生成完整的网络结构之后)才会得到奖励,之前的每一个决策对应奖励。由于获得最终奖励的成本非常高(需要在数据上重新训练新获得的网络结构),为了加快其收敛速度,笔者采用了奖励 SHAPING 技术(如图 5 所示),这样初始训练阶段终止层的 Q 值不会太高, 这样算法就不会在训练的初始阶段生成层太浅的网络结构。
  图5:
  奖励整形对收敛效率的影响
  尽早停止策略
  尽管可以使用多种技术来使自动化网络结构设计更加高效。然而,自动网络设计耗时的关键在于每个奖励的时间成本非常高,生成的网络结构需要在相应的数据集上进行训练以收敛,然后获得相应的精度来表示结构的质量并用作奖励。本文作者发现,通过调整学习率,只有正常训练过程的三分之一(例如,在CIFAR-100数据集上训练12个epoch)可以获得网络的近似最终精度,可以大大降低时间成本。然而,这种网络结构及其相关奖励的准确性会产生误差,导致无法精细区分网络结构的优缺点,本文提出了一个经验解公式:
  也就是说,真正的奖励与
  提前停止,但它与网络结构的计算复杂度和结构连接的复杂度(边数除以块中的点数)成反比。通过这样的公式修正,得到的奖励对网络结构的质量更明显(如图6所示)。
  图6:
  提前止损的精度与网络的真实精度相同计算复杂度
  和连接复杂度之间的关系
  实验结果
  本文使用了 32 个 GPU,经过 3 天的搜索,可以在 CIFAR 数据集上找到具有最先进性能的网络结构(如图 7 所示)。
  图七:
  学习的搜索过程和最佳网络结构
  与以往的自动网页搜索方法(如Google NAS算法的数百个GPU和一个月的时间)相比,BlockQNN算法非常高效(如表2和表3所示)。
  
  表二:
  不同的自动网络结构设计算法
  计算资源比较
  表三:
  CIFAR数据集上不同网络结构的错误率
  另一方面,学习到的网络结构也可以很容易地准确地转移到ImageNet任务中(如表4所示)。
  表四:
  图像网数据集上不同网络结构的错误率
  为了验证BlockQNN算法是否
  真正学会了网络的设计方法,将其与同一搜索空间中的暴力搜索进行比较,可以发现本文提出的BlockQNN算法可以获得比暴力搜索更好的模型(如图8所示)。
  图八:
  强化学习和暴力搜索获取网络结构
  CIFAR数据集的准确性通过
  分析整个搜索过程和结果网络结构(如图9所示),作者发现通过学习获得的优秀结构具有一些共性。比如多分支结构、捷径连接法等,这些都是现在常用的设计思路。同时,作者还发现了一些不太常见的结构共性,如卷积层之间的频繁加法运算,学习到的网络结构需要进一步分析和研究。
  图九:
  由 BlockQNN 算法设计的网络结构示例
  结论
  该文提出一种基于强化学习的高效网络结构自动设计算法BlockQNN,通过“Block”的设计思路,大大减少了网络结构搜索空间,使学习网络具有较强的可移植性。同时,本文采用“早停”和分布式架构来加速整个学习过程,达到了之前 Google NAS 算法的百倍速度(仅 32 个 GPU 和 3 天的训练)。实验表明,学习到的网络结构在CIFAR数据集上可以达到人类设计网络结构的精度,其结构可以迁移到大规模ImageNet数据集上,也可以取得良好的性能。笔者希望继续朝着自动化深度学习的目标发展算法,最终将人们从复杂繁琐的网络设计和参数调优中解放出来,进一步实现深度学习的“智能化”。
  解决方案:云优CMS快速入门
  # API 管理 API 管理功能包括百度普通收录、百度快速收录、百度
  
  统计查询、百度
  
  切字接口,同义词API,多站点控制平台对接## 百度普通收录需要在百度搜索资源平台注册账号并绑定推送链接,填写下图所示的接口调用地址![ 1.jpg]()## 百度快收录 百度快收录主要是针对优质网站的快收录工具,如果你暂时没有这个功能权限,建议尽量更新优质文章获取权限 ### 无权限 下图是未经许可的界面![ 图片.png]()### 许可 下图是许可接口![图片.png] ()## 百度统计查询![4.png]()进入百度统计,点击管理-左侧的统计图标进行设置,复制链接填写下图![5.png]()## 百度切词界面教程:[]()## 同义词API 设置同义词前,需要设置百度切词界面,模式建议准确+50%## 多站点控制平台对接 购买增值服务请开启一键登录,百度自动推送、接受平台推送、排名监控获得四大功能 查看全部

  解决方案:网络结构自动设计算法——BlockQNN
  以下是商汤科技在大规模分布式训练领域发表的一篇重磅口头报告(口头)论文,提出了一种基于分布式训练的深度强化学习BlockQNN算法,用于自动设计神经网络结构。本文由商汤科技实习研究员钟昭在商汤研究院副院长严俊杰、研究经理吴伟指导下撰写。
  神经网络结构设计一直是深度学习的核心问题。在基于深度学习的分类、检测、分割和跟踪任务中,基础神经网络的结构对整体算法的性能具有决定性的影响。传统的神经网络结构设计需要大量的专业知识和试错成本,甚至需要一些灵感和“魔笔”,每年只有少数几个影响更大的新网络结构被设计出来,因此手工设计网络结构是极其困难的。网络结构的自动设计/搜索方法近年来受到广泛关注,它试图将人们从复杂繁琐的网络设计参数中解放出来,以实现自动化深度学习的目标(如图1所示)。
  图 1:(从左到右)。
  从人工设计的网络结构到
  网络结构由算法自动设计
  最近的网络结构自动设计/搜索算法通常需要大量的计算资源(例如,谷歌的 NAS 算法需要数百个 GPU 和近一个月的训练时间),并且由此产生的模型移植性不高,难以实现真正的实际使用。本文提出的BlockQNN算法可以解决现有网络结构自动设计/搜索方法的效率和泛化问题。
  基于“块”的网络结构表示
  目前主流的深度神经网络结构极其复杂,其深度往往达到上百层,直接搜索整个网络结构的搜索空间非常大,这也是以往的自动网络结构设计/搜索算法效率相对低下的原因之一。同时,直接设计整个网络的策略将导致网络结构不被通用化。例如,基于CIFAR数据集搜索的网络结构由于其数据输入的大小限制,仅适用于处理32x32分辨率的数据,这使得搜索网络结构的泛化性能较弱。
  针对这些问题,本文借鉴了现代主流深度神经网络的设计思路,如ResNet、Inception等网络。这些网络由相同结构的子网的重复组合形成,本文称之为块。通过设计块结构,可以大大减少网络结构的搜索空间,并且块结构本身具有很强的泛化性,对于不同的数据集或任务,只需要叠加不同数量的块(如图2所示)。
  图2:
  基于区块设计的网络整体框架
  左边是CIFAR的框架,右边是ImageNet的框架。
  表一:
  网络结构编码表
  为了表示网络块结构,本文设计了一套网络结构编码,将神经网络视为有向无环图,每个节点代表网络中的每一层,边缘代表数据流的方向。整个编码包括神经网络的层序号、类型、内核的大小以及两个序号节点的序号。可以使用这种编码来表示任意神经网络结构,例如 ResNet 和 Inception 的块结构,可以使用图 3 中的编码来表示。
  图3:
  Inception 和 Resnet 中的块结构编码表示
  基于强化学习的网络结构自动设计
  下一个核心问题是如何获得最优的网络结构。尽管通过设计大大减少了网络结构的搜索空间,但对所有可能结构的直接暴力搜索仍然是计算密集型的。因此,该文提出一种基于强化学习的网络设计方法,该方法可以自动学习网络结构。在网络设计中的强化学习中,本文将当前神经网络层定义为强化学习中的
  
  当前状态,将下一层结构的决策定义为强化学习中的动作。此处使用先前定义的神经网络结构编码来表示网络的每一层。这样,通过一系列动作决策,可以获得代表块结构的代码(如图4所示),所提出的强化学习算法通过优化找到最优的动作决策序列。本文采用Q学习算法进行学习,具体公式不展开。
  图4:
  基于强化学习的自动化网络结构设计流程
  值得注意的是,与一般的强化学习问题不同,这个任务只有在决定结束整个序列后(即生成完整的网络结构之后)才会得到奖励,之前的每一个决策对应奖励。由于获得最终奖励的成本非常高(需要在数据上重新训练新获得的网络结构),为了加快其收敛速度,笔者采用了奖励 SHAPING 技术(如图 5 所示),这样初始训练阶段终止层的 Q 值不会太高, 这样算法就不会在训练的初始阶段生成层太浅的网络结构。
  图5:
  奖励整形对收敛效率的影响
  尽早停止策略
  尽管可以使用多种技术来使自动化网络结构设计更加高效。然而,自动网络设计耗时的关键在于每个奖励的时间成本非常高,生成的网络结构需要在相应的数据集上进行训练以收敛,然后获得相应的精度来表示结构的质量并用作奖励。本文作者发现,通过调整学习率,只有正常训练过程的三分之一(例如,在CIFAR-100数据集上训练12个epoch)可以获得网络的近似最终精度,可以大大降低时间成本。然而,这种网络结构及其相关奖励的准确性会产生误差,导致无法精细区分网络结构的优缺点,本文提出了一个经验解公式:
  也就是说,真正的奖励与
  提前停止,但它与网络结构的计算复杂度和结构连接的复杂度(边数除以块中的点数)成反比。通过这样的公式修正,得到的奖励对网络结构的质量更明显(如图6所示)。
  图6:
  提前止损的精度与网络的真实精度相同计算复杂度
  和连接复杂度之间的关系
  实验结果
  本文使用了 32 个 GPU,经过 3 天的搜索,可以在 CIFAR 数据集上找到具有最先进性能的网络结构(如图 7 所示)。
  图七:
  学习的搜索过程和最佳网络结构
  与以往的自动网页搜索方法(如Google NAS算法的数百个GPU和一个月的时间)相比,BlockQNN算法非常高效(如表2和表3所示)。
  
  表二:
  不同的自动网络结构设计算法
  计算资源比较
  表三:
  CIFAR数据集上不同网络结构的错误率
  另一方面,学习到的网络结构也可以很容易地准确地转移到ImageNet任务中(如表4所示)。
  表四:
  图像网数据集上不同网络结构的错误率
  为了验证BlockQNN算法是否
  真正学会了网络的设计方法,将其与同一搜索空间中的暴力搜索进行比较,可以发现本文提出的BlockQNN算法可以获得比暴力搜索更好的模型(如图8所示)。
  图八:
  强化学习和暴力搜索获取网络结构
  CIFAR数据集的准确性通过
  分析整个搜索过程和结果网络结构(如图9所示),作者发现通过学习获得的优秀结构具有一些共性。比如多分支结构、捷径连接法等,这些都是现在常用的设计思路。同时,作者还发现了一些不太常见的结构共性,如卷积层之间的频繁加法运算,学习到的网络结构需要进一步分析和研究。
  图九:
  由 BlockQNN 算法设计的网络结构示例
  结论
  该文提出一种基于强化学习的高效网络结构自动设计算法BlockQNN,通过“Block”的设计思路,大大减少了网络结构搜索空间,使学习网络具有较强的可移植性。同时,本文采用“早停”和分布式架构来加速整个学习过程,达到了之前 Google NAS 算法的百倍速度(仅 32 个 GPU 和 3 天的训练)。实验表明,学习到的网络结构在CIFAR数据集上可以达到人类设计网络结构的精度,其结构可以迁移到大规模ImageNet数据集上,也可以取得良好的性能。笔者希望继续朝着自动化深度学习的目标发展算法,最终将人们从复杂繁琐的网络设计和参数调优中解放出来,进一步实现深度学习的“智能化”。
  解决方案:云优CMS快速入门
  # API 管理 API 管理功能包括百度普通收录、百度快速收录、百度
  
  统计查询、百度
  
  切字接口,同义词API,多站点控制平台对接## 百度普通收录需要在百度搜索资源平台注册账号并绑定推送链接,填写下图所示的接口调用地址![ 1.jpg]()## 百度快收录 百度快收录主要是针对优质网站的快收录工具,如果你暂时没有这个功能权限,建议尽量更新优质文章获取权限 ### 无权限 下图是未经许可的界面![ 图片.png]()### 许可 下图是许可接口![图片.png] ()## 百度统计查询![4.png]()进入百度统计,点击管理-左侧的统计图标进行设置,复制链接填写下图![5.png]()## 百度切词界面教程:[]()## 同义词API 设置同义词前,需要设置百度切词界面,模式建议准确+50%## 多站点控制平台对接 购买增值服务请开启一键登录,百度自动推送、接受平台推送、排名监控获得四大功能

汇总:算法自动采集列表栏和搜索框点击事件的判断搜索匹配策略

采集交流优采云 发表了文章 • 0 个评论 • 56 次浏览 • 2022-11-18 12:26 • 来自相关话题

  汇总:算法自动采集列表栏和搜索框点击事件的判断搜索匹配策略
  算法自动采集列表栏和搜索框点击事件的判断搜索匹配策略框点击事件的定义
  实现有很多种思路,需要根据实际需求去选择,还有一些很麻烦的技术,比如利用静态变量上的直接取值更新style等。另外建议你学学模板,
  伪代码可以用html5或者javascript语言,一个基本的tag-form表单提交接口处理,之后自己做个防止点击事件的缓存机制,比如设置浏览器缓存时间或者有个数字,
  
  考研er应该学过堆栈吧,想要实现很简单,思路非常清晰,就不多说了。就是在css里面隐藏掉验证码。大致意思就是先生成验证码,然后再隐藏,反正验证码是加密过的。可以试试看。
  明显你不是很熟悉html5和javascript
  先学点javascript再说
  
  用php实现cookie自动登录的功能
  php,看了一眼源码,
  我也不知道你是来找鼓励,还是怎么样。首先就是在页面上留一个self_uri,告诉浏览器如何点击。其次按照类型实现,字符串实现很简单。再次就是实现加密认证校验,这个麻烦一点。再就是触发。这个特别让人头疼。推荐用websocket实现一下吧。
  javascript+css,你需要会jqueryhtml5等技术,如果你是有服务器的话就直接放到服务器上,不然有成本不划算。 查看全部

  汇总:算法自动采集列表栏和搜索框点击事件的判断搜索匹配策略
  算法自动采集列表栏和搜索框点击事件的判断搜索匹配策略框点击事件的定义
  实现有很多种思路,需要根据实际需求去选择,还有一些很麻烦的技术,比如利用静态变量上的直接取值更新style等。另外建议你学学模板,
  伪代码可以用html5或者javascript语言,一个基本的tag-form表单提交接口处理,之后自己做个防止点击事件的缓存机制,比如设置浏览器缓存时间或者有个数字,
  
  考研er应该学过堆栈吧,想要实现很简单,思路非常清晰,就不多说了。就是在css里面隐藏掉验证码。大致意思就是先生成验证码,然后再隐藏,反正验证码是加密过的。可以试试看。
  明显你不是很熟悉html5和javascript
  先学点javascript再说
  
  用php实现cookie自动登录的功能
  php,看了一眼源码,
  我也不知道你是来找鼓励,还是怎么样。首先就是在页面上留一个self_uri,告诉浏览器如何点击。其次按照类型实现,字符串实现很简单。再次就是实现加密认证校验,这个麻烦一点。再就是触发。这个特别让人头疼。推荐用websocket实现一下吧。
  javascript+css,你需要会jqueryhtml5等技术,如果你是有服务器的话就直接放到服务器上,不然有成本不划算。

核心方法:机器学习实战之KNN算法

采集交流优采云 发表了文章 • 0 个评论 • 43 次浏览 • 2022-11-18 09:15 • 来自相关话题

  核心方法:机器学习实战之KNN算法
  本系列教程是《实用机器学习》的阅读笔记。首先说一下写这个系列教程的原因:首先,《机器学习实战》的代码是用Python2写的,有些代码在Python3上运行会报错。本教程基于Python3修改代码;second: 看了一些机器学习的书没有记录下来,很快就忘记了。写教程也是一个复习的过程;第三,机器学习比爬虫和数据分析更难学。希望通过这一系列的教程,让读者在学习机器学习的道路上少走弯路。
  本系列教程特色:哪些读者可以吃饱:k近邻算法(KNN)原理
  KNN算法是一种分类算法。古语这样描述KNN算法:“近朱者红,近墨者黑”。
  算法原理:计算测试样本与每个训练样本的距离(距离计算方法见下文),取距离最小的前k个训练样本,最后选取这k个样本中出现次数最多的类别作为类别的测试样本。
  如图,绿色的就是测试样例。当k为3时,样本属于红色类;当k为5时,属于蓝色类。因此,k值的选择极大地影响了算法的结果,通常k值不大于20。
  KNN算法原理
  介绍完原理,再看看KNN算法的伪代码流程:
  计算测试样本与所有训练样本的距离
对距离进行升序排序,取前k个
计算k个样本中最多的分类
  KNN的约会对象分类问题描述及数据情况
  Helen 使用 Dating网站 查找约会对象。随着时间的推移,她发现自己约会过三种类型的人:
  这里 Helen 采集了 1000 行具有三个特征的数据:每年赚取的飞行常客里程数;玩视频游戏的时间百分比;每周消耗的冰淇淋升数。以及对象的类型标签,如图所示。
  数据情况
  分析数据
  import numpy as np
import operator
def file2matrix(filename):
fr = open(filename)
arrayOLines = fr.readlines()
numberOflines = len(arrayOLines)
returnMat = np.zeros((numberOflines, 3))
classLabelVector = []
index = 0
for line in arrayOLines:
line = line.strip()
listFromLine = line.split('\t')
returnMat[index, :] = listFromLine[0:3]
classLabelVector.append(int(listFromLine[-1]))
index = index + 1
return returnMat, classLabelVector
  定义解析数据的函数: 第4-9行:读取文件,获取文件行数,创建一个以文件行数(1000行)3列全0的Numpy数组,创建用于存储类标签的 classLabelVector 列表。
  第 10-17 行:循环遍历文件,将前三列数据存储在 returnMat 数组中,并将最后一列存储在 classLabelVector 列表中。结果如图所示。
  分析数据
  上面的代码是书上写的。其实用pandas读取数据然后出来是很方便的。代码如下:
  import numpy as np
<p>
import operator
import pandas as pd
def file2matrix(filename):
data = pd.read_table(open(filename), sep='\t', header=None)
returnMat = data[[0,1,2]].values
classLabelVector = data[3].values
return returnMat, classLabelVector
</p>
  归一化
  由于特征的取值差异较大,在计算距离时,取值较大的属性对结果的影响较大。这里,数据需要归一化:new = (old-min)/(max-min)。代码如下:
  def autoNorm(dataSet):
minval = dataSet.min(0)
maxval = dataSet.max(0)
ranges = maxval - minval
normDataSet = np.zeros(np.shape(dataSet))
m = dataSet.shape[0]
normDataSet = dataSet - np.tile(minval, (m,1))
normDataSet = normDataSet/np.tile(ranges, (m,1))
return normDataSet, ranges, minval
  传入的参数为测试数据(即returnMat);先按0轴(即按列)计算min和max,如图所示进行简单示例;然后构造一个与数据(normDataSet)大小相同的0矩阵;
  瓦片功能的使用方法请读者自行百度。下面是使用后的案例。作用是让一维数组重复m行,如图所示,这样就可以进行数据归一化的计算。
  例子
  例子
  结果
  KNN算法
  这里使用的距离是欧氏距离,公式为:
  欧氏距离
  def classify(inX, dataSet, labels, k):
dataSize = dataSet.shape[0]
diffMat = np.tile(inX, (dataSize,1)) -dataSet
sqdiffMat = diffMat ** 2
sqDistance = sqdiffMat.sum(axis = 1)
distances = sqDistance ** 0.5
sortedDist = distances.argsort()
classCount ={}
for i in range(k):
voteIlable = labels[sortedDist[i]]
<p>
classCount[voteIlable] = classCount.get(voteIlable, 0) + 1
sortedClassCount = sorted(classCount.items(),
key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]
</p>
  inX 是训练数据;dataSet为测试数据,labels为类别标签;k 是值;
  第 2-6 行:计算欧式距离
  7-Finally:对计算出的距离进行索引排序(argsort),然后对字典进行排序,得到值最多的分类。
  测试分类器
  这里选取前10%的数据作为测试样本来测试分类器。
  def test():
r = 0.1
X, y = file2matrix('数据/datingTestSet2.txt')
new_X, ranges, minval = autoNorm(X)
m = new_X.shape[0]
numTestVecs = int(m*r)
error = 0.0
for i in range(numTestVecs):
result = classify(new_X[i, :],new_X[numTestVecs:m, :], y[numTestVecs:m], 3)
print('分类结果: %d, 真实数据: %d' %(result, y[i]))
if (result != y[i]):
error = error + 1.0
print('错误率: %f' % (error/float(numTestVecs)))
  结果
  测试系统
  最后写一个简单的测试系统,代码可以通过人为输入三个属性特征自动得到交友对象的分类标签。
  def system():
style = ['不喜欢', '一般', '喜欢']
ffmile = float(input('飞行里程'))
game = float(input('游戏'))
ice = float(input('冰淇淋'))
X, y = file2matrix('数据/datingTestSet2.txt')
new_X, ranges, minval = autoNorm(X)
inArr = np.array([ffmile, game, ice])
result = classify((inArr - minval)/ranges, new_X, y, 3)
print('这个人', style[result - 1])
  结果
  算法优缺点写在最后
  乍一看,读者可能会觉得不舒服,多敲几下代码就可以了。欢迎大家点赞评论,也可以微博和我互动(我是罗罗盘)。
  干货教程:首页 > seo教程>> seo优化培训教程之伪原创技巧方法
  
  1、要改写的文章必须收录你要优化的关键词。不要完全模仿原文的标题,这样搜索引擎会重点将其与原文进行比较,这样你的文章风险系数就非常高了。当然,如果能在标题中加入营销元素就完美了,这样更容易吸引客户点击。2、现在不要以为一个文章的段落随便打乱就可以了。现在的搜索引擎很聪明,所以这里我建议最好把同一个话题的多个文章拼凑起来。拥有 文章。在这个过程中,一定要用自己的语言进行过渡,让文章读起来流畅自然,同时删除原文中多余或不相关的内容。3.注意关键词的密度和布局控制。这里笔者多年的经验建议,最好着重写开头和结尾,最好在开头和结尾收录要优化的关键词。4.在文本中的某些节点添加自己的内容,比如添加自己的网站相关的文章标题,然后用锚文本指向他们,添加自己的网站名字, each在段后加一些额外的句子等 seo伪原创的内容怎么写 1.为了避免原文作者起诉你侵犯版权,建议你在文末加上相关参考文章,因为无论您如何伪原创,中心思想是不能变的。2、对于一些文章,比如一些技术性的文章,确实很难改。这时候可以在文章中插入自己的理解和观点,并注明自己的索引来源,这也算伪原创,但不算抄袭,搜索引擎是也比较放松警惕!!3、伪原创,思路的出发点是让搜索引擎认为我们的文章属于原创,所以首先要保证你的网站 和原来的网站的主题、结构甚至思想都有很大的不同,比如一个文章 可以在文章中插入自己的理解和观点,并注明自己的索引来源,这也算伪原创,但不算抄袭,搜索引擎也比较放松警惕!!3、伪原创,思路的出发点是让搜索引擎认为我们的文章属于原创,所以首先要保证你的网站 和原来的网站的主题、结构甚至思想都有很大的不同,比如一个文章 可以在文章中插入自己的理解和观点,并注明自己的索引来源,这也算伪原创,但不算抄袭,搜索引擎也比较放松警惕!!3、伪原创,思路的出发点是让搜索引擎认为我们的文章属于原创,所以首先要保证你的网站 和原来的网站的主题、结构甚至思想都有很大的不同,比如一个文章
   查看全部

  核心方法:机器学习实战之KNN算法
  本系列教程是《实用机器学习》的阅读笔记。首先说一下写这个系列教程的原因:首先,《机器学习实战》的代码是用Python2写的,有些代码在Python3上运行会报错。本教程基于Python3修改代码;second: 看了一些机器学习的书没有记录下来,很快就忘记了。写教程也是一个复习的过程;第三,机器学习比爬虫和数据分析更难学。希望通过这一系列的教程,让读者在学习机器学习的道路上少走弯路。
  本系列教程特色:哪些读者可以吃饱:k近邻算法(KNN)原理
  KNN算法是一种分类算法。古语这样描述KNN算法:“近朱者红,近墨者黑”。
  算法原理:计算测试样本与每个训练样本的距离(距离计算方法见下文),取距离最小的前k个训练样本,最后选取这k个样本中出现次数最多的类别作为类别的测试样本。
  如图,绿色的就是测试样例。当k为3时,样本属于红色类;当k为5时,属于蓝色类。因此,k值的选择极大地影响了算法的结果,通常k值不大于20。
  KNN算法原理
  介绍完原理,再看看KNN算法的伪代码流程:
  计算测试样本与所有训练样本的距离
对距离进行升序排序,取前k个
计算k个样本中最多的分类
  KNN的约会对象分类问题描述及数据情况
  Helen 使用 Dating网站 查找约会对象。随着时间的推移,她发现自己约会过三种类型的人:
  这里 Helen 采集了 1000 行具有三个特征的数据:每年赚取的飞行常客里程数;玩视频游戏的时间百分比;每周消耗的冰淇淋升数。以及对象的类型标签,如图所示。
  数据情况
  分析数据
  import numpy as np
import operator
def file2matrix(filename):
fr = open(filename)
arrayOLines = fr.readlines()
numberOflines = len(arrayOLines)
returnMat = np.zeros((numberOflines, 3))
classLabelVector = []
index = 0
for line in arrayOLines:
line = line.strip()
listFromLine = line.split('\t')
returnMat[index, :] = listFromLine[0:3]
classLabelVector.append(int(listFromLine[-1]))
index = index + 1
return returnMat, classLabelVector
  定义解析数据的函数: 第4-9行:读取文件,获取文件行数,创建一个以文件行数(1000行)3列全0的Numpy数组,创建用于存储类标签的 classLabelVector 列表。
  第 10-17 行:循环遍历文件,将前三列数据存储在 returnMat 数组中,并将最后一列存储在 classLabelVector 列表中。结果如图所示。
  分析数据
  上面的代码是书上写的。其实用pandas读取数据然后出来是很方便的。代码如下:
  import numpy as np
<p>
import operator
import pandas as pd
def file2matrix(filename):
data = pd.read_table(open(filename), sep='\t', header=None)
returnMat = data[[0,1,2]].values
classLabelVector = data[3].values
return returnMat, classLabelVector
</p>
  归一化
  由于特征的取值差异较大,在计算距离时,取值较大的属性对结果的影响较大。这里,数据需要归一化:new = (old-min)/(max-min)。代码如下:
  def autoNorm(dataSet):
minval = dataSet.min(0)
maxval = dataSet.max(0)
ranges = maxval - minval
normDataSet = np.zeros(np.shape(dataSet))
m = dataSet.shape[0]
normDataSet = dataSet - np.tile(minval, (m,1))
normDataSet = normDataSet/np.tile(ranges, (m,1))
return normDataSet, ranges, minval
  传入的参数为测试数据(即returnMat);先按0轴(即按列)计算min和max,如图所示进行简单示例;然后构造一个与数据(normDataSet)大小相同的0矩阵;
  瓦片功能的使用方法请读者自行百度。下面是使用后的案例。作用是让一维数组重复m行,如图所示,这样就可以进行数据归一化的计算。
  例子
  例子
  结果
  KNN算法
  这里使用的距离是欧氏距离,公式为:
  欧氏距离
  def classify(inX, dataSet, labels, k):
dataSize = dataSet.shape[0]
diffMat = np.tile(inX, (dataSize,1)) -dataSet
sqdiffMat = diffMat ** 2
sqDistance = sqdiffMat.sum(axis = 1)
distances = sqDistance ** 0.5
sortedDist = distances.argsort()
classCount ={}
for i in range(k):
voteIlable = labels[sortedDist[i]]
<p>
classCount[voteIlable] = classCount.get(voteIlable, 0) + 1
sortedClassCount = sorted(classCount.items(),
key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]
</p>
  inX 是训练数据;dataSet为测试数据,labels为类别标签;k 是值;
  第 2-6 行:计算欧式距离
  7-Finally:对计算出的距离进行索引排序(argsort),然后对字典进行排序,得到值最多的分类。
  测试分类器
  这里选取前10%的数据作为测试样本来测试分类器。
  def test():
r = 0.1
X, y = file2matrix('数据/datingTestSet2.txt')
new_X, ranges, minval = autoNorm(X)
m = new_X.shape[0]
numTestVecs = int(m*r)
error = 0.0
for i in range(numTestVecs):
result = classify(new_X[i, :],new_X[numTestVecs:m, :], y[numTestVecs:m], 3)
print('分类结果: %d, 真实数据: %d' %(result, y[i]))
if (result != y[i]):
error = error + 1.0
print('错误率: %f' % (error/float(numTestVecs)))
  结果
  测试系统
  最后写一个简单的测试系统,代码可以通过人为输入三个属性特征自动得到交友对象的分类标签。
  def system():
style = ['不喜欢', '一般', '喜欢']
ffmile = float(input('飞行里程'))
game = float(input('游戏'))
ice = float(input('冰淇淋'))
X, y = file2matrix('数据/datingTestSet2.txt')
new_X, ranges, minval = autoNorm(X)
inArr = np.array([ffmile, game, ice])
result = classify((inArr - minval)/ranges, new_X, y, 3)
print('这个人', style[result - 1])
  结果
  算法优缺点写在最后
  乍一看,读者可能会觉得不舒服,多敲几下代码就可以了。欢迎大家点赞评论,也可以微博和我互动(我是罗罗盘)。
  干货教程:首页 > seo教程>> seo优化培训教程之伪原创技巧方法
  
  1、要改写的文章必须收录你要优化的关键词。不要完全模仿原文的标题,这样搜索引擎会重点将其与原文进行比较,这样你的文章风险系数就非常高了。当然,如果能在标题中加入营销元素就完美了,这样更容易吸引客户点击。2、现在不要以为一个文章的段落随便打乱就可以了。现在的搜索引擎很聪明,所以这里我建议最好把同一个话题的多个文章拼凑起来。拥有 文章。在这个过程中,一定要用自己的语言进行过渡,让文章读起来流畅自然,同时删除原文中多余或不相关的内容。3.注意关键词的密度和布局控制。这里笔者多年的经验建议,最好着重写开头和结尾,最好在开头和结尾收录要优化的关键词。4.在文本中的某些节点添加自己的内容,比如添加自己的网站相关的文章标题,然后用锚文本指向他们,添加自己的网站名字, each在段后加一些额外的句子等 seo伪原创的内容怎么写 1.为了避免原文作者起诉你侵犯版权,建议你在文末加上相关参考文章,因为无论您如何伪原创,中心思想是不能变的。2、对于一些文章,比如一些技术性的文章,确实很难改。这时候可以在文章中插入自己的理解和观点,并注明自己的索引来源,这也算伪原创,但不算抄袭,搜索引擎是也比较放松警惕!!3、伪原创,思路的出发点是让搜索引擎认为我们的文章属于原创,所以首先要保证你的网站 和原来的网站的主题、结构甚至思想都有很大的不同,比如一个文章 可以在文章中插入自己的理解和观点,并注明自己的索引来源,这也算伪原创,但不算抄袭,搜索引擎也比较放松警惕!!3、伪原创,思路的出发点是让搜索引擎认为我们的文章属于原创,所以首先要保证你的网站 和原来的网站的主题、结构甚至思想都有很大的不同,比如一个文章 可以在文章中插入自己的理解和观点,并注明自己的索引来源,这也算伪原创,但不算抄袭,搜索引擎也比较放松警惕!!3、伪原创,思路的出发点是让搜索引擎认为我们的文章属于原创,所以首先要保证你的网站 和原来的网站的主题、结构甚至思想都有很大的不同,比如一个文章
  

最新版:算法自动采集列表页列表列表二维码不用自己上传图片

采集交流优采云 发表了文章 • 0 个评论 • 67 次浏览 • 2022-11-17 05:14 • 来自相关话题

  最新版:算法自动采集列表页列表列表二维码不用自己上传图片
  算法自动采集列表页面。一键采集页面列表列表页列表列表二维码不用自己制作。不用自己上传图片。不用自己制作js页面不用爬虫抓取全部第三方文章和文章评论等内容还有第三方的技术维护、第三方的技术服务。优势太多,就不说了。大概就是你只要在做的哪一天突然觉得想要做了,然后依葫芦画瓢,总能搞定。弊端就是经过第三方爬虫抓取的内容基本上都很垃圾。
  
  做这个的成本很高,三方做太容易了。原因很简单,三方爬虫爬取内容的效率高,无论数据新不新,无论是不是总人数的n倍增长,采集效率都很高。而且采集自己,就像我说的,一键采集。每抓取一个页面,爬虫都要换人,更换人也是一个成本,每抓取一个页面,爬虫都要换人,成本更高。一般的架构,像excelexcelexcel就行了。
  
  重点是,爬虫抓取页面列表,还要从列表页面爬取最新内容,这个一般要自己写。因为列表页面是新的。不要的不抓,那你要抓取的是总页面数的n倍的数据。举个例子,当年写爬虫爬取来的淘宝的数据1月9号的时候,收费10元,解释权归淘宝,需要的可以联系我。
  1.目前大部分的新闻网站都是无法支持个性化抓取的(至少我没找到方案),更别说各种二手交易平台了。我所知道的的国内能同时支持个性化爬取(也叫定制化抓取)的暂时还没有,特定的信息网站似乎都只支持抓取文章的标题,同时需要爬取的内容必须也必须带有文章标题,这个要看具体情况而定。2.刚才刚刚去了一趟报刊亭,其中的“数字报刊”分为机械制图报刊与电子版报刊,根据我个人的经验,电子版报刊的机器学习技术都应该是烂熟于胸了吧,放在那里看也没什么用,就算别人能够爬取的数据被你拿去做数据分析,那你这信息又干嘛去了?你说某个高校在那里的排名,那你可以通过排名来爬取学校的信息啊,你说什么时候毕业的,那你拿着学校的文件来,一搜就行,反正只要不是搜索top2这种大学就够了,拿来分析专业评级差异也是够的。这种分析对于新闻信息来说是没什么用的,所以此类大学排名可以忽略。 查看全部

  最新版:算法自动采集列表页列表列表二维码不用自己上传图片
  算法自动采集列表页面。一键采集页面列表列表页列表列表二维码不用自己制作。不用自己上传图片。不用自己制作js页面不用爬虫抓取全部第三方文章和文章评论等内容还有第三方的技术维护、第三方的技术服务。优势太多,就不说了。大概就是你只要在做的哪一天突然觉得想要做了,然后依葫芦画瓢,总能搞定。弊端就是经过第三方爬虫抓取的内容基本上都很垃圾。
  
  做这个的成本很高,三方做太容易了。原因很简单,三方爬虫爬取内容的效率高,无论数据新不新,无论是不是总人数的n倍增长,采集效率都很高。而且采集自己,就像我说的,一键采集。每抓取一个页面,爬虫都要换人,更换人也是一个成本,每抓取一个页面,爬虫都要换人,成本更高。一般的架构,像excelexcelexcel就行了。
  
  重点是,爬虫抓取页面列表,还要从列表页面爬取最新内容,这个一般要自己写。因为列表页面是新的。不要的不抓,那你要抓取的是总页面数的n倍的数据。举个例子,当年写爬虫爬取来的淘宝的数据1月9号的时候,收费10元,解释权归淘宝,需要的可以联系我。
  1.目前大部分的新闻网站都是无法支持个性化抓取的(至少我没找到方案),更别说各种二手交易平台了。我所知道的的国内能同时支持个性化爬取(也叫定制化抓取)的暂时还没有,特定的信息网站似乎都只支持抓取文章的标题,同时需要爬取的内容必须也必须带有文章标题,这个要看具体情况而定。2.刚才刚刚去了一趟报刊亭,其中的“数字报刊”分为机械制图报刊与电子版报刊,根据我个人的经验,电子版报刊的机器学习技术都应该是烂熟于胸了吧,放在那里看也没什么用,就算别人能够爬取的数据被你拿去做数据分析,那你这信息又干嘛去了?你说某个高校在那里的排名,那你可以通过排名来爬取学校的信息啊,你说什么时候毕业的,那你拿着学校的文件来,一搜就行,反正只要不是搜索top2这种大学就够了,拿来分析专业评级差异也是够的。这种分析对于新闻信息来说是没什么用的,所以此类大学排名可以忽略。

即将发布:2017年百度更新算法大盘点(一)

采集交流优采云 发表了文章 • 0 个评论 • 33 次浏览 • 2022-11-15 16:32 • 来自相关话题

  即将发布:2017年百度更新算法大盘点(一)
  近期,百度推出了一系列算法,旨在优化网站体验,更好地服务用户和互联网用户的搜索。今天小燕就把这些算法整理一下,方便以后在seo工作中更好的发挥作用。
  1.飓风算法
  2017年7月4日,百度更新上线飓风算法,严厉打击不良采集。有多少网站受到影响和打击,站长们已经炸了,赶紧来看看吧!
  飓风算法公告全文:
  百度搜索近日推出飓风算法,旨在严厉打击以不良内容来源采集为主要内容的网站。原创内容提供更多的展示机会,促进搜索生态的良性发展。
  飓风算法会例行输出惩罚数据,并会根据情况随时调整迭代次数,体现了百度搜索对不良采集的零容忍。优质原创站点如果发现站点的索引量明显下降,访问量明显下降,可以在反馈中心进行反馈。
  一言以蔽之,百度将开始重点打击采集如网站,并将长期不惜一切代价继续打击。对恶意采集网站百度一向持零容忍态度。
  2.清风算法
  
  2017年9月14日,百度更新上线清风算法,专门惩治网页标题作弊行为。说明标题内容是假的,或者标题中故意堆砌了关键词。做SEO的朋友一定要按照规则填写正确的内容。页面的标题。
  以下为青峰算法全文
  1、标题内容虚假,即标题所表达的内容与网页内容不符,具有欺骗用户之嫌。
  1.1 如遇假官网,将非官方网站描述为官网。
  1.2 标题说明中有TXT下载,但页面不提供下载服务。
  1.3 标题描述为小说下载,但下载的是APP。
  1.4 标题中写着有百度云下载支持在线查看,但是页面无法下载也无法在线查看。
  1.5 标题中部分描述不实。例如,网页标题表示有江苏依依大学排名,但该页面只有大学列表,没有与排名相关的内容。
  2. 故意堆砌标题是指多次重复和过度堆砌标题关键词。
  
  2.1 大量重复标题 关键词
  2.2 标题中堆积了大量标签
  3.优质标题写作建议
  3.1. 标题的书写不能有错别字。
  3.2. 题目意思清楚明了,没有错句和表达不清的地方。
  3.3. 标题应书写工整,无乱码、分句和截断,无关键词堆积。
  3.4. 标题不建议太长。页面标题可以概括为“核心词+适当修饰语”的格式。核心词就是核心内容,修饰语要放在核心词之后。不应出现冗余表达式。
  3.5. 标题围绕页面的主要内容编写,与页面的内容相关,能够突出页面的核心内容。
  3.6. 标题建议使用用户熟悉的语言描述(不建议使用繁体中文和混合多种语言)。如果网站既有中英文网站名字,尽量使用用户熟悉的作为标题描述。
  在官方文档中,分类页标题、首页标题、列表频道页标题、聚合页标题、内容页标题都有对应的示例需求。这些只是希望站长朋友们能够从用户体验的角度出发,不要只是借标题来吸引用户点击。只有把网站细节的每一步都真正做好,没有欺骗和堆砌,这样的标题才是合理的。
  大盘点:网络营销必备6大工具盘点(一)
  您的关注是对我们最大的肯定。每天都会有一篇文章原创文章与大家分享华锐视觉十年创业经历的运营、程序技术、各种坑的感悟。希望能帮助更多的创业者快速成长,绕过一些坑。
  现在,网络营销越来越难做,很多网络推广者没有自己的一套营销工具。今天小编就来介绍一些小编比较好用的工具站点,希望对大家有所帮助。
  1. SEO查询工具
  SEO工具是网络营销中常用的工具。常用的工具有: 1. 站长工具: . 2. 爱站:
  
  我们可以使用这个工具来查看网站关键词的密度、收录状态、外部链接/好友链接、权重、网站死亡链接、关键词排名, 和更多。另请参阅 网站结构、速度、优化等。
  2. 统计工具
  现在市面上的统计工具很多,常用平台有:51La()、百度统计()、CNZZ()等。这三个小编都用过,但是百度统计是最有用的一个,一是因为他的分析数据比较多,二是因为他的数据比较稳定准确。
  3. 网站管理工具
  
  1、百度站长平台:这个平台应该是大部分站长都会用到的,可以用这个平台提交网站数据。
  2. 360搜索站长平台:这个平台虽然功能不多,但是对于那些专注于360搜索引擎优化的运营商来说也很有用网站。一个常用的功能是“站点地图提交”。
  3、搜狗站长平台:这个平台和上面两个平台的功能差不多,你也可以在里面提交一些网站的数据。
  今天给大家分享三种工具,明天继续为大家分享剩下的网站营销工具,敬请期待。 查看全部

  即将发布:2017年百度更新算法大盘点(一)
  近期,百度推出了一系列算法,旨在优化网站体验,更好地服务用户和互联网用户的搜索。今天小燕就把这些算法整理一下,方便以后在seo工作中更好的发挥作用。
  1.飓风算法
  2017年7月4日,百度更新上线飓风算法,严厉打击不良采集。有多少网站受到影响和打击,站长们已经炸了,赶紧来看看吧!
  飓风算法公告全文:
  百度搜索近日推出飓风算法,旨在严厉打击以不良内容来源采集为主要内容的网站。原创内容提供更多的展示机会,促进搜索生态的良性发展。
  飓风算法会例行输出惩罚数据,并会根据情况随时调整迭代次数,体现了百度搜索对不良采集的零容忍。优质原创站点如果发现站点的索引量明显下降,访问量明显下降,可以在反馈中心进行反馈。
  一言以蔽之,百度将开始重点打击采集如网站,并将长期不惜一切代价继续打击。对恶意采集网站百度一向持零容忍态度。
  2.清风算法
  
  2017年9月14日,百度更新上线清风算法,专门惩治网页标题作弊行为。说明标题内容是假的,或者标题中故意堆砌了关键词。做SEO的朋友一定要按照规则填写正确的内容。页面的标题。
  以下为青峰算法全文
  1、标题内容虚假,即标题所表达的内容与网页内容不符,具有欺骗用户之嫌。
  1.1 如遇假官网,将非官方网站描述为官网。
  1.2 标题说明中有TXT下载,但页面不提供下载服务。
  1.3 标题描述为小说下载,但下载的是APP。
  1.4 标题中写着有百度云下载支持在线查看,但是页面无法下载也无法在线查看。
  1.5 标题中部分描述不实。例如,网页标题表示有江苏依依大学排名,但该页面只有大学列表,没有与排名相关的内容。
  2. 故意堆砌标题是指多次重复和过度堆砌标题关键词。
  
  2.1 大量重复标题 关键词
  2.2 标题中堆积了大量标签
  3.优质标题写作建议
  3.1. 标题的书写不能有错别字。
  3.2. 题目意思清楚明了,没有错句和表达不清的地方。
  3.3. 标题应书写工整,无乱码、分句和截断,无关键词堆积。
  3.4. 标题不建议太长。页面标题可以概括为“核心词+适当修饰语”的格式。核心词就是核心内容,修饰语要放在核心词之后。不应出现冗余表达式。
  3.5. 标题围绕页面的主要内容编写,与页面的内容相关,能够突出页面的核心内容。
  3.6. 标题建议使用用户熟悉的语言描述(不建议使用繁体中文和混合多种语言)。如果网站既有中英文网站名字,尽量使用用户熟悉的作为标题描述。
  在官方文档中,分类页标题、首页标题、列表频道页标题、聚合页标题、内容页标题都有对应的示例需求。这些只是希望站长朋友们能够从用户体验的角度出发,不要只是借标题来吸引用户点击。只有把网站细节的每一步都真正做好,没有欺骗和堆砌,这样的标题才是合理的。
  大盘点:网络营销必备6大工具盘点(一)
  您的关注是对我们最大的肯定。每天都会有一篇文章原创文章与大家分享华锐视觉十年创业经历的运营、程序技术、各种坑的感悟。希望能帮助更多的创业者快速成长,绕过一些坑。
  现在,网络营销越来越难做,很多网络推广者没有自己的一套营销工具。今天小编就来介绍一些小编比较好用的工具站点,希望对大家有所帮助。
  1. SEO查询工具
  SEO工具是网络营销中常用的工具。常用的工具有: 1. 站长工具: . 2. 爱站:
  
  我们可以使用这个工具来查看网站关键词的密度、收录状态、外部链接/好友链接、权重、网站死亡链接、关键词排名, 和更多。另请参阅 网站结构、速度、优化等。
  2. 统计工具
  现在市面上的统计工具很多,常用平台有:51La()、百度统计()、CNZZ()等。这三个小编都用过,但是百度统计是最有用的一个,一是因为他的分析数据比较多,二是因为他的数据比较稳定准确。
  3. 网站管理工具
  
  1、百度站长平台:这个平台应该是大部分站长都会用到的,可以用这个平台提交网站数据。
  2. 360搜索站长平台:这个平台虽然功能不多,但是对于那些专注于360搜索引擎优化的运营商来说也很有用网站。一个常用的功能是“站点地图提交”。
  3、搜狗站长平台:这个平台和上面两个平台的功能差不多,你也可以在里面提交一些网站的数据。
  今天给大家分享三种工具,明天继续为大家分享剩下的网站营销工具,敬请期待。

终极:神策杯 2018高校算法大师赛(个人、top2、top6)方案总结

采集交流优采云 发表了文章 • 0 个评论 • 45 次浏览 • 2022-11-15 16:29 • 来自相关话题

  终极:神策杯 2018高校算法大师赛(个人、top2、top6)方案总结
  神策数据推荐系统是基于神策分析平台的智能推荐系统。根据客户需求和业务特点,基于神策分析采集的用户行为数据,利用机器学习算法对咨询、视频、产品等进行个性化推荐,为客户提供智能化应用不同场景,比如优化产品体验,提升点击率等核心业务指标。
  传感器推荐系统是一个完整的学习闭环。采集的基础数据是通过机器学习的算法模型来应用的。实时验证效果,引导数据源的添加,算法优化反馈形成全流程、实时、自动、快速迭代的推荐闭环。
  本次比赛模拟业务场景,目的是提取新闻文本的核心词,最终结果达到提升推荐和用户画像的效果。
  比赛链接:
  Dataset数据地址:
  密码:qa2u
  02任务
  个性化推荐系统是神策智能系统的一个重要方面。准确理解信息的主题是提高推荐系统效果的重要手段。基于真实的商业案例,神策数据提供了数千篇文章 文章 及其 关键词。参赛者需要训练一个“关键词抽取”模型来抽取10万条新闻文章的关键词。
  03数据
  备注:报名参赛或加入战队后,即可获得数据下载权限。
  提供下载的数据集包括两部分:1.all_docs.txt,108295条信息文章数据,数据格式为:ID文章title文章text,以\001分隔在中间。2. train_docs_keywords.txt,1000篇文章文章的关键词标注结果,数据格式为:ID关键词列表,中间用\t分隔。
  注意:标记数据中每个文章的关键词不超过5个。关键词 都出现在 文章 的标题或正文中。需要注意的是“the set of 关键词 of the training set 文章”和“the set of 关键词 of the test set 文章”,这两个集合可能会重叠,但收录与收录之间并不一定存在关系。
  04个人预赛第十一名方案
  基于NLP中的无监督学习方法提取关键词,这也是我第一次参加比赛。当时刚接触NLP,所以对这次比赛印象很深,在此分享给大家
  神策杯“2018年高校算法大师赛B组排名(13/583)
  4.1 计分
  4.2 数据分析:
  4.3 提高技能
  
  词性标注
  这就是tf-idf抽取关键词错误较大的原因
  4.5 核心代码:
  # -*- coding: utf-8 -*-<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /># @Author  : quincyqiang<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /># @File    : analysis_for_06.py<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /># @Time    : 2018/9/5 14:17<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />import pickle<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />import pandas as pd<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />from tqdm import tqdm<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />from jieba.analyse import extract_tags,textrank # tf-idf<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />from jieba import posseg<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />import random<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />import jieba<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />jieba.analyse.set_stop_words('data/stop_words.txt') # 去除停用词<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />jieba.load_userdict('data/custom_dict.txt') # 设置词库<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />'''<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />  nr 人名 nz 其他专名 ns 地名 nt 机构团体 n 名词 l 习用语 i 成语 a 形容词 <br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />  nrt <br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />  v 动词 t 时间词<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />'''<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />test_data=pd.read_csv('data/test_docs.csv')<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />train_data=pd.read_csv('data/new_train_docs.csv')<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />allow_pos={'nr':1,'nz':2,'ns':3,'nt':4,'eng':5,'n':6,'l':7,'i':8,'a':9,'nrt':10,'v':11,'t':12}<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /># allow_pos={'nr':1,'nz':2,'ns':3,'nt':4,'eng':5,'nrt':10}<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />tf_pos = ['ns', 'n', 'vn', 'nr', 'nt', 'eng', 'nrt','v','a']<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />def generate_name(word_tags):<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    name_pos = ['ns', 'n', 'vn', 'nr', 'nt', 'eng', 'nrt']<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    for word_tag in word_tags:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />        if word_tag[0] == '·' or word_tag=='!':<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            index = word_tags.index(word_tag)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            if (index+1) 1]<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />        title_keywords = sorted(title_keywords, reverse=False, key=lambda x: (allow_pos[x[1]], -len(x[0])))<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />        if '·' in title :<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            if len(title_keywords) >= 2:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                key_1 = title_keywords[0][0]<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                key_2 = title_keywords[1][0]<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            else:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                # print(keywords,title,word_tags)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                key_1 = title_keywords[0][0]<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                key_2 = ''<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            labels_1.append(key_1)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            labels_2.append(key_2)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />        else:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            # 使用tf-idf<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            use_idf += 1<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            # ---------重要文本-----<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            primary_words = []<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            for keyword in title_keywords:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                if keyword[1] == 'n':<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                    primary_words.append(keyword[0])<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                if keyword[1] in ['nr', 'nz', 'nt', 'ns']:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                    primary_words.extend([keyword[0]] * len(keyword[0]))<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            abstract_text = "".join(doc.split(' ')[:15])<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            for word, tag in jieba.posseg.cut(abstract_text):<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                if tag == 'n':<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                    primary_words.append(word)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                if tag in ['nr', 'nz', 'ns']:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                    primary_words.extend([word] * len(word))<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            primary_text = "".join(primary_words)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            # 拼接成最后的文本<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            text = primary_text * 2 + title * 6 + " ".join(doc.split(' ')[:15] * 2) + doc<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            # ---------重要文本-----<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            temp_keywords = [keyword for keyword in extract_tags(text, topK=2)]<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            if len(temp_keywords)>=2:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                labels_1.append(temp_keywords[0])<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                labels_2.append(temp_keywords[1])<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            else:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                labels_1.append(temp_keywords[0])<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                labels_2.append(' ')<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    data = {'id': ids,<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            'label1': labels_1,<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            'label2': labels_2}<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    df_data = pd.DataFrame(data, columns=['id', 'label1', 'label2'])<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    df_data.to_csv('result/06_jieba_ensemble.csv', index=False)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    print("使用tf-idf提取的次数:",use_idf)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />if __name__ == '__main__':<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    # evaluate()<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    extract_keyword_ensemble(test_data)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />© 2021 GitHub, Inc.<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />
  以下是来自国内大佬的无私风向
  05 “神策杯”2018年高校算法大师赛第二名代码
  代码链接:
  文章链接:
  团队:SCI毕业
  5.1 目录说明
  jieba:修改jieba库。
  词典:商店解吧词库。PS:词库来自搜狗百度输入法词库,爬虫获得的星词和LSTM命名实体识别结果。
  all_docs.txt:训练语料库
  train_docs_keywords.txt:我改了一些明显错误的关键词,比如D039180梁静茹-&gt;贾静雯,D011909泰荣军-&gt;泰荣军等。
  classes_doc2vec.npy:默认gensim参数,doc2vec+Kmeans对语料库的聚类结果。
  my_idf.txt:计算出的语料的idf文件。
  lgb_sub_9524764012949717.npy LGB的某个预测值,用于特征生成
  stopword.txt:停用词
  Get_Feature.ipynb:特征生成notebook,生成训练集和测试集对应的文件
  lgb_predict.py:预测并输出结果的脚本。需要 train_df_v7.csv 和 test_df_v7.csv。
  train_df_v7.csv、test_df_v7.csv:Get_Feature.ipynb的结果,notebook有详细的特征描述
  Word2vec模型下载地址: 提取码:tw0m。
  Doc2vec模型下载地址:链接:提取码:0ciw。
  5.2 操作说明
  
  运行 Get_Feature.ipynb 以获取 train_df_v7.csv 和 test_df_v7.csv。
  运行 lgb_predict.py 得到结果 sub.csv。
  numpy 1.14.0rc1<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />pandas 0.23.0<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />sklearn 0.19.0<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />lightgbm 2.0.5<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />scipy 1.0.0<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />
  5.3 解题思路和方案说明
  使用jieba的tfidf方法筛选出Top20的候选人关键词
  对每个样本的候选关键词提取对应的特征,将关键词提取当做一个普通的二分类问题。特征可以分为两类:
  样本文档本身的特征:如文本长度、句子数量、聚类结果等;
  候选人关键词自身特点:关键词的长度、逆词频等;
  样本文本与候选关键词的交互特征:词频、中心词频、tfidf、主题相似度等;
  candidate 关键词之间的特征:主要是关键词之间的相似特征。
  候选 关键词 和其他示例文档之间的交互特征:这里有两个非常强大的特征。第一个是候选 关键词 在整个数据集中出现的频率,第二个类似于点击率。计算整个文档中被预测为正样本的概率结果的个数大于0.5(之前提到这个特征的时候,我大概以为会过拟合,但是效果出乎意料的好,所以没有做相应的平滑处理,可能吧因为结果只有Top2的关键词,这里选择0.5的概率会有一定的平滑效果,具体操作参考lgb_predict.py的31-42行)。
  使用LightGBM解决上面的二分类问题,然后根据LightGBM的结果选择每个文本预测概率前2的词作为关键词输出。
  06 第六名项目排名 6 / 622
  代码链接:
  07总结
  该任务属于短语挖掘或关键词挖掘。在接触NLP的过程中,很多同学都在研究如何从文本中挖掘关键词。NLP技术经过近几年的发展,大致归纳出以下几种方法。在上面分享的三个解决方案中:
  基于无监督方法:LDA、TFIDF、TextRank
  基于特征工程:基于无监督生成候选词,进而构建特征训练二分类模型
  关键词基于深度学习的提取:span、bio、bmes crf序列标注等方法
  08 更多信息
  谈谈医疗保健领域的Phrase Mining
  加微信到交流群:1185918903 注:ChallengeHub01
  解决方案:在线智能ai文章伪原创(智能ai文章php在线伪原创)
  阅读本文提示词:smart ai文章php在线伪原创、smart media ai在线伪原创、smart ai伪原创工具下载
  在线智能ai文章伪原创网站源码,1源码
  具体程序代码2
  程序代码 3 优于 伪原创
  程序代码4.如果真的是大型站点,上面一键生成一个适合说话的在线智能ai伪原创应用,可以轻松为你定制
  程序代码6.网上智能ai伪原创应用太多,你要学着做
  程序代码7,程序代码8,网站安全检测工具9,更适合在线智能ai伪原创应用 别人的代码你怎么看都懂
  程序代码9,在线智能AI伪原创应用篇一
  程序代码9、网站安全检测工具绿色免费检测工具绿色在线提交
  
  程序代码10、安全检测工具绿色在线检测
  程序代码11、安全检测工具绿色在线检测
  程序代码12,所有程序定义都不知道你有多厉害
  程序代码 1.所有目录都有软件文明检测完善的在线安全检测功能网站
  程序代码 1.所有目录不知道你有多好
  程序代码 1.将程序代码完全合并到一个网页中
  程序代码2、网页运行成功目录下面一行
  程序代码3.在页面顶部,使用写,标签等管理员操作
  程序代码4,web目录新建保存页面
  
  程序代码seo 伪原创文章工具,1个大量的HTML和JS文件
  使用 LanHelper 可以大大简化您的网络管理。
  LanHelper可以安装在包括全网在内的各种问题系统中,包括使用301重定向、查看兼容性、JS编码等使用方法
  系统软件设计
  LanHelper可实现对不同控制台的控制
  用纯 HTML 编写,运行速度非常快。如果你很快开发了一个简单易用的LanHelper,没有文件管理器,没有任何辅助设置,那些可以显示自动操作和自动更新的系统。
  LanHelper可以自动更新关键字、TAG标签、描述和功能等核心数据类型,并自动添加源代码,自动生成新的高质量展示。
  我会研究导演的出勤、出勤、出勤情况。如果我不能按时报告,讲座内容旁边会显示空白。你可以在这里输入,或者选择一个自动更新功能,它会自动更新为空白并自动更新。
  相关文章 查看全部

  终极:神策杯 2018高校算法大师赛(个人、top2、top6)方案总结
  神策数据推荐系统是基于神策分析平台的智能推荐系统。根据客户需求和业务特点,基于神策分析采集的用户行为数据,利用机器学习算法对咨询、视频、产品等进行个性化推荐,为客户提供智能化应用不同场景,比如优化产品体验,提升点击率等核心业务指标。
  传感器推荐系统是一个完整的学习闭环。采集的基础数据是通过机器学习的算法模型来应用的。实时验证效果,引导数据源的添加,算法优化反馈形成全流程、实时、自动、快速迭代的推荐闭环。
  本次比赛模拟业务场景,目的是提取新闻文本的核心词,最终结果达到提升推荐和用户画像的效果。
  比赛链接:
  Dataset数据地址:
  密码:qa2u
  02任务
  个性化推荐系统是神策智能系统的一个重要方面。准确理解信息的主题是提高推荐系统效果的重要手段。基于真实的商业案例,神策数据提供了数千篇文章 文章 及其 关键词。参赛者需要训练一个“关键词抽取”模型来抽取10万条新闻文章的关键词。
  03数据
  备注:报名参赛或加入战队后,即可获得数据下载权限。
  提供下载的数据集包括两部分:1.all_docs.txt,108295条信息文章数据,数据格式为:ID文章title文章text,以\001分隔在中间。2. train_docs_keywords.txt,1000篇文章文章的关键词标注结果,数据格式为:ID关键词列表,中间用\t分隔。
  注意:标记数据中每个文章的关键词不超过5个。关键词 都出现在 文章 的标题或正文中。需要注意的是“the set of 关键词 of the training set 文章”和“the set of 关键词 of the test set 文章”,这两个集合可能会重叠,但收录与收录之间并不一定存在关系。
  04个人预赛第十一名方案
  基于NLP中的无监督学习方法提取关键词,这也是我第一次参加比赛。当时刚接触NLP,所以对这次比赛印象很深,在此分享给大家
  神策杯“2018年高校算法大师赛B组排名(13/583)
  4.1 计分
  4.2 数据分析:
  4.3 提高技能
  
  词性标注
  这就是tf-idf抽取关键词错误较大的原因
  4.5 核心代码:
  # -*- coding: utf-8 -*-<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /># @Author  : quincyqiang<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /># @File    : analysis_for_06.py<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /># @Time    : 2018/9/5 14:17<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />import pickle<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />import pandas as pd<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />from tqdm import tqdm<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />from jieba.analyse import extract_tags,textrank # tf-idf<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />from jieba import posseg<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />import random<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />import jieba<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />jieba.analyse.set_stop_words('data/stop_words.txt') # 去除停用词<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />jieba.load_userdict('data/custom_dict.txt') # 设置词库<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />'''<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />  nr 人名 nz 其他专名 ns 地名 nt 机构团体 n 名词 l 习用语 i 成语 a 形容词 <br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />  nrt <br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />  v 动词 t 时间词<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />'''<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />test_data=pd.read_csv('data/test_docs.csv')<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />train_data=pd.read_csv('data/new_train_docs.csv')<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />allow_pos={'nr':1,'nz':2,'ns':3,'nt':4,'eng':5,'n':6,'l':7,'i':8,'a':9,'nrt':10,'v':11,'t':12}<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /># allow_pos={'nr':1,'nz':2,'ns':3,'nt':4,'eng':5,'nrt':10}<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />tf_pos = ['ns', 'n', 'vn', 'nr', 'nt', 'eng', 'nrt','v','a']<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />def generate_name(word_tags):<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    name_pos = ['ns', 'n', 'vn', 'nr', 'nt', 'eng', 'nrt']<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    for word_tag in word_tags:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />        if word_tag[0] == '·' or word_tag=='!':<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            index = word_tags.index(word_tag)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            if (index+1) 1]<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />        title_keywords = sorted(title_keywords, reverse=False, key=lambda x: (allow_pos[x[1]], -len(x[0])))<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />        if '·' in title :<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            if len(title_keywords) >= 2:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                key_1 = title_keywords[0][0]<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                key_2 = title_keywords[1][0]<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            else:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                # print(keywords,title,word_tags)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                key_1 = title_keywords[0][0]<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                key_2 = ''<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            labels_1.append(key_1)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            labels_2.append(key_2)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />        else:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            # 使用tf-idf<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            use_idf += 1<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            # ---------重要文本-----<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            primary_words = []<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            for keyword in title_keywords:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                if keyword[1] == 'n':<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                    primary_words.append(keyword[0])<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                if keyword[1] in ['nr', 'nz', 'nt', 'ns']:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                    primary_words.extend([keyword[0]] * len(keyword[0]))<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            abstract_text = "".join(doc.split(' ')[:15])<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            for word, tag in jieba.posseg.cut(abstract_text):<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                if tag == 'n':<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                    primary_words.append(word)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                if tag in ['nr', 'nz', 'ns']:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                    primary_words.extend([word] * len(word))<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            primary_text = "".join(primary_words)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            # 拼接成最后的文本<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            text = primary_text * 2 + title * 6 + " ".join(doc.split(' ')[:15] * 2) + doc<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            # ---------重要文本-----<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            temp_keywords = [keyword for keyword in extract_tags(text, topK=2)]<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            if len(temp_keywords)>=2:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                labels_1.append(temp_keywords[0])<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                labels_2.append(temp_keywords[1])<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            else:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                labels_1.append(temp_keywords[0])<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                labels_2.append(' ')<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    data = {'id': ids,<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            'label1': labels_1,<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            'label2': labels_2}<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    df_data = pd.DataFrame(data, columns=['id', 'label1', 'label2'])<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    df_data.to_csv('result/06_jieba_ensemble.csv', index=False)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    print("使用tf-idf提取的次数:",use_idf)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />if __name__ == '__main__':<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    # evaluate()<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    extract_keyword_ensemble(test_data)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />© 2021 GitHub, Inc.<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />
  以下是来自国内大佬的无私风向
  05 “神策杯”2018年高校算法大师赛第二名代码
  代码链接:
  文章链接:
  团队:SCI毕业
  5.1 目录说明
  jieba:修改jieba库。
  词典:商店解吧词库。PS:词库来自搜狗百度输入法词库,爬虫获得的星词和LSTM命名实体识别结果。
  all_docs.txt:训练语料库
  train_docs_keywords.txt:我改了一些明显错误的关键词,比如D039180梁静茹-&gt;贾静雯,D011909泰荣军-&gt;泰荣军等。
  classes_doc2vec.npy:默认gensim参数,doc2vec+Kmeans对语料库的聚类结果。
  my_idf.txt:计算出的语料的idf文件。
  lgb_sub_9524764012949717.npy LGB的某个预测值,用于特征生成
  stopword.txt:停用词
  Get_Feature.ipynb:特征生成notebook,生成训练集和测试集对应的文件
  lgb_predict.py:预测并输出结果的脚本。需要 train_df_v7.csv 和 test_df_v7.csv。
  train_df_v7.csv、test_df_v7.csv:Get_Feature.ipynb的结果,notebook有详细的特征描述
  Word2vec模型下载地址: 提取码:tw0m。
  Doc2vec模型下载地址:链接:提取码:0ciw。
  5.2 操作说明
  
  运行 Get_Feature.ipynb 以获取 train_df_v7.csv 和 test_df_v7.csv。
  运行 lgb_predict.py 得到结果 sub.csv。
  numpy 1.14.0rc1<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />pandas 0.23.0<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />sklearn 0.19.0<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />lightgbm 2.0.5<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />scipy 1.0.0<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />
  5.3 解题思路和方案说明
  使用jieba的tfidf方法筛选出Top20的候选人关键词
  对每个样本的候选关键词提取对应的特征,将关键词提取当做一个普通的二分类问题。特征可以分为两类:
  样本文档本身的特征:如文本长度、句子数量、聚类结果等;
  候选人关键词自身特点:关键词的长度、逆词频等;
  样本文本与候选关键词的交互特征:词频、中心词频、tfidf、主题相似度等;
  candidate 关键词之间的特征:主要是关键词之间的相似特征。
  候选 关键词 和其他示例文档之间的交互特征:这里有两个非常强大的特征。第一个是候选 关键词 在整个数据集中出现的频率,第二个类似于点击率。计算整个文档中被预测为正样本的概率结果的个数大于0.5(之前提到这个特征的时候,我大概以为会过拟合,但是效果出乎意料的好,所以没有做相应的平滑处理,可能吧因为结果只有Top2的关键词,这里选择0.5的概率会有一定的平滑效果,具体操作参考lgb_predict.py的31-42行)。
  使用LightGBM解决上面的二分类问题,然后根据LightGBM的结果选择每个文本预测概率前2的词作为关键词输出。
  06 第六名项目排名 6 / 622
  代码链接:
  07总结
  该任务属于短语挖掘或关键词挖掘。在接触NLP的过程中,很多同学都在研究如何从文本中挖掘关键词。NLP技术经过近几年的发展,大致归纳出以下几种方法。在上面分享的三个解决方案中:
  基于无监督方法:LDA、TFIDF、TextRank
  基于特征工程:基于无监督生成候选词,进而构建特征训练二分类模型
  关键词基于深度学习的提取:span、bio、bmes crf序列标注等方法
  08 更多信息
  谈谈医疗保健领域的Phrase Mining
  加微信到交流群:1185918903 注:ChallengeHub01
  解决方案:在线智能ai文章伪原创(智能ai文章php在线伪原创)
  阅读本文提示词:smart ai文章php在线伪原创、smart media ai在线伪原创、smart ai伪原创工具下载
  在线智能ai文章伪原创网站源码,1源码
  具体程序代码2
  程序代码 3 优于 伪原创
  程序代码4.如果真的是大型站点,上面一键生成一个适合说话的在线智能ai伪原创应用,可以轻松为你定制
  程序代码6.网上智能ai伪原创应用太多,你要学着做
  程序代码7,程序代码8,网站安全检测工具9,更适合在线智能ai伪原创应用 别人的代码你怎么看都懂
  程序代码9,在线智能AI伪原创应用篇一
  程序代码9、网站安全检测工具绿色免费检测工具绿色在线提交
  
  程序代码10、安全检测工具绿色在线检测
  程序代码11、安全检测工具绿色在线检测
  程序代码12,所有程序定义都不知道你有多厉害
  程序代码 1.所有目录都有软件文明检测完善的在线安全检测功能网站
  程序代码 1.所有目录不知道你有多好
  程序代码 1.将程序代码完全合并到一个网页中
  程序代码2、网页运行成功目录下面一行
  程序代码3.在页面顶部,使用写,标签等管理员操作
  程序代码4,web目录新建保存页面
  
  程序代码seo 伪原创文章工具,1个大量的HTML和JS文件
  使用 LanHelper 可以大大简化您的网络管理。
  LanHelper可以安装在包括全网在内的各种问题系统中,包括使用301重定向、查看兼容性、JS编码等使用方法
  系统软件设计
  LanHelper可实现对不同控制台的控制
  用纯 HTML 编写,运行速度非常快。如果你很快开发了一个简单易用的LanHelper,没有文件管理器,没有任何辅助设置,那些可以显示自动操作和自动更新的系统。
  LanHelper可以自动更新关键字、TAG标签、描述和功能等核心数据类型,并自动添加源代码,自动生成新的高质量展示。
  我会研究导演的出勤、出勤、出勤情况。如果我不能按时报告,讲座内容旁边会显示空白。你可以在这里输入,或者选择一个自动更新功能,它会自动更新为空白并自动更新。
  相关文章

通用解决方案:C#爬虫算法[精华]

采集交流优采云 发表了文章 • 0 个评论 • 44 次浏览 • 2022-11-15 15:43 • 来自相关话题

  通用解决方案:C#爬虫算法[精华]
  在此期间采集一些网络资源的 C# 数据采集,考虑到
  
  采集源的防采集屏蔽,所以优采云采集器不能用,只能写一个,部分代码如下: Codprivatentnumc # 数据采集 C# 爬虫算法 C# 数据采集这个时候采集一些网络资源,考虑到防御采集源采集阻塞,所以优采云采集器不能用,只能写一个,部分代码比如 gotoRes() ntnum 这次采集一些网络资源, 考虑到采集源的防采集屏蔽,所以优采云采集器不能使用,只能写一个,部分代码如下: C#爬网算法 C#数据采集这次采集 一些网络资源,考虑到采集源的防采集屏蔽,所以优采云采集器没有用,只能写一个,部分代码如下: CodeprgotoRes(ntnumprivatevoidgotoRes()intnumintdnumstringstrMsg“ 执行数据如下:\r\n\r\n”;D ataTabledtBusiness。商。GetUrlTable(Convert。ToInt32(starid。文本),转换。ToInt32(endid。文本));stringstrPath“d:\\res\\”;stringstrFilePathstring[]resourceUrlSplitString(dt。
  Rows[i][“resourceUrl”]。ToString()。ToLower(),(intlengthresourceUrl。长度;长度++)dt。Rows[i][“resourceUrl”]。ToString()resourceUrl[length];(Business。商。UpDateRes(Convert。ToInt32(dt。行[i][“rid”])))“下载完成!\r\n“;dnum++;publicbooldownfile2(stringurl,stringLocalPath)newUri(url);HttpWebRequestmRequest(HttpWebRequest)WebRequest。创建(u);mRequest。方法“获取”;mRequest。ContentType“application/x-www-form-urlencoded”;HttpWebResponsewr(HttpWebResponse)mRequest。获取响应();状态栏1。TextStreamsInwr。
  
  GetResponseStream();FileStreamfsnewFileStream(LocalPath,FileMode。创建,文件访问。写);状态栏1。文本“错误!长长WR器。内容长度;intbyte[]buffernewbyte[1024];而“字节当前下载:”sIn。关闭();水利。关闭();状态栏1。文本“文件下载完成”文件大小 fs。长度。ToString() “byte”;安慰。写线(“文件下载完整文件大小”fs。长度。ToString()System。日期时间。现在。ToString());司 司长。关闭();返回真;返回假;}C#爬虫算法 C#数据采集这段时间内采集的一些网络资源,考虑到采集源的防采集屏蔽,所以优采云采集器没有用,只能写一个,部分代码如下: CodeprgotoRes (ntnumCodeprgotoRes(ntnum
  解决方案:百度飓风3.0算法解读,控制跨领域采集及站群问题
  百度8月8日发布公告称,“飓风算法3.0即将上线,控制跨域采集和站群问题”。为维护健康的移动生态,保障用户体验,确保优质站点/智能小程序获得合理的流量分配,百度搜索将于近期升级飓风算法,升级后的飓风算法3.0将上线在线的。
  本次算法升级主要针对跨域采集和站群问题,将覆盖百度搜索下的PC站点、H5站点、智能小程序等。对于算法覆盖的站点/智能小程序,将根据违规严重程度酌情限制搜索结果的展示。
  下面详细介绍飓风算法3.0的相关规则。
  问题1:同一品牌下,分支的网站/智能小程序都使用同一个模板,会不会被飓风算法3.0判定为站群命中?
  答1:对于站群问题,算法会综合判断页面布局相似度、同一主题下站点/智能小程序数量、内容质量、内容稀缺性、内容相似度等多种因素。
  
  如果网站/同品牌下的智能小程序使用相同的页面布局,内容相似度高,这种情况也可能被判断为站群,存在被算法命中的风险。
  问题示例:某品牌旗下多个区域分公司的智能小程序使用同一个模板,内容质量低,相似度高。
  问题2:此次飓风算法升级主要针对跨域采集,那么同域的采集会被算法覆盖吗?
  回答2:飓风算法3.0的主要升级点是加强了对跨域采集和站群问题的覆盖,但是之前的飓风算法在控制不良采集方面依然有效. 百度搜索算法一直在持续运行,以控制损害用户体验的违规行为,旧算法不会因算法升级或新增而停止。
  问题三:站点/智能小程序中如果有跨域采集内容,是否需要删除之前的跨域内容,以免被算法命中?
  回答3:是的,如果本站/智能小程序发布了与网站/智能小程序领域无关的内容,建议您尽快删除跨领域内容,深化当前领域,并生产满足用户需求的优质内容,提升网站/智能小程序的领域关注度。
  问题四:如果在一个站点下设置不同主题的频道或目录,发布不同领域的内容,会不会被算法命中?
  
  回答4:不同主题的频道或目录可以存在于同一个站点下,但每个频道的内容要与站点的领域定位相关,并以该领域为重点。频道的内容应该是满足搜索用户需求的优质内容。
  问题5:此次飓风算法升级主要针对跨领域的采集,那么同领域的采集会被算法覆盖吗?
  答5:同一个主题下可以存在不同主题的智能小程序,但每个智能小程序都应该有专业的资源、优质的内容、完整的功能。应该没有站群行为,内容应该关注智能小程序所属的域。
  总结:
  百度飓风算法3.0预计8月上线。当然,和以往一样,如果你的站点被百度识别为跨域采集或站群问题,那么你可能会收到百度搜索资源平台的提醒,比如站内信和短信,所以小编第九条,建议大家要自查,有的话就彻底整改,避免不必要的降电。
  其实小酒认为,与其说百度飓风算法3.0是针对跨域采集和站群,其实更像是在为百度的智能小程序助力和铺路,以及随着智能小程序权重的增加,通过搜索引擎算法间接将流量引向百度小程序。 查看全部

  通用解决方案:C#爬虫算法[精华]
  在此期间采集一些网络资源的 C# 数据采集,考虑到
  
  采集源的防采集屏蔽,所以优采云采集器不能用,只能写一个,部分代码如下: Codprivatentnumc # 数据采集 C# 爬虫算法 C# 数据采集这个时候采集一些网络资源,考虑到防御采集源采集阻塞,所以优采云采集器不能用,只能写一个,部分代码比如 gotoRes() ntnum 这次采集一些网络资源, 考虑到采集源的防采集屏蔽,所以优采云采集器不能使用,只能写一个,部分代码如下: C#爬网算法 C#数据采集这次采集 一些网络资源,考虑到采集源的防采集屏蔽,所以优采云采集器没有用,只能写一个,部分代码如下: CodeprgotoRes(ntnumprivatevoidgotoRes()intnumintdnumstringstrMsg“ 执行数据如下:\r\n\r\n”;D ataTabledtBusiness。商。GetUrlTable(Convert。ToInt32(starid。文本),转换。ToInt32(endid。文本));stringstrPath“d:\\res\\”;stringstrFilePathstring[]resourceUrlSplitString(dt。
  Rows[i][“resourceUrl”]。ToString()。ToLower(),(intlengthresourceUrl。长度;长度++)dt。Rows[i][“resourceUrl”]。ToString()resourceUrl[length];(Business。商。UpDateRes(Convert。ToInt32(dt。行[i][“rid”])))“下载完成!\r\n“;dnum++;publicbooldownfile2(stringurl,stringLocalPath)newUri(url);HttpWebRequestmRequest(HttpWebRequest)WebRequest。创建(u);mRequest。方法“获取”;mRequest。ContentType“application/x-www-form-urlencoded”;HttpWebResponsewr(HttpWebResponse)mRequest。获取响应();状态栏1。TextStreamsInwr。
  
  GetResponseStream();FileStreamfsnewFileStream(LocalPath,FileMode。创建,文件访问。写);状态栏1。文本“错误!长长WR器。内容长度;intbyte[]buffernewbyte[1024];而“字节当前下载:”sIn。关闭();水利。关闭();状态栏1。文本“文件下载完成”文件大小 fs。长度。ToString() “byte”;安慰。写线(“文件下载完整文件大小”fs。长度。ToString()System。日期时间。现在。ToString());司 司长。关闭();返回真;返回假;}C#爬虫算法 C#数据采集这段时间内采集的一些网络资源,考虑到采集源的防采集屏蔽,所以优采云采集器没有用,只能写一个,部分代码如下: CodeprgotoRes (ntnumCodeprgotoRes(ntnum
  解决方案:百度飓风3.0算法解读,控制跨领域采集及站群问题
  百度8月8日发布公告称,“飓风算法3.0即将上线,控制跨域采集和站群问题”。为维护健康的移动生态,保障用户体验,确保优质站点/智能小程序获得合理的流量分配,百度搜索将于近期升级飓风算法,升级后的飓风算法3.0将上线在线的。
  本次算法升级主要针对跨域采集和站群问题,将覆盖百度搜索下的PC站点、H5站点、智能小程序等。对于算法覆盖的站点/智能小程序,将根据违规严重程度酌情限制搜索结果的展示。
  下面详细介绍飓风算法3.0的相关规则。
  问题1:同一品牌下,分支的网站/智能小程序都使用同一个模板,会不会被飓风算法3.0判定为站群命中?
  答1:对于站群问题,算法会综合判断页面布局相似度、同一主题下站点/智能小程序数量、内容质量、内容稀缺性、内容相似度等多种因素。
  
  如果网站/同品牌下的智能小程序使用相同的页面布局,内容相似度高,这种情况也可能被判断为站群,存在被算法命中的风险。
  问题示例:某品牌旗下多个区域分公司的智能小程序使用同一个模板,内容质量低,相似度高。
  问题2:此次飓风算法升级主要针对跨域采集,那么同域的采集会被算法覆盖吗?
  回答2:飓风算法3.0的主要升级点是加强了对跨域采集和站群问题的覆盖,但是之前的飓风算法在控制不良采集方面依然有效. 百度搜索算法一直在持续运行,以控制损害用户体验的违规行为,旧算法不会因算法升级或新增而停止。
  问题三:站点/智能小程序中如果有跨域采集内容,是否需要删除之前的跨域内容,以免被算法命中?
  回答3:是的,如果本站/智能小程序发布了与网站/智能小程序领域无关的内容,建议您尽快删除跨领域内容,深化当前领域,并生产满足用户需求的优质内容,提升网站/智能小程序的领域关注度。
  问题四:如果在一个站点下设置不同主题的频道或目录,发布不同领域的内容,会不会被算法命中?
  
  回答4:不同主题的频道或目录可以存在于同一个站点下,但每个频道的内容要与站点的领域定位相关,并以该领域为重点。频道的内容应该是满足搜索用户需求的优质内容。
  问题5:此次飓风算法升级主要针对跨领域的采集,那么同领域的采集会被算法覆盖吗?
  答5:同一个主题下可以存在不同主题的智能小程序,但每个智能小程序都应该有专业的资源、优质的内容、完整的功能。应该没有站群行为,内容应该关注智能小程序所属的域。
  总结:
  百度飓风算法3.0预计8月上线。当然,和以往一样,如果你的站点被百度识别为跨域采集或站群问题,那么你可能会收到百度搜索资源平台的提醒,比如站内信和短信,所以小编第九条,建议大家要自查,有的话就彻底整改,避免不必要的降电。
  其实小酒认为,与其说百度飓风算法3.0是针对跨域采集和站群,其实更像是在为百度的智能小程序助力和铺路,以及随着智能小程序权重的增加,通过搜索引擎算法间接将流量引向百度小程序。

解决方案:百度飓风算法下 网站何去何从?

采集交流优采云 发表了文章 • 0 个评论 • 50 次浏览 • 2022-11-15 15:26 • 来自相关话题

  解决方案:百度飓风算法下 网站何去何从?
  2019-46-27
  网站在百度飓风算法下去哪了?
  7月7日,百度推出飓风算法!旨在严厉打击以不良内容来源采集为主要内容的网站。起初,飓风算法的影响并没有立即显现出来,而且大多被 网站 忽略了。我以为百度的算法只是对网站的一个警告,采集网站太多了,不可能一下子严厉整改。然而,从7月下旬开始,不少网站发现了全站索引量减少、降级、甚至零脱毛的“惨状”,这让广大网站开始关注起来到飓风算法。一时间,站长圈内人心惶惶,不知该如何应对!
  图1来自PS处理
  什么是飓风算法?
  关于飓风算法,百度给的介绍不是很详细,也没有像之前系列算法那样的惩罚案例。究其原因,大概是因为网站采集的行为比较广泛,不方便举例,所以站长没有引起重视,提前预防。不少网站被措手不及,不救难,损失惨重。
  飓风算法百度官方解释:
  
  百度搜索近日推出飓风算法,旨在严厉打击以不良内容来源采集为主要内容的网站。原创内容提供更多的展示机会,促进搜索生态的良性发展。
  飓风算法会例行输出惩罚数据,并会根据情况随时调整迭代次数,体现了百度搜索对不良采集的零容忍。优质原创站点如果发现站点的索引量明显下降,访问量明显下降,可以在反馈中心进行反馈。
  图2来自PS合成
  飓风算法的影响
  那么飓风算法带来了哪些影响呢?笔者将根据采集到的案例分析以下几点
  1 网站减少索引量
  很多网站发现飓风算法后百度搜索的索引量明显下降。这应该是飓风算法对网站采集行为最直接的惩罚,也应该算是最轻的惩罚。缩减的索引量应该是所有采集相关的内容。不过正常更新的网站内容基本不会被惩罚。
  2 网站体重下降
  
  有的网站在狂飙算法后通过爱站、站长工具等搜索,权重都在下降。说明采集的行为比较严重,网站的权重在索引量大幅度减少时直接受到影响。此类网站可能 采集 收录所有内容的 50% 以上。
  3 直接清除百度新闻源
  虽然百度在年初表示取消了新闻源概念,但百度新闻的展示并没有取消,取而代之的是VIP站点优质内容的推送。也就是说,如果你的网站内容质量高,符合百度算法的要求,也会在新闻源中展示。而在新算法下,百度对新闻来源的展示是实时的、智能的推送。一旦你的网站降低了内容质量,网站被黑客入侵,或者有过度的采集行为,惩罚的频率和强度也会增加。但是这次飓风算法,因为采集的行为,很多优质的新闻源站点被直接取消,造成了流量方面的巨大损失。
  4 网站直接拔毛并归零
  这种情况比较少见,但是笔者在搜集案例的时候确实遇到过,而且是比较大型的网站,每天有几十万的访问量。据分析,此类网站一般都是采集相当严重,甚至完全是采集网站。以前有的采集做的比较好网站,可以增加流量和权重,但是飓风算法一旦上线,不管你的网站多大,惩罚都会被惩罚。
  如何处理被招募网站?
  在飓风算法中,影响比较大的站点类型是信息。这种类型的 网站 通常具有特定的 采集 行为。处罚的时间和力度虽然不同,但基本相同。不能跑。百度算法说明中也有提到。飓风算法会根据情况随时调整自己的迭代次数。也许你的网站现在没有受到惩罚,但只要你有采集行为,迟早还是要“还债”的。第二类是b2b类网站,b2b网站一般数据量很大,很多网站也依赖采集采集数据,而b2b类比较依赖搜索引擎的张强也完全靠流量为生。一旦受到处罚,金钱的直接损失将比信息损失更惨网站。其他类型的网站,只要有采集行为,这次飓风算法都会进行惩罚。那么如何处理被招募网站?
  1 尽快停止 采集
  有些 网站 可能很幸运,即使受到惩罚也不想阻止 采集。其实,这种想法无可厚非。一旦你停止 采集,流量就会下降。网站 靠什么生存?但不要停止 采集 并遭受更多痛苦。还有一些 网站 认为我正在改进 采集 行为,减少 采集 的数量,调整 采集 频率和事件,做 采集文章编辑和修改可以逃避算法。这种想法也是错误的。现在搜索引擎的算法越来越聪明,算法也会考虑到你能想到的。所以网站和采集行为应该及时停止采集,以免造成更多的损失。
  解决方案:夏季SEO超链接工具和单向链接优化是否可行?(组图)
  下载: 开发商:
  软件语言:简体中文软件类别:国产软件/站长工具
  应用平台://
  某种
  0%(0)
  某种
  100% (9)
  软件介绍:
  根据最新的科学和艺术预测:未来人类今天所有的重复性工作都可以被机器和工具所取代,人们可以腾出双手去做自己喜欢的有创意的事情。
  
  今天,您可以将电脑上复杂的获取外部链接的过程交给Shaling的SEO超链接工具,为我们省时、省钱、省力!享受健康生活!
  优化原则:
  SEO超链接工具集成了ip查询、排名查询、pr查询等上万站长常用的查询站点,因为这些站点大部分都有查询记录展示功能,查询记录可以百度,
  、搜狗等搜索引擎迅速收录,形成外链。因为这是一个普通查询生成的外链,这个外链可以显着增加索引,提高搜索引擎排名!
  常见问题:
  1、使用SEO超链接工具算作SEO作弊吗?
  SEO超链接工具只是一个简单的综合查询工具,模拟正常的人工查询抓号,没有作弊。如果是作弊,你可以使用Daylight Savings SEO 超链接工具来推广你竞争对手的网站,然后放手。
  2. 网站单纯依靠DST SEO超链接工具和单向链接优化是否可行?
  网站优化不能单靠夏玲的SEO超链接工具。它需要结合正常的外部链接和附属链接。您可以在 网站 维基百科上发布 文章 并在附属链接平台上交换友好链接。
  3. 如何使用超链接以获得最佳效果?
  
  夏令时 SEO 超链接工具不同于常规链接。这是一个动态链接。只有经常使用超链接工具进行优化,才能获得稳定的链接,最终让搜索引擎将查询索引到URL页面
  指导:
  打开软件后,进入需要升级的网页,如: ,点击开始。程序小巧玲珑,不占内存,还可以最小化,每天都能跟上排名。
  更多介绍
  转载请注明出处文章。新会首页&gt; Web基础&gt; DIV&amp;CSS&gt;
  标题:夏季SEO超链接工具1.0
  地址:
  关键词:夏灵,超级,外链,工具
  自动采集和发布 网站文章
  有财云采集器是一个网站采集器,根据用户提供的关键词,自动采集云相关文章和发布给用户网站。它可以自动识别各种网页的标题、正文等信息,无需用户编写任何采集规则,实现采集全网。内容采集完成后,会自动计算内容与设置关键词的相关性,只推送相关的文章给用户。支持标题前缀、关键词自动加粗、永久链接插入、自动tag标签提取、自动内链、自动图片匹配、自动伪原创、内容过滤器更换、电话号码和URL清理、定时采集、百度主动提交等SEO功能。用户只需设置关键词和相关需求筛选电话号码软件,即可实现完全托管和零维护的网站内容更新。网站没有数量限制,无论是单个网站还是大型站群抓号器,都可以很方便的进行管理。 查看全部

  解决方案:百度飓风算法下 网站何去何从?
  2019-46-27
  网站在百度飓风算法下去哪了?
  7月7日,百度推出飓风算法!旨在严厉打击以不良内容来源采集为主要内容的网站。起初,飓风算法的影响并没有立即显现出来,而且大多被 网站 忽略了。我以为百度的算法只是对网站的一个警告,采集网站太多了,不可能一下子严厉整改。然而,从7月下旬开始,不少网站发现了全站索引量减少、降级、甚至零脱毛的“惨状”,这让广大网站开始关注起来到飓风算法。一时间,站长圈内人心惶惶,不知该如何应对!
  图1来自PS处理
  什么是飓风算法?
  关于飓风算法,百度给的介绍不是很详细,也没有像之前系列算法那样的惩罚案例。究其原因,大概是因为网站采集的行为比较广泛,不方便举例,所以站长没有引起重视,提前预防。不少网站被措手不及,不救难,损失惨重。
  飓风算法百度官方解释:
  
  百度搜索近日推出飓风算法,旨在严厉打击以不良内容来源采集为主要内容的网站。原创内容提供更多的展示机会,促进搜索生态的良性发展。
  飓风算法会例行输出惩罚数据,并会根据情况随时调整迭代次数,体现了百度搜索对不良采集的零容忍。优质原创站点如果发现站点的索引量明显下降,访问量明显下降,可以在反馈中心进行反馈。
  图2来自PS合成
  飓风算法的影响
  那么飓风算法带来了哪些影响呢?笔者将根据采集到的案例分析以下几点
  1 网站减少索引量
  很多网站发现飓风算法后百度搜索的索引量明显下降。这应该是飓风算法对网站采集行为最直接的惩罚,也应该算是最轻的惩罚。缩减的索引量应该是所有采集相关的内容。不过正常更新的网站内容基本不会被惩罚。
  2 网站体重下降
  
  有的网站在狂飙算法后通过爱站、站长工具等搜索,权重都在下降。说明采集的行为比较严重,网站的权重在索引量大幅度减少时直接受到影响。此类网站可能 采集 收录所有内容的 50% 以上。
  3 直接清除百度新闻源
  虽然百度在年初表示取消了新闻源概念,但百度新闻的展示并没有取消,取而代之的是VIP站点优质内容的推送。也就是说,如果你的网站内容质量高,符合百度算法的要求,也会在新闻源中展示。而在新算法下,百度对新闻来源的展示是实时的、智能的推送。一旦你的网站降低了内容质量,网站被黑客入侵,或者有过度的采集行为,惩罚的频率和强度也会增加。但是这次飓风算法,因为采集的行为,很多优质的新闻源站点被直接取消,造成了流量方面的巨大损失。
  4 网站直接拔毛并归零
  这种情况比较少见,但是笔者在搜集案例的时候确实遇到过,而且是比较大型的网站,每天有几十万的访问量。据分析,此类网站一般都是采集相当严重,甚至完全是采集网站。以前有的采集做的比较好网站,可以增加流量和权重,但是飓风算法一旦上线,不管你的网站多大,惩罚都会被惩罚。
  如何处理被招募网站?
  在飓风算法中,影响比较大的站点类型是信息。这种类型的 网站 通常具有特定的 采集 行为。处罚的时间和力度虽然不同,但基本相同。不能跑。百度算法说明中也有提到。飓风算法会根据情况随时调整自己的迭代次数。也许你的网站现在没有受到惩罚,但只要你有采集行为,迟早还是要“还债”的。第二类是b2b类网站,b2b网站一般数据量很大,很多网站也依赖采集采集数据,而b2b类比较依赖搜索引擎的张强也完全靠流量为生。一旦受到处罚,金钱的直接损失将比信息损失更惨网站。其他类型的网站,只要有采集行为,这次飓风算法都会进行惩罚。那么如何处理被招募网站?
  1 尽快停止 采集
  有些 网站 可能很幸运,即使受到惩罚也不想阻止 采集。其实,这种想法无可厚非。一旦你停止 采集,流量就会下降。网站 靠什么生存?但不要停止 采集 并遭受更多痛苦。还有一些 网站 认为我正在改进 采集 行为,减少 采集 的数量,调整 采集 频率和事件,做 采集文章编辑和修改可以逃避算法。这种想法也是错误的。现在搜索引擎的算法越来越聪明,算法也会考虑到你能想到的。所以网站和采集行为应该及时停止采集,以免造成更多的损失。
  解决方案:夏季SEO超链接工具和单向链接优化是否可行?(组图)
  下载: 开发商:
  软件语言:简体中文软件类别:国产软件/站长工具
  应用平台://
  某种
  0%(0)
  某种
  100% (9)
  软件介绍:
  根据最新的科学和艺术预测:未来人类今天所有的重复性工作都可以被机器和工具所取代,人们可以腾出双手去做自己喜欢的有创意的事情。
  
  今天,您可以将电脑上复杂的获取外部链接的过程交给Shaling的SEO超链接工具,为我们省时、省钱、省力!享受健康生活!
  优化原则:
  SEO超链接工具集成了ip查询、排名查询、pr查询等上万站长常用的查询站点,因为这些站点大部分都有查询记录展示功能,查询记录可以百度,
  、搜狗等搜索引擎迅速收录,形成外链。因为这是一个普通查询生成的外链,这个外链可以显着增加索引,提高搜索引擎排名!
  常见问题:
  1、使用SEO超链接工具算作SEO作弊吗?
  SEO超链接工具只是一个简单的综合查询工具,模拟正常的人工查询抓号,没有作弊。如果是作弊,你可以使用Daylight Savings SEO 超链接工具来推广你竞争对手的网站,然后放手。
  2. 网站单纯依靠DST SEO超链接工具和单向链接优化是否可行?
  网站优化不能单靠夏玲的SEO超链接工具。它需要结合正常的外部链接和附属链接。您可以在 网站 维基百科上发布 文章 并在附属链接平台上交换友好链接。
  3. 如何使用超链接以获得最佳效果?
  
  夏令时 SEO 超链接工具不同于常规链接。这是一个动态链接。只有经常使用超链接工具进行优化,才能获得稳定的链接,最终让搜索引擎将查询索引到URL页面
  指导:
  打开软件后,进入需要升级的网页,如: ,点击开始。程序小巧玲珑,不占内存,还可以最小化,每天都能跟上排名。
  更多介绍
  转载请注明出处文章。新会首页&gt; Web基础&gt; DIV&amp;CSS&gt;
  标题:夏季SEO超链接工具1.0
  地址:
  关键词:夏灵,超级,外链,工具
  自动采集和发布 网站文章
  有财云采集器是一个网站采集器,根据用户提供的关键词,自动采集云相关文章和发布给用户网站。它可以自动识别各种网页的标题、正文等信息,无需用户编写任何采集规则,实现采集全网。内容采集完成后,会自动计算内容与设置关键词的相关性,只推送相关的文章给用户。支持标题前缀、关键词自动加粗、永久链接插入、自动tag标签提取、自动内链、自动图片匹配、自动伪原创、内容过滤器更换、电话号码和URL清理、定时采集、百度主动提交等SEO功能。用户只需设置关键词和相关需求筛选电话号码软件,即可实现完全托管和零维护的网站内容更新。网站没有数量限制,无论是单个网站还是大型站群抓号器,都可以很方便的进行管理。

解决方案:视频的基本参数及H264编解码相关概念

采集交流优采云 发表了文章 • 0 个评论 • 45 次浏览 • 2022-11-12 13:49 • 来自相关话题

  解决方案:视频的基本参数及H264编解码相关概念
  DTS时间戳决定SCR时间等于DTS时间时解码器何时解码,与PTS时间戳类似。通常,DTS/PTS 时间戳表示比音频-视频数据包中的 SCR 晚的时间。例如,如果一个视频包的SCR为100ms(意味着播放100ms后从磁盘读取包),那么DTS/PTS值很少是200/280ms,也就是说当SCR达到200ms时,视频is 数据应该在 80ms 后解码并显示(视频数据保存在缓冲区中,直到解码开始)。当与视频流相关的复用率设置得太高时,通常会发生下溢。如果mux rate是1000000bits/sec(意味着解码器必须以1000000bits/sec读取文件),但视频速率是2000000bits/sec(意味着视频数据需要以2000000bits/sec显示),从磁盘读取 获取视频数据的速度不够快,无法在 1 秒内读取足够的视频数据。在这种情况下,DTS/PTS 时间戳表示视频在从硬盘读取之前已被解码或显示(DTS/PTS 时间戳将早于收录它们的数据包中的 SCR 时间)。
  现在依靠解码器,这基本上不是问题(尽管 MPEG 文件不完全符合 MPEG 标准,因为它们不应该有下溢)。一些编解码器(许多著名的基于 PC 的播放器)尽可能快地读取文件以显示视频,如果可能的话忽略 SCR。
  请注意,在您提供的列表中,平均视频流传输速率约为 3Mbps(3000000 位/秒),但峰值为 14Mbps(非常大,DVD 限制为 9.8Mbps)。这意味着需要将复用速率调整得足够大以处理 14Mbps 部分,而 bbMPEG 计算的复用速率有时太低而不会导致下溢。您是否打算使视频流率如此之高?这超出了 DVD 的规格,并且很可能不会在大多数独立设备中播放。如果您不这样计划,我会将 mquant 值从 1 增加,并在视频设置中将最大比特率设置为 9Mbps,以保持比特率更小。
  如果你真的想要视频比特率那么高,你需要增加复用率。从提供的列表中可以得出结论,bbMPEG 使用 06800bits/sec 或 1838350bytes/sec 的复用速率(总数据速率:1838350bytes/sec (06800bits/sec) 行)。您在 force mux rate 字段中设置的值应该以字节/秒为单位,并且可以被 50 整除。所以我将从 36767 (1838350/50) 开始并继续增长,直到不再有下溢错误;
  比特率(比特率) 关于比特率
  由于保存完整逐帧图片的原创视频文件太大,需要通过视频压缩算法对视频中的图片进行压缩,以减小视频文件的大小。视频的失真会越严重,因为视频中原创图像的数据信息在压缩过程中不可避免地会丢失。在了解这一点的前提下,我举个例子,将一个分辨率为1080P的原创视频(未压缩)压缩成两个分别为4GB和1GB的视频文件。因为1GB的视频压缩比更高,很明显看1GB的视频不如4GB的视频清晰(虽然它们的分辨率都是1080P)。
  比特率,也称为比特率,是指在压缩视频时为视频指定一个参数,以告诉压缩软件预期压缩视频的大小。比特率的英文名称是bps(bit per second),它是衡量一个视频大小的平均每秒比特数。
  计算视频的比特率
  我们可以根据视频的长度和大小来推断视频的比特率。下面是一个具体的例子。
  一个 1080P 的视频长 100 分钟,大小为 1GB,视频的比特率是多少?
  100min = 100*60s = 6000s;
1G = 1024M = 1024*1024KB = 1024*1024*1024Bit = 1024*1024*1024*8bit = 8589934592bit;
比特率 = 8589934592/6000s = 1431655b/s = 1.4Mbit/s;
复制代码
  那么这个视频的码率大约是1.4Mbit/s。这个比特率在在线视频中已经很高了。通常主流视频平台的最高码率在1Mbit左右,比如直播网站斗鱼。高清选项播放的实际视频码率为 900Kbit/s (0.9Mbit)。
  我们可以得出结论,对于相同时长的视频,码率越大,视频尺寸越大,视频质量越清晰(不管各种压缩算法的优劣),这是最直观的感受. 比特率对于视频来说非常重要。
  音视频同步
  上面提到的概念与视频帧、DTS 和 PTS 有关。我们都知道,在一个媒体流中,除了视频之外,一般还包括音频。音频播放也有DTS和PTS的概念,但是音频没有类似视频的B帧,不需要双向预测,所以音频帧的DTS和PTS顺序是一致的。
  将音视频混合在一起播放,呈现出我们经常看到的广义视频。当音视频一起播放时,我们一般需要面对一个问题:如何同步,避免出现画面不声音的情况。
  要实现音视频同步,一般需要选择一个参考时钟。参考时钟上的时间线性增加。在对音频和视频流进行编码时,每帧数据都会根据参考时钟上的时间打上时间戳。播放时,读取数据帧上的时间戳,参考当前参考时钟上的时间安排播放。这里提到的时间戳就是我们前面提到的PTS。在实践中,我们可以选择:同步视频到音频,同步音频到视频,同步音频和视频到外部时钟。
  视频编解码器概述软编码和硬编码的概念
  软编码:使用 CPU 进行编码。
  硬编码:不使用CPU进行编码,使用显卡GPU、专用DSP、FPGA、ASIC芯片等硬件进行编码。
  软编码和硬编码的比较
  软编码:实现直接简单,参数调整方便,升级容易,但CPU负载较重,性能比硬编码低,一般在低码率下质量比硬编码好。
  硬编码:性能高,一般在低码率下质量低于硬编码,但部分产品在GPU硬件平台上移植了优秀的软编码算法(如X264),质量与软编码基本相同。
  ios系统中的硬编码
  在 iOS 8.0 系统之前,苹果没有开放系统的硬件编解码功能,但 Mac OS 系统一直都有一个叫做 Video ToolBox 的框架来处理硬件编解码。最后,在 iOS 8.0 之后,Apple 将该框架引入了 iOS。系统。
  H264编码原理与I帧B帧P帧H264编码原理
  H264是新一代的编码标准。它以高压缩和高质量着称,支持各种网络的流媒体传输。在编码方面,我理解他的理论依据是:参考图像在一段时间内的统计结果,在相邻的几张图像中,通常不同的像素点只有10%以内,亮度差异确实变化不超过2%,色度差变化仅在1%以内。因此,对于变化不大的图像,我们可以先编码一个完整的图像帧A,后面的B帧不编码所有图像,而只写与A帧的差值,这样B帧的大小就只有整个框架的大小。1/10 或更少!如果B帧之后的C帧变化不大,我们可以通过参考B继续对C帧进行编码,依此类推。这个图像称为序列(序列是具有相同特征的一段数据)。当一个图像与前一个图像相比变化很大并且不能参考前一帧生成时,那么我们结束前一个序列并开始下一个序列。为这幅图像生成一个序列,即完整的帧A1,后面的图像参照A1生成,只写与A1的差异内容。
  H264 协议中定义了三种类型的帧。完整编码的帧称为I帧,参照前一帧产生的仅收录差异部分编码的帧称为P帧,还有参照前一帧编码的另一帧。调用 B 帧。
  H264使用的核心算法是帧内压缩和帧间压缩。帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。
  序列说明
  在 H264 中,图像以序列为单位进行组织。序列是由图像编码的数据流,从一个 I 帧开始,到下一个 I 帧结束。
  序列的第一个图像称为 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像。H.264 引入了用于解码重新同步的 IDR 图像。当解码器对IDR图像进行解码时,当参考帧队列即将被清空时,将所有解码数据输出或丢弃,重新搜索参数集开始新的序列。这样,如果前面的序列出现重大错误,这里就有机会重新同步。IDR图片之后的图片永远不会使用IDR之前图片的数据进行解码。
  
  序列是通过对内容差别不大的图像进行编码而生成的数据流。当运动变化相对较小时,序列可能会很长。由于运动变化很小,说明图像的内容变化很小,所以可以编译一个I帧,然后制作P帧和B帧。当运动变化较多时,一个序列可能比较短,例如收录一个I帧和三个或四个P帧。
  三种框架I框架介绍
  为了更好地理解I帧的概念,我列出两个解释:
  工字架特点:
  P 帧
  为了更好地理解P-frames的概念,我还列出了两个解释:
  **P-frame预测与重构:**P-frame以I-frame为参考帧,在I-frame中求P-frame“某一点”的预测值和运动向量,取预测差和运动矢量一起发送。在接收端,根据运动向量,从I帧中找到P帧的“某点”的预测值并加差,得到P帧的“某点”样本值,这样就可以得到完整的P帧。
  P帧特点:
  B 帧
  为了更好的理解P-frames的概念,我还是列出两个解释:
  **B帧的预测与重构:**B帧之前的I或P帧和B帧之后的P帧为参考帧,“找出”B帧“一个点”的预测值和两个运动向量,取预测差异和运动矢量传输。接收端根据运动矢量“找到(计算)”两个参考帧中的预测值,并与差值相加得到B帧的“点”样本值,从而得到完整的B帧。
  B帧的特点:
  I、B、P的每一帧都是根据压缩算法的需要人为定义的,都是真实的物理帧。一般来说,I帧的压缩比是7(和JPG差别很大),P帧是20,B帧可以达到50。可见使用B帧可以节省很多空间,节省的空间可以用于节省更多的I帧,在相同码率下可以提供更好的画质。
  压缩算法说明
  h264的压缩方式:
  分组:将几帧图像分成一个组(GOP,即一个序列)。为了防止运动变化,帧数不宜过多。定义帧:将每组中的每一帧图像定义为三种类型,即I帧、B帧和P帧;预测帧:以I帧为基帧,用I帧预测P帧,再用I帧和P帧预测B帧;数据传输:最后存储和传输I帧数据和预测的差异信息。
  帧内压缩也称为空间压缩。压缩一帧图像时,只考虑这一帧的数据,不考虑相邻帧之间的冗余信息,实际上类似于静态图像压缩。帧内通常使用有损压缩算法,因为帧内压缩是对完整的图像进行编码,因此可以独立解码和显示。帧内压缩通常不能达到很高的压缩率,并且非常接近于编码 jpeg。
  帧间压缩的原理是:相邻几帧的数据有很大的相关性,或者说是连续两帧的信息变化不大的特点。也就是说,连续视频在相邻帧之间具有冗余信息。根据该特征,压缩相邻帧之间的冗余可以进一步增加压缩量并降低压缩率。帧间压缩也称为时间压缩,通过在时间轴上比较不同帧之间的数据来压缩数据。帧间压缩通常是无损的。帧差分算法是一种典型的时间压缩方法。它比较本帧与相邻帧的差异,只记录本帧与其相邻帧的差异,可以大大减少数据量。.
  顺便说一下,有损(Lossy)压缩和无损(Lossy less)压缩。无损压缩是指压缩前和解压后的数据完全相同。大多数无损压缩使用 RLE 游程编码算法。有损压缩是指解压后的数据与压缩前的数据不一样。在压缩过程中,会丢失一些对人眼和耳朵不敏感的图像或音频信息,丢失的信息无法恢复。几乎所有的高压缩算法都使用有损压缩来达到低数据速率的目标。丢失的数据率与压缩率有关。压缩比越小,丢失的数据越多,解压效果通常越差。此外,
  三帧不一样,DTS和PTS不一样
  DTS主要用于视频解码,用于解码阶段。PTS主要用于视频同步和输出。它用于显示。在没有B帧的情况下,DTS和PTS的输出顺序是一样的。
  例子:
  下面是一个 GOP 为 15 的示例,解码后的参考帧及其解码顺序在其中:
  如上图: I帧的解码不依赖于任何其他帧。p帧的解码依赖于之前的I帧或P帧。B 帧的解码取决于最近的前一个 I 帧或 P 帧。帧和下一个最近的 P 帧。
  IOS系统H264视频硬件编解码说明
  我们知道,在IOS8系统之后,苹果将Mac OS中硬件编解码的VideoToolbox框架引入了IOS系统。
  根据苹果WWDC2014 513“直接访问媒体编解码”的描述,苹果之前提供的AVFoundation框架也是使用硬件对视频进行硬编码解码,但是编码后直接写入文件,之后直接显示解码。Video Toolbox框架可以获得编码后的帧结构和解码后的原创图像,因此在做一些视频图像处理方面具有更大的灵活性。
  视频工具箱简介
  在iOS中,有5个视频相关的接口,从顶层开始:AVKit - AVFoundation - VideoToolbox - Core Media - Core Video
  其中VideoToolbox可以将视频解压到CVPixelBuffer,也可以压缩到cmsampleBuffer。
  如果需要使用硬编码,在这5个接口中,需要用到AVKit、AVFoundation和VideoToolbox。这里我只介绍VideoToolbox。
  VideoToolbox 中的对象硬解码
  经过如图所示的典型应用,来说明如何使用硬件解码接口。应用场景是从网络传输H264编码的视频流,最后显示在手机屏幕上。
  要完成以上功能,需要经过以下步骤:
  
  将 H.264 流转换为 cmsampleBuffer 显示 cmsampleBuffer 将 H.264 流转换为 cmsampleBuffer
  我们知道 cmsampleBuffer = CMTime + FormatDesc + CMBlockBuffer 。需要从H264码流中提取以上三个信息。最后组合成cmsampleBuffer,提供给硬解码接口进行解码。
  在H.264的语法中,有一个最基本的层叫做网络抽象层,简称NAL。H.264流数据由一系列NAL单元(NAL Unit,简称NAUL)组成。
  H264的码流由NALU单元组成,一个NALU可能收录:
  NALU 标头
  对于流数据,NAUL header 通常以 0x00 00 01 或 0x00 00 00 01 开头(两者都有可能,下面以 0x00 00 01 为例)。0x00 00 01 称为起始码。
  总结以上知识,我们知道H264码流是由NALU单元组成的,其中收录视频图像数据和H264参数信息。视频图像数据为CMBlockBuffer,可以将H264的参数信息组合成FormatDesc。具体的,参数信息包括SPS(Sequence Parameter Set)和PPS(Picture Parameter Set)。下图是一个H.264码流的结构:
  1)提取sps和pps生成FormatDesc
  2)提取视频图像数据生成CMBlockBuffer
  3)根据需要生成CMTime信息。(实际测试中,添加时间信息后,出现了不稳定的图像,但不添加时间信息就没有了,需要进一步研究,这里建议不要添加时间信息)
  根据上述获取CMVideoFormatDescriptionRef、CMBlockBufferRef和可选的时间信息,使用cmsampleBufferCreate接口获取要解码的原创数据为cmsampleBuffer数据。下图为H264数据转换示意图。
  显示 cmsampleBuffer
  有两种显示方式:
  1)通过系统提供的AVSampleBufferDisplayLayer解码显示
  用法与其他CALayer类似。该层内置硬件解码功能,直接将原创cmsampleBuffer的解码图像显示在屏幕上,非常简单方便。
  2) 用 OPenGL 本身渲染
  通过VTDecompression接口,将cmsampleBuffer解码成图像,并在UIImageView或OpenGL上显示图像。
  硬编码
  硬编码的使用也通过一个典型的应用场景来描述。首先通过摄像头获取采集图像,然后对采集接收到的图像进行硬编码,最后将编码后的数据组合成H264码流通过网络传播.
  以下是具体步骤的说明:
  相机采集数据
  Camera采集,iOS系统为采集相机图像数据提供AVCaptureSession。设置会话的 采集 分辨率。然后设置输入和输出。设置输出时,需要设置委托和输出队列。在委托方法中,处理 采集 好的图像。
  图像输出的格式是未编码的 cmsampleBuffer 形式。
  使用 VTCompressionSession 硬编码
  1)初始化VTCompressionSession
  VTCompressionSession初始化时,通常需要给出width宽度、高度长度、编码器类型kCMVideoCodecType_H264等。然后通过调用VTSessionSetProperty接口设置帧率等属性,demo中提供了一些设置参考。测试时发现几乎没有效果,可能需要进一步调试。最后,需要设置一个回调函数。视频图像编码成功后调用该回调。一切准备就绪后,使用 VTCompressionSessionCreate 创建会话
  2)提取相机采集的原创图像数据到VTCompressionSession进行硬编码
  相机 采集 之后的图像是未编码的 cmsampleBuffer 形式。给定的接口函数 cmsampleBufferGetImageBuffer 用于从中提取 CVPixelBufferRef,硬编码接口 VTCompressionSessionEncodeFrame 用于对帧进行硬编码。,编码成功后,会自动调用会话初始化时设置的回调函数。
  3)使用回调函数将编码成功的cmsampleBuffer转化为H264流,并通过网络传播
  基本上是硬解码的逆过程。解析出参数集SPS和PPS,加上起始代码,组装成NALU。提取视频数据,将长度码转换为起始码,组长为NALU。将 NALU 发送出去。
  下一篇文章我们将介绍H264硬编码和软编码的实现。
  参考
  教程:帝国cms在首页调用指定几个栏目的所有文章和用js实现分页的方法
  先说明一下我的问题:我的博客有两个主题,技术和生活,四栏是技术,四栏是生活。我想在首页调用所有文章的技术类,实现分页。
  首先,让我们调用指定列的所有文章。我不需要 php。我在群友的提示下重新阅读了智能标签。我可以使用智能标签。我只需要在''中写上指定列的ids即可,可以一起使用,也可以分开使用,例如:
  
[e:loop={'1,12,13,16',10000,0,0}]
[/e:loop]
  让我们谈谈分页。一开始,我给青姐看我以前调用技术类所有文章的代码,问她如何实现分页。她告诉我这个调用无法实现分页,所以我只好使用自定义列表。她的文章:,但是我在操作过程中提交自定义列表后是空白的,无法查看原因,而且我的主页是动态主页,我还加了反采集和放入index.php 原来是phpcms站的动态链接改成了404的代码,那么我的网站使用中青姐的方法有缺陷。
  先说一下如何使用js实现分页,js在墨鱼博客中找到,原地址: ,但是用了我的网站后出现乱码,解决方法很简单,新建一个文本文档并把代码复制过来,然后另存为,选择UTF-8进行编码,然后新建一个js把代码复制回乱码问题就解决了。
  具体使用方法是在你原来的ul中加上id="list",并写样式display:none,然后在原来的ul下再加一个ul,类名id="list2",这个ul是用来移植的上面隐藏ul,在新添加的ul下调用js,这里我改成index-page.js,我把原文前面调用的js改成page-function.js,整体代码如下:
  这个时候前台打电话是没有问题的,但是你发现风格乱了。据说id="list2"的ul是用来移植id="list"的ul的内容,id="list"的ul也是隐藏的。然后将原创 ul 的类名添加到 id="list2" 的 ul 中。
  然后说样式,样式都在class="ctrlPages"的span里面,分页按钮在a标签里面,大家f12慢慢写样式,我提供我写的:
  
  
/*分页*/
span.ctrlPages {
display: block;
width: 90%;
text-align: center;
line-height: 2.0;
margin: auto;
margin-bottom: 15px;
}
span.ctrlPages a {
border: solid 1px #C6C4C4;
padding: 2px 5px 2px 5px;
color: #333;
}
<p>
span.ctrlPages a.curPage {
background-color: #FD9D01;
padding: 3px 5px 3px 5px;
color: #fff;
border: none;
}</p>
  效果如下:
  我觉得当前页和页码提示没什么用,所以我把page-function.js中的相关代码删掉了,这个js中也修改了小样式。以下是修改后的效果
  我的js下载
  dgcms-index-page.rar
  02385c9a4d92a50047ade72c4ff49889.rar(1.44 KB)
  2019年9月29日补充:js实现分页存在缺陷,即一次加载所有列表信息。您可以通过查看源代码来了解这一点。如果您的主页没有使用缓存技术,建议加载或使用自定义您的列表。 查看全部

  解决方案:视频的基本参数及H264编解码相关概念
  DTS时间戳决定SCR时间等于DTS时间时解码器何时解码,与PTS时间戳类似。通常,DTS/PTS 时间戳表示比音频-视频数据包中的 SCR 晚的时间。例如,如果一个视频包的SCR为100ms(意味着播放100ms后从磁盘读取包),那么DTS/PTS值很少是200/280ms,也就是说当SCR达到200ms时,视频is 数据应该在 80ms 后解码并显示(视频数据保存在缓冲区中,直到解码开始)。当与视频流相关的复用率设置得太高时,通常会发生下溢。如果mux rate是1000000bits/sec(意味着解码器必须以1000000bits/sec读取文件),但视频速率是2000000bits/sec(意味着视频数据需要以2000000bits/sec显示),从磁盘读取 获取视频数据的速度不够快,无法在 1 秒内读取足够的视频数据。在这种情况下,DTS/PTS 时间戳表示视频在从硬盘读取之前已被解码或显示(DTS/PTS 时间戳将早于收录它们的数据包中的 SCR 时间)。
  现在依靠解码器,这基本上不是问题(尽管 MPEG 文件不完全符合 MPEG 标准,因为它们不应该有下溢)。一些编解码器(许多著名的基于 PC 的播放器)尽可能快地读取文件以显示视频,如果可能的话忽略 SCR。
  请注意,在您提供的列表中,平均视频流传输速率约为 3Mbps(3000000 位/秒),但峰值为 14Mbps(非常大,DVD 限制为 9.8Mbps)。这意味着需要将复用速率调整得足够大以处理 14Mbps 部分,而 bbMPEG 计算的复用速率有时太低而不会导致下溢。您是否打算使视频流率如此之高?这超出了 DVD 的规格,并且很可能不会在大多数独立设备中播放。如果您不这样计划,我会将 mquant 值从 1 增加,并在视频设置中将最大比特率设置为 9Mbps,以保持比特率更小。
  如果你真的想要视频比特率那么高,你需要增加复用率。从提供的列表中可以得出结论,bbMPEG 使用 06800bits/sec 或 1838350bytes/sec 的复用速率(总数据速率:1838350bytes/sec (06800bits/sec) 行)。您在 force mux rate 字段中设置的值应该以字节/秒为单位,并且可以被 50 整除。所以我将从 36767 (1838350/50) 开始并继续增长,直到不再有下溢错误;
  比特率(比特率) 关于比特率
  由于保存完整逐帧图片的原创视频文件太大,需要通过视频压缩算法对视频中的图片进行压缩,以减小视频文件的大小。视频的失真会越严重,因为视频中原创图像的数据信息在压缩过程中不可避免地会丢失。在了解这一点的前提下,我举个例子,将一个分辨率为1080P的原创视频(未压缩)压缩成两个分别为4GB和1GB的视频文件。因为1GB的视频压缩比更高,很明显看1GB的视频不如4GB的视频清晰(虽然它们的分辨率都是1080P)。
  比特率,也称为比特率,是指在压缩视频时为视频指定一个参数,以告诉压缩软件预期压缩视频的大小。比特率的英文名称是bps(bit per second),它是衡量一个视频大小的平均每秒比特数。
  计算视频的比特率
  我们可以根据视频的长度和大小来推断视频的比特率。下面是一个具体的例子。
  一个 1080P 的视频长 100 分钟,大小为 1GB,视频的比特率是多少?
  100min = 100*60s = 6000s;
1G = 1024M = 1024*1024KB = 1024*1024*1024Bit = 1024*1024*1024*8bit = 8589934592bit;
比特率 = 8589934592/6000s = 1431655b/s = 1.4Mbit/s;
复制代码
  那么这个视频的码率大约是1.4Mbit/s。这个比特率在在线视频中已经很高了。通常主流视频平台的最高码率在1Mbit左右,比如直播网站斗鱼。高清选项播放的实际视频码率为 900Kbit/s (0.9Mbit)。
  我们可以得出结论,对于相同时长的视频,码率越大,视频尺寸越大,视频质量越清晰(不管各种压缩算法的优劣),这是最直观的感受. 比特率对于视频来说非常重要。
  音视频同步
  上面提到的概念与视频帧、DTS 和 PTS 有关。我们都知道,在一个媒体流中,除了视频之外,一般还包括音频。音频播放也有DTS和PTS的概念,但是音频没有类似视频的B帧,不需要双向预测,所以音频帧的DTS和PTS顺序是一致的。
  将音视频混合在一起播放,呈现出我们经常看到的广义视频。当音视频一起播放时,我们一般需要面对一个问题:如何同步,避免出现画面不声音的情况。
  要实现音视频同步,一般需要选择一个参考时钟。参考时钟上的时间线性增加。在对音频和视频流进行编码时,每帧数据都会根据参考时钟上的时间打上时间戳。播放时,读取数据帧上的时间戳,参考当前参考时钟上的时间安排播放。这里提到的时间戳就是我们前面提到的PTS。在实践中,我们可以选择:同步视频到音频,同步音频到视频,同步音频和视频到外部时钟。
  视频编解码器概述软编码和硬编码的概念
  软编码:使用 CPU 进行编码。
  硬编码:不使用CPU进行编码,使用显卡GPU、专用DSP、FPGA、ASIC芯片等硬件进行编码。
  软编码和硬编码的比较
  软编码:实现直接简单,参数调整方便,升级容易,但CPU负载较重,性能比硬编码低,一般在低码率下质量比硬编码好。
  硬编码:性能高,一般在低码率下质量低于硬编码,但部分产品在GPU硬件平台上移植了优秀的软编码算法(如X264),质量与软编码基本相同。
  ios系统中的硬编码
  在 iOS 8.0 系统之前,苹果没有开放系统的硬件编解码功能,但 Mac OS 系统一直都有一个叫做 Video ToolBox 的框架来处理硬件编解码。最后,在 iOS 8.0 之后,Apple 将该框架引入了 iOS。系统。
  H264编码原理与I帧B帧P帧H264编码原理
  H264是新一代的编码标准。它以高压缩和高质量着称,支持各种网络的流媒体传输。在编码方面,我理解他的理论依据是:参考图像在一段时间内的统计结果,在相邻的几张图像中,通常不同的像素点只有10%以内,亮度差异确实变化不超过2%,色度差变化仅在1%以内。因此,对于变化不大的图像,我们可以先编码一个完整的图像帧A,后面的B帧不编码所有图像,而只写与A帧的差值,这样B帧的大小就只有整个框架的大小。1/10 或更少!如果B帧之后的C帧变化不大,我们可以通过参考B继续对C帧进行编码,依此类推。这个图像称为序列(序列是具有相同特征的一段数据)。当一个图像与前一个图像相比变化很大并且不能参考前一帧生成时,那么我们结束前一个序列并开始下一个序列。为这幅图像生成一个序列,即完整的帧A1,后面的图像参照A1生成,只写与A1的差异内容。
  H264 协议中定义了三种类型的帧。完整编码的帧称为I帧,参照前一帧产生的仅收录差异部分编码的帧称为P帧,还有参照前一帧编码的另一帧。调用 B 帧。
  H264使用的核心算法是帧内压缩和帧间压缩。帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。
  序列说明
  在 H264 中,图像以序列为单位进行组织。序列是由图像编码的数据流,从一个 I 帧开始,到下一个 I 帧结束。
  序列的第一个图像称为 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像。H.264 引入了用于解码重新同步的 IDR 图像。当解码器对IDR图像进行解码时,当参考帧队列即将被清空时,将所有解码数据输出或丢弃,重新搜索参数集开始新的序列。这样,如果前面的序列出现重大错误,这里就有机会重新同步。IDR图片之后的图片永远不会使用IDR之前图片的数据进行解码。
  
  序列是通过对内容差别不大的图像进行编码而生成的数据流。当运动变化相对较小时,序列可能会很长。由于运动变化很小,说明图像的内容变化很小,所以可以编译一个I帧,然后制作P帧和B帧。当运动变化较多时,一个序列可能比较短,例如收录一个I帧和三个或四个P帧。
  三种框架I框架介绍
  为了更好地理解I帧的概念,我列出两个解释:
  工字架特点:
  P 帧
  为了更好地理解P-frames的概念,我还列出了两个解释:
  **P-frame预测与重构:**P-frame以I-frame为参考帧,在I-frame中求P-frame“某一点”的预测值和运动向量,取预测差和运动矢量一起发送。在接收端,根据运动向量,从I帧中找到P帧的“某点”的预测值并加差,得到P帧的“某点”样本值,这样就可以得到完整的P帧。
  P帧特点:
  B 帧
  为了更好的理解P-frames的概念,我还是列出两个解释:
  **B帧的预测与重构:**B帧之前的I或P帧和B帧之后的P帧为参考帧,“找出”B帧“一个点”的预测值和两个运动向量,取预测差异和运动矢量传输。接收端根据运动矢量“找到(计算)”两个参考帧中的预测值,并与差值相加得到B帧的“点”样本值,从而得到完整的B帧。
  B帧的特点:
  I、B、P的每一帧都是根据压缩算法的需要人为定义的,都是真实的物理帧。一般来说,I帧的压缩比是7(和JPG差别很大),P帧是20,B帧可以达到50。可见使用B帧可以节省很多空间,节省的空间可以用于节省更多的I帧,在相同码率下可以提供更好的画质。
  压缩算法说明
  h264的压缩方式:
  分组:将几帧图像分成一个组(GOP,即一个序列)。为了防止运动变化,帧数不宜过多。定义帧:将每组中的每一帧图像定义为三种类型,即I帧、B帧和P帧;预测帧:以I帧为基帧,用I帧预测P帧,再用I帧和P帧预测B帧;数据传输:最后存储和传输I帧数据和预测的差异信息。
  帧内压缩也称为空间压缩。压缩一帧图像时,只考虑这一帧的数据,不考虑相邻帧之间的冗余信息,实际上类似于静态图像压缩。帧内通常使用有损压缩算法,因为帧内压缩是对完整的图像进行编码,因此可以独立解码和显示。帧内压缩通常不能达到很高的压缩率,并且非常接近于编码 jpeg。
  帧间压缩的原理是:相邻几帧的数据有很大的相关性,或者说是连续两帧的信息变化不大的特点。也就是说,连续视频在相邻帧之间具有冗余信息。根据该特征,压缩相邻帧之间的冗余可以进一步增加压缩量并降低压缩率。帧间压缩也称为时间压缩,通过在时间轴上比较不同帧之间的数据来压缩数据。帧间压缩通常是无损的。帧差分算法是一种典型的时间压缩方法。它比较本帧与相邻帧的差异,只记录本帧与其相邻帧的差异,可以大大减少数据量。.
  顺便说一下,有损(Lossy)压缩和无损(Lossy less)压缩。无损压缩是指压缩前和解压后的数据完全相同。大多数无损压缩使用 RLE 游程编码算法。有损压缩是指解压后的数据与压缩前的数据不一样。在压缩过程中,会丢失一些对人眼和耳朵不敏感的图像或音频信息,丢失的信息无法恢复。几乎所有的高压缩算法都使用有损压缩来达到低数据速率的目标。丢失的数据率与压缩率有关。压缩比越小,丢失的数据越多,解压效果通常越差。此外,
  三帧不一样,DTS和PTS不一样
  DTS主要用于视频解码,用于解码阶段。PTS主要用于视频同步和输出。它用于显示。在没有B帧的情况下,DTS和PTS的输出顺序是一样的。
  例子:
  下面是一个 GOP 为 15 的示例,解码后的参考帧及其解码顺序在其中:
  如上图: I帧的解码不依赖于任何其他帧。p帧的解码依赖于之前的I帧或P帧。B 帧的解码取决于最近的前一个 I 帧或 P 帧。帧和下一个最近的 P 帧。
  IOS系统H264视频硬件编解码说明
  我们知道,在IOS8系统之后,苹果将Mac OS中硬件编解码的VideoToolbox框架引入了IOS系统。
  根据苹果WWDC2014 513“直接访问媒体编解码”的描述,苹果之前提供的AVFoundation框架也是使用硬件对视频进行硬编码解码,但是编码后直接写入文件,之后直接显示解码。Video Toolbox框架可以获得编码后的帧结构和解码后的原创图像,因此在做一些视频图像处理方面具有更大的灵活性。
  视频工具箱简介
  在iOS中,有5个视频相关的接口,从顶层开始:AVKit - AVFoundation - VideoToolbox - Core Media - Core Video
  其中VideoToolbox可以将视频解压到CVPixelBuffer,也可以压缩到cmsampleBuffer。
  如果需要使用硬编码,在这5个接口中,需要用到AVKit、AVFoundation和VideoToolbox。这里我只介绍VideoToolbox。
  VideoToolbox 中的对象硬解码
  经过如图所示的典型应用,来说明如何使用硬件解码接口。应用场景是从网络传输H264编码的视频流,最后显示在手机屏幕上。
  要完成以上功能,需要经过以下步骤:
  
  将 H.264 流转换为 cmsampleBuffer 显示 cmsampleBuffer 将 H.264 流转换为 cmsampleBuffer
  我们知道 cmsampleBuffer = CMTime + FormatDesc + CMBlockBuffer 。需要从H264码流中提取以上三个信息。最后组合成cmsampleBuffer,提供给硬解码接口进行解码。
  在H.264的语法中,有一个最基本的层叫做网络抽象层,简称NAL。H.264流数据由一系列NAL单元(NAL Unit,简称NAUL)组成。
  H264的码流由NALU单元组成,一个NALU可能收录:
  NALU 标头
  对于流数据,NAUL header 通常以 0x00 00 01 或 0x00 00 00 01 开头(两者都有可能,下面以 0x00 00 01 为例)。0x00 00 01 称为起始码。
  总结以上知识,我们知道H264码流是由NALU单元组成的,其中收录视频图像数据和H264参数信息。视频图像数据为CMBlockBuffer,可以将H264的参数信息组合成FormatDesc。具体的,参数信息包括SPS(Sequence Parameter Set)和PPS(Picture Parameter Set)。下图是一个H.264码流的结构:
  1)提取sps和pps生成FormatDesc
  2)提取视频图像数据生成CMBlockBuffer
  3)根据需要生成CMTime信息。(实际测试中,添加时间信息后,出现了不稳定的图像,但不添加时间信息就没有了,需要进一步研究,这里建议不要添加时间信息)
  根据上述获取CMVideoFormatDescriptionRef、CMBlockBufferRef和可选的时间信息,使用cmsampleBufferCreate接口获取要解码的原创数据为cmsampleBuffer数据。下图为H264数据转换示意图。
  显示 cmsampleBuffer
  有两种显示方式:
  1)通过系统提供的AVSampleBufferDisplayLayer解码显示
  用法与其他CALayer类似。该层内置硬件解码功能,直接将原创cmsampleBuffer的解码图像显示在屏幕上,非常简单方便。
  2) 用 OPenGL 本身渲染
  通过VTDecompression接口,将cmsampleBuffer解码成图像,并在UIImageView或OpenGL上显示图像。
  硬编码
  硬编码的使用也通过一个典型的应用场景来描述。首先通过摄像头获取采集图像,然后对采集接收到的图像进行硬编码,最后将编码后的数据组合成H264码流通过网络传播.
  以下是具体步骤的说明:
  相机采集数据
  Camera采集,iOS系统为采集相机图像数据提供AVCaptureSession。设置会话的 采集 分辨率。然后设置输入和输出。设置输出时,需要设置委托和输出队列。在委托方法中,处理 采集 好的图像。
  图像输出的格式是未编码的 cmsampleBuffer 形式。
  使用 VTCompressionSession 硬编码
  1)初始化VTCompressionSession
  VTCompressionSession初始化时,通常需要给出width宽度、高度长度、编码器类型kCMVideoCodecType_H264等。然后通过调用VTSessionSetProperty接口设置帧率等属性,demo中提供了一些设置参考。测试时发现几乎没有效果,可能需要进一步调试。最后,需要设置一个回调函数。视频图像编码成功后调用该回调。一切准备就绪后,使用 VTCompressionSessionCreate 创建会话
  2)提取相机采集的原创图像数据到VTCompressionSession进行硬编码
  相机 采集 之后的图像是未编码的 cmsampleBuffer 形式。给定的接口函数 cmsampleBufferGetImageBuffer 用于从中提取 CVPixelBufferRef,硬编码接口 VTCompressionSessionEncodeFrame 用于对帧进行硬编码。,编码成功后,会自动调用会话初始化时设置的回调函数。
  3)使用回调函数将编码成功的cmsampleBuffer转化为H264流,并通过网络传播
  基本上是硬解码的逆过程。解析出参数集SPS和PPS,加上起始代码,组装成NALU。提取视频数据,将长度码转换为起始码,组长为NALU。将 NALU 发送出去。
  下一篇文章我们将介绍H264硬编码和软编码的实现。
  参考
  教程:帝国cms在首页调用指定几个栏目的所有文章和用js实现分页的方法
  先说明一下我的问题:我的博客有两个主题,技术和生活,四栏是技术,四栏是生活。我想在首页调用所有文章的技术类,实现分页。
  首先,让我们调用指定列的所有文章。我不需要 php。我在群友的提示下重新阅读了智能标签。我可以使用智能标签。我只需要在''中写上指定列的ids即可,可以一起使用,也可以分开使用,例如:
  
[e:loop={'1,12,13,16',10000,0,0}]
[/e:loop]
  让我们谈谈分页。一开始,我给青姐看我以前调用技术类所有文章的代码,问她如何实现分页。她告诉我这个调用无法实现分页,所以我只好使用自定义列表。她的文章:,但是我在操作过程中提交自定义列表后是空白的,无法查看原因,而且我的主页是动态主页,我还加了反采集和放入index.php 原来是phpcms站的动态链接改成了404的代码,那么我的网站使用中青姐的方法有缺陷。
  先说一下如何使用js实现分页,js在墨鱼博客中找到,原地址: ,但是用了我的网站后出现乱码,解决方法很简单,新建一个文本文档并把代码复制过来,然后另存为,选择UTF-8进行编码,然后新建一个js把代码复制回乱码问题就解决了。
  具体使用方法是在你原来的ul中加上id="list",并写样式display:none,然后在原来的ul下再加一个ul,类名id="list2",这个ul是用来移植的上面隐藏ul,在新添加的ul下调用js,这里我改成index-page.js,我把原文前面调用的js改成page-function.js,整体代码如下:
  这个时候前台打电话是没有问题的,但是你发现风格乱了。据说id="list2"的ul是用来移植id="list"的ul的内容,id="list"的ul也是隐藏的。然后将原创 ul 的类名添加到 id="list2" 的 ul 中。
  然后说样式,样式都在class="ctrlPages"的span里面,分页按钮在a标签里面,大家f12慢慢写样式,我提供我写的:
  
  
/*分页*/
span.ctrlPages {
display: block;
width: 90%;
text-align: center;
line-height: 2.0;
margin: auto;
margin-bottom: 15px;
}
span.ctrlPages a {
border: solid 1px #C6C4C4;
padding: 2px 5px 2px 5px;
color: #333;
}
<p>
span.ctrlPages a.curPage {
background-color: #FD9D01;
padding: 3px 5px 3px 5px;
color: #fff;
border: none;
}</p>
  效果如下:
  我觉得当前页和页码提示没什么用,所以我把page-function.js中的相关代码删掉了,这个js中也修改了小样式。以下是修改后的效果
  我的js下载
  dgcms-index-page.rar
  02385c9a4d92a50047ade72c4ff49889.rar(1.44 KB)
  2019年9月29日补充:js实现分页存在缺陷,即一次加载所有列表信息。您可以通过查看源代码来了解这一点。如果您的主页没有使用缓存技术,建议加载或使用自定义您的列表。

技巧:用selenium+sqlmap套个轮子,我是按时间采的

采集交流优采云 发表了文章 • 0 个评论 • 50 次浏览 • 2022-11-10 14:23 • 来自相关话题

  技巧:用selenium+sqlmap套个轮子,我是按时间采的
  算法自动采集列表页,按时间采集内容。生成字段内容提取器,依次翻页回采。翻页消耗的空间和成本不小。有简易方案,但没有考虑性能,已废弃。自然用户点击才是反作弊的依据,
  这个算不算广告联盟?
  我们使用adobeflashserver的scriptapi封装了一个php,登录以后能检查url带的参数的相关性。
  htmlcookie和抓包
  网络广告识别。这个广告其实是cookie,跟硬件关系不大。不过既然要用php来检查,
  
  1,点击发起端向采集端发送数据包,数据包再被发送,将数据反回去2,检查发起的人是否是真的访问者,
  想采集但是程序不会的大可以找我我可以免费给你开发实现专业客户端采集php也行不只一种采集软件目前多款批量采集软件在线开发帮助有需要也可以私信我。
  用selenium+sqlmap套个轮子,
  我是按时间采的,
  我们现在也在测试用php采集。
  
  百度一下
  fast_request?greater?
  跟楼上一样,不过我是按时间采的,
  不仅是按时间还有按ip的。
  用不同时间的点击率来对比和分析
  我们也在用php,可以自己开发爬虫,做一个scrapy的爬虫,自动采集。另外可以使用到不同的算法,比如按url长度的。 查看全部

  技巧:用selenium+sqlmap套个轮子,我是按时间采的
  算法自动采集列表页,按时间采集内容。生成字段内容提取器,依次翻页回采。翻页消耗的空间和成本不小。有简易方案,但没有考虑性能,已废弃。自然用户点击才是反作弊的依据,
  这个算不算广告联盟?
  我们使用adobeflashserver的scriptapi封装了一个php,登录以后能检查url带的参数的相关性。
  htmlcookie和抓包
  网络广告识别。这个广告其实是cookie,跟硬件关系不大。不过既然要用php来检查,
  
  1,点击发起端向采集端发送数据包,数据包再被发送,将数据反回去2,检查发起的人是否是真的访问者,
  想采集但是程序不会的大可以找我我可以免费给你开发实现专业客户端采集php也行不只一种采集软件目前多款批量采集软件在线开发帮助有需要也可以私信我。
  用selenium+sqlmap套个轮子,
  我是按时间采的,
  我们现在也在测试用php采集。
  
  百度一下
  fast_request?greater?
  跟楼上一样,不过我是按时间采的,
  不仅是按时间还有按ip的。
  用不同时间的点击率来对比和分析
  我们也在用php,可以自己开发爬虫,做一个scrapy的爬虫,自动采集。另外可以使用到不同的算法,比如按url长度的。

总结:收藏 | 机器学习数据集汇总收集

采集交流优采云 发表了文章 • 0 个评论 • 160 次浏览 • 2022-11-08 16:34 • 来自相关话题

  总结:收藏 | 机器学习数据集汇总收集
  转载于:机器学习算法与 Python 实战
  大学公共数据集
  (斯坦福)69G 大型无人机(校园)图像数据集【斯坦福】
  人脸素描数据集 [中大]
  自然语言推理(文本蕴涵标签)数据集 [NYU]
  伯克利图像分割数据集 BSDS500 [伯克利]
  宠物图像(分割)数据集 [牛津]
  ~vgg/数据/宠物/
  发布ADE20K场景感知/解析/分割/多目标识别数据集[MIT]
  多模式二元行为数据集 [GaTech]
  计算机视觉/图像/视频数据集
  Fashion-MNIST风格服装图像数据集【小涵】
  大型(500,000)LOGO数据集
  4D 扫描(60fps 移动非刚性物体 3D 扫描)数据集 [D-FAUST]
  Counting MNIST,基于 MNIST 的视觉计数合成数据集
  YouTube MV 视频数据集 [Keunwoo Choi]
  大量计算机视觉合成数据集/工具 [unrealcv]
  动物属性标签数据集 [ChristophH. Lampert/Daniel Pucher/JohannesDostal]
  漫画数据集 Manga109
  架空舞蹈视频数据集
  Pixiv(着色)图像数据集 [Jerry Li]
  e-VDS 视频数据集
  #下载
  快,画!简单的笔画涂鸦数据集
  简单的笔画涂鸦数据集[hardmaru]
  Clothing Portrait Generation Model (&amp;Chictopia10K [HumanParsing] Fashion Portrait Analysis Dataset) [Christoph Lassner/Gerard Pons-Moll/Peter V. Gehler]
  COCO 像素级标注数据集
  大规模街道级图像(分割)数据集 [Peter Kontschieder]
  大规模日本图像描述数据集
  Cityscapes 街景语义分割数据集(50 个城市,30 个类别,5k 精细标签,20k 厚标签图像和带标签的视频)
  (街头)时尚服装数据集(2000 多张带注释的图像)
  PyTorch [BodoKaiser] 实现的 VOC2012 数据集的逐像素目标分割
  200 亿个神经元对象复杂运动和交互视频数据集 [Nikita Johnson]
  
  文本/评估/问答/自然语言数据集
  (200,000) 个英语笑话数据集 [TaivoPungas]
  机器学习保险行业问答开放数据集 [HainWang]
  保险业问答 (QA) 数据集 [Minwei Feng]
  斯坦福 NLP 发布新的多轮、跨领域、面向任务的对话数据集 [Mihail Eric]
  实体/名词语义关系标签数据集 [David S. Batista]
  NLVR:自然语言基础数据集(对象分组、数量、比较和空间关系推理)
  28,000文章/100,000题大规模(英语测试)阅读理解数据集
  拼写错误的数据集
  〜罗杰/corpora.html
  文本缩减数据集
  ~dkauchak/简化/
  英文单词/句子/语义框架标注数据集FrameNet
  (另一个) 自然语言处理 (NLP) 数据集列表 [Nicolas Iderhoff]
  用于跨语言/多样式/多粒度文本相似性检测的数据集
  Quora 数据集:400,000 行潜在的重复问题
  文本分类数据集
  框架:Maluuba 对话数据集
  跨域(亚马逊产品评论)情感数据集
  ~mdredze/数据集/sentiment/
  语义 Web 机器学习系统评估/基准数据集采集
  其他数据集
  数据科学/机器学习数据集摘要
  CORe50:连续对象识别数据集 [Vincenzo Lomonaco &amp; Davide Maltoni]
  (Matlab) 自动发现数据集的统计分布 [Isabel Valera]
  (建筑)损害评估数据集 [海啸]
  IndieWeb 社交图数据集 [IndieWeb]
  DeepMind 开源环境/数据集/代码合集【DeepMind】
  鸟叫数据集 [xeno-canto]
  Wolfram 数据集存储库
  大规模音乐分析数据集 FMA
  (300 万) Instacart 在线杂货购物数据集 [Jeremy Stanley]
  用于欺诈检测的合成金融数据集 [TESTIMON]
  NSynth:一个大规模的高质量音符标记音频数据集
  
  LIBSVM 格式分类/回归/多标签/字符串数据集
  ~cjlin/libsvmtools/datasets/binary.html
  笔记本电脑使用逻辑回归拟合 100G 数据集 [DmitriySelivanov]
  StackExchange 近似/重复问题数据集
  2010-2017最全的KDD CUP试题及数据集
  食谱数据集:超过 20,000 个带有评级、营养和类别信息的食谱 [HugoDarwood]
  奥斯卡数据集【电影艺术与科学学院】
  计算医学库:大型医学数据集的 (TensorFlow) 分析和机器学习建模 [AkshayBhat]
  聚类数据集
  官方开放气候数据集
  全球恐怖袭击数据集【START联盟】
  七个机器学习时间序列数据集
  大规模众包关系数据库自然语言查询语义解析数据集(80,000+查询样本)
  赛马赔率数据集
  新的 YELP 数据集:收录 470 万条评论和 156,000 个商家
  JMIR 数据集特刊“JMIR 数据”
  日本木刻版画文字识别数据集
  多模式二元行为数据集
  机器学习论文/数据集/工具集(日语)
  机器学习公司的十大数据采集策略
  NLP 数据集加载工具集
  日语相似词数据集
  大规模以人为本的完形填空(多项选择阅读理解)数据集
  高质量免费数据集列表
  “数据之美”自然语言数据集/代码
  微软数据集MS MARCO,阅读理解领域的“ImageNet”
  AI2科学问答数据集(多选)
  常用图像数据集
  (分类、跟踪、分割、检测等)
  搜狗实验室数据集:
  互联网图片库来自搜狗图片搜索索引的部分数据。共有 2,836,535 张图片,类别包括人物、动物、建筑、机械、风景和运动。对于每张图片,原创图片、缩略图、图片所在的网页以及网页中的相关文本都在数据集中给出。超过200G
  IMAGECLEF 致力于为图像相关领域(检索、分类、注释等)提供基准跨语言评估论坛(CLEF)。该比赛自2003年起每年举办一次。
  ~xirong/index.php?n=Main.Dataset
  专业知识:seo专家:八个工具助您的外贸网站快速排名
  八款工具助你外贸网站快速排名
  做外贸网站,没有好的SEO策划,很难在激烈的竞争中脱颖而出。一个好的网站SEO需要分析网站本身,什么是外贸,以及竞争对手的网站。SEO分析对于外贸新手网站或者SEO不好的网站尤为重要。本文精选了 8 个 SEO 工具,可以帮助您发现 SEO网站 的问题。同时还可以分析竞争对手的关键词选型、链式、链式设计,然后用在自己的外贸网站中,推广SEO的隐藏东西。
  1. SEMrush
  SEMrush 可以称为一个综合性的 SEO 工具,SEO 初学者和专家都可以通过 SEMrush 流程获得帮助。什么是外贸,从竞争对手分析和展示到关键词研究、广告策略分析、逆向检查、关键词难度、品牌展示等。你甚至可以用它来发现新的竞争对手,观察行业变化帮助您连接和领导的领域。
  SEMrush 从 Google 和 Bing 中提取大量 SEO 数据,让您能够以难以置信的细节探索 关键词。什么是外贸,以便捷的方式提供所有这些数据,并进行全面的现场审核和持续跟踪。如果您只为您的专业博客业务使用一种工具,那么设置 SEMrush 是一个不错的选择。
  2. 最佳搜索引擎优化
  
  Yoast SEO 是一个 WordPress SEO 插件。这是市场上最好的 SEO 插件之一。从主页面到文章页面,从存档页面到标签页,都提供了详细的设置。可以说,Yoast SEO对SEO设计的每一页的规划都是很小的。如可读性分析、关键词、meta关键词、关键词网页内容结构、图片分析、内外链接分析、标题和描述分析、链接地址分析等。
  Yoast SEO 可能是您可以用来改善博客 SEO 的最佳整体工具。
  3.Moz工具
  Moz 工具可用于链接构建和分析、Web 功能、关键词sink 研究、网站 拥抱、列表查看等。什么是外贸是互联网上最大最准确的SEO关键词数据库之一。在几秒钟内,专业博主可以使用它在 网站 上找到 关键词 并确定其优先级。没有用于分析或统计过滤的复杂图表,SEO 建议简单直观。
  Moz 提供了许多可供博主用来推广 SEO 的工具。这个大扇区是免费的,几乎没有限制。
  4. BuzzSumo
  
  BuzzSumo 是一个智能工具。哪些外贸可以帮助您进一步提高您的SEO工作。BuzzSumo 无需绞尽脑汁根据关键词汇寻找可操作的主题,而是让您在社交媒体上找到高度共享的内容并围绕该内容定制您的工作。
  在快速搜索中,您可以在 Facebook、Twitter、Pinterest、Reddit 上查看 关键词,包括订阅、反向链接、总份额。
  5. 隔壁
  强大的 SEO 集成,从 关键词 研究到链接分析,无所不能。Serpstat 提供范围广泛的 SEO 工具,几乎每个人都会在城市中找到方便的工具,包括长尾 关键词 研究、每次点击成本分析、PPC 竞争洞察、搜索量分析。
  因此,您可以使用 Serpstat 做的最有用的事情是对您的站点进行全面审核。什么是外贸,包括反向链接和 Serpstat 本身,是完全自动的。
  天蜘蛛网专注于SEO培训,大量学员受益。 查看全部

  总结:收藏 | 机器学习数据集汇总收集
  转载于:机器学习算法与 Python 实战
  大学公共数据集
  (斯坦福)69G 大型无人机(校园)图像数据集【斯坦福】
  人脸素描数据集 [中大]
  自然语言推理(文本蕴涵标签)数据集 [NYU]
  伯克利图像分割数据集 BSDS500 [伯克利]
  宠物图像(分割)数据集 [牛津]
  ~vgg/数据/宠物/
  发布ADE20K场景感知/解析/分割/多目标识别数据集[MIT]
  多模式二元行为数据集 [GaTech]
  计算机视觉/图像/视频数据集
  Fashion-MNIST风格服装图像数据集【小涵】
  大型(500,000)LOGO数据集
  4D 扫描(60fps 移动非刚性物体 3D 扫描)数据集 [D-FAUST]
  Counting MNIST,基于 MNIST 的视觉计数合成数据集
  YouTube MV 视频数据集 [Keunwoo Choi]
  大量计算机视觉合成数据集/工具 [unrealcv]
  动物属性标签数据集 [ChristophH. Lampert/Daniel Pucher/JohannesDostal]
  漫画数据集 Manga109
  架空舞蹈视频数据集
  Pixiv(着色)图像数据集 [Jerry Li]
  e-VDS 视频数据集
  #下载
  快,画!简单的笔画涂鸦数据集
  简单的笔画涂鸦数据集[hardmaru]
  Clothing Portrait Generation Model (&amp;Chictopia10K [HumanParsing] Fashion Portrait Analysis Dataset) [Christoph Lassner/Gerard Pons-Moll/Peter V. Gehler]
  COCO 像素级标注数据集
  大规模街道级图像(分割)数据集 [Peter Kontschieder]
  大规模日本图像描述数据集
  Cityscapes 街景语义分割数据集(50 个城市,30 个类别,5k 精细标签,20k 厚标签图像和带标签的视频)
  (街头)时尚服装数据集(2000 多张带注释的图像)
  PyTorch [BodoKaiser] 实现的 VOC2012 数据集的逐像素目标分割
  200 亿个神经元对象复杂运动和交互视频数据集 [Nikita Johnson]
  
  文本/评估/问答/自然语言数据集
  (200,000) 个英语笑话数据集 [TaivoPungas]
  机器学习保险行业问答开放数据集 [HainWang]
  保险业问答 (QA) 数据集 [Minwei Feng]
  斯坦福 NLP 发布新的多轮、跨领域、面向任务的对话数据集 [Mihail Eric]
  实体/名词语义关系标签数据集 [David S. Batista]
  NLVR:自然语言基础数据集(对象分组、数量、比较和空间关系推理)
  28,000文章/100,000题大规模(英语测试)阅读理解数据集
  拼写错误的数据集
  〜罗杰/corpora.html
  文本缩减数据集
  ~dkauchak/简化/
  英文单词/句子/语义框架标注数据集FrameNet
  (另一个) 自然语言处理 (NLP) 数据集列表 [Nicolas Iderhoff]
  用于跨语言/多样式/多粒度文本相似性检测的数据集
  Quora 数据集:400,000 行潜在的重复问题
  文本分类数据集
  框架:Maluuba 对话数据集
  跨域(亚马逊产品评论)情感数据集
  ~mdredze/数据集/sentiment/
  语义 Web 机器学习系统评估/基准数据集采集
  其他数据集
  数据科学/机器学习数据集摘要
  CORe50:连续对象识别数据集 [Vincenzo Lomonaco &amp; Davide Maltoni]
  (Matlab) 自动发现数据集的统计分布 [Isabel Valera]
  (建筑)损害评估数据集 [海啸]
  IndieWeb 社交图数据集 [IndieWeb]
  DeepMind 开源环境/数据集/代码合集【DeepMind】
  鸟叫数据集 [xeno-canto]
  Wolfram 数据集存储库
  大规模音乐分析数据集 FMA
  (300 万) Instacart 在线杂货购物数据集 [Jeremy Stanley]
  用于欺诈检测的合成金融数据集 [TESTIMON]
  NSynth:一个大规模的高质量音符标记音频数据集
  
  LIBSVM 格式分类/回归/多标签/字符串数据集
  ~cjlin/libsvmtools/datasets/binary.html
  笔记本电脑使用逻辑回归拟合 100G 数据集 [DmitriySelivanov]
  StackExchange 近似/重复问题数据集
  2010-2017最全的KDD CUP试题及数据集
  食谱数据集:超过 20,000 个带有评级、营养和类别信息的食谱 [HugoDarwood]
  奥斯卡数据集【电影艺术与科学学院】
  计算医学库:大型医学数据集的 (TensorFlow) 分析和机器学习建模 [AkshayBhat]
  聚类数据集
  官方开放气候数据集
  全球恐怖袭击数据集【START联盟】
  七个机器学习时间序列数据集
  大规模众包关系数据库自然语言查询语义解析数据集(80,000+查询样本)
  赛马赔率数据集
  新的 YELP 数据集:收录 470 万条评论和 156,000 个商家
  JMIR 数据集特刊“JMIR 数据”
  日本木刻版画文字识别数据集
  多模式二元行为数据集
  机器学习论文/数据集/工具集(日语)
  机器学习公司的十大数据采集策略
  NLP 数据集加载工具集
  日语相似词数据集
  大规模以人为本的完形填空(多项选择阅读理解)数据集
  高质量免费数据集列表
  “数据之美”自然语言数据集/代码
  微软数据集MS MARCO,阅读理解领域的“ImageNet”
  AI2科学问答数据集(多选)
  常用图像数据集
  (分类、跟踪、分割、检测等)
  搜狗实验室数据集:
  互联网图片库来自搜狗图片搜索索引的部分数据。共有 2,836,535 张图片,类别包括人物、动物、建筑、机械、风景和运动。对于每张图片,原创图片、缩略图、图片所在的网页以及网页中的相关文本都在数据集中给出。超过200G
  IMAGECLEF 致力于为图像相关领域(检索、分类、注释等)提供基准跨语言评估论坛(CLEF)。该比赛自2003年起每年举办一次。
  ~xirong/index.php?n=Main.Dataset
  专业知识:seo专家:八个工具助您的外贸网站快速排名
  八款工具助你外贸网站快速排名
  做外贸网站,没有好的SEO策划,很难在激烈的竞争中脱颖而出。一个好的网站SEO需要分析网站本身,什么是外贸,以及竞争对手的网站。SEO分析对于外贸新手网站或者SEO不好的网站尤为重要。本文精选了 8 个 SEO 工具,可以帮助您发现 SEO网站 的问题。同时还可以分析竞争对手的关键词选型、链式、链式设计,然后用在自己的外贸网站中,推广SEO的隐藏东西。
  1. SEMrush
  SEMrush 可以称为一个综合性的 SEO 工具,SEO 初学者和专家都可以通过 SEMrush 流程获得帮助。什么是外贸,从竞争对手分析和展示到关键词研究、广告策略分析、逆向检查、关键词难度、品牌展示等。你甚至可以用它来发现新的竞争对手,观察行业变化帮助您连接和领导的领域。
  SEMrush 从 Google 和 Bing 中提取大量 SEO 数据,让您能够以难以置信的细节探索 关键词。什么是外贸,以便捷的方式提供所有这些数据,并进行全面的现场审核和持续跟踪。如果您只为您的专业博客业务使用一种工具,那么设置 SEMrush 是一个不错的选择。
  2. 最佳搜索引擎优化
  
  Yoast SEO 是一个 WordPress SEO 插件。这是市场上最好的 SEO 插件之一。从主页面到文章页面,从存档页面到标签页,都提供了详细的设置。可以说,Yoast SEO对SEO设计的每一页的规划都是很小的。如可读性分析、关键词、meta关键词、关键词网页内容结构、图片分析、内外链接分析、标题和描述分析、链接地址分析等。
  Yoast SEO 可能是您可以用来改善博客 SEO 的最佳整体工具。
  3.Moz工具
  Moz 工具可用于链接构建和分析、Web 功能、关键词sink 研究、网站 拥抱、列表查看等。什么是外贸是互联网上最大最准确的SEO关键词数据库之一。在几秒钟内,专业博主可以使用它在 网站 上找到 关键词 并确定其优先级。没有用于分析或统计过滤的复杂图表,SEO 建议简单直观。
  Moz 提供了许多可供博主用来推广 SEO 的工具。这个大扇区是免费的,几乎没有限制。
  4. BuzzSumo
  
  BuzzSumo 是一个智能工具。哪些外贸可以帮助您进一步提高您的SEO工作。BuzzSumo 无需绞尽脑汁根据关键词汇寻找可操作的主题,而是让您在社交媒体上找到高度共享的内容并围绕该内容定制您的工作。
  在快速搜索中,您可以在 Facebook、Twitter、Pinterest、Reddit 上查看 关键词,包括订阅、反向链接、总份额。
  5. 隔壁
  强大的 SEO 集成,从 关键词 研究到链接分析,无所不能。Serpstat 提供范围广泛的 SEO 工具,几乎每个人都会在城市中找到方便的工具,包括长尾 关键词 研究、每次点击成本分析、PPC 竞争洞察、搜索量分析。
  因此,您可以使用 Serpstat 做的最有用的事情是对您的站点进行全面审核。什么是外贸,包括反向链接和 Serpstat 本身,是完全自动的。
  天蜘蛛网专注于SEO培训,大量学员受益。

汇总:Java算法自动采集列表页内容怎么用?

采集交流优采云 发表了文章 • 0 个评论 • 93 次浏览 • 2022-11-06 08:26 • 来自相关话题

  汇总:Java算法自动采集列表页内容怎么用?
  算法自动采集列表页内容这种做法适合采集静态页面,静态页面容易被转载,使用这种方法非常合适,首先先下载美化模板,再在网页上编辑,编辑方法可看:(request页),成功后,点击loadpng,自动将美化模板美化为静态页面,再次点击loadpng,再生成一个静态页面(不要点击js),就可以通过ua来做身份验证,点击ua生成一个密码,记住,使用https,记住,同时登录自己的账号和密码,loadpng要返回回文,在ua/https状态下即可。
  工欲善其事必先利其器,尤其是技术开发人员,在使用开发工具技术的过程中,
  
  1、多行字段,采用java开发时,繁琐,
  2、每次启动都要调用程序,传参数,字段值传参,
  3、数据对接需要等待好几秒,而且费时间,数据未必准确,
  
  4、报错麻烦,等待一分钟,都是日常工作;总之,会遇到很多技术问题,需要在配置中进行修改,所以很多人都不敢轻易尝试;但是,如果遇到java代码中的坑,则解决起来只需要简单几步;记得上大学的时候,老师讲过一个故事:一个大学生做生意,客户一般有100个,通过qq找了10个客户,分别取对应的联系方式,然后邮件发过去,客户回复,要做什么,你再发一遍。
  如果找到对方,最好,1次性能招10个学生,先打一波僵尸,自己发动去赚钱,发现订单不多,也招不到学生,走人,大学生自己接着赚;等真正开业了,一次性招够100个人,这时你才能赚10万块钱,为什么?这10万块钱,才是你的真金白银,而不是发几封邮件,招10个学生,来打个僵尸。
  说这个故事的意思是,当你遇到困难的时候,你需要多方协作,你不需要看到他人的失败就傻乎乎立马改变方向,困难肯定是有的,项目经理,产品经理,开发人员,测试人员,市场,老板等,除了老板跟你讲,产品策略,市场定位,产品功能等,其他人都不知道你项目哪里有问题,技术也不清楚你做的究竟是个什么产品,也不知道你对技术的需求是什么,他们顶多用上级的要求,展开你项目中,能用就行了,那么这个项目,你是顶多承担80%的任务,尽量降低到40%,是一个非常合理的比例;你遇到问题,没人帮你,先想着说服老板,说服市场,别自己自己打自己;而对于自己的技术的技术栈的掌握,一定要扎实;团队的技术落地,可以看以下方面;。
  1、对接流程各种问题(功能页面,数据库,性能,兼容性等),这里面有个重要人物就是程序员,你在跟他沟通的时候,他也在和你沟通的,切记不要嫌麻烦,对接环节,老板,需求方, 查看全部

  汇总:Java算法自动采集列表页内容怎么用?
  算法自动采集列表页内容这种做法适合采集静态页面,静态页面容易被转载,使用这种方法非常合适,首先先下载美化模板,再在网页上编辑,编辑方法可看:(request页),成功后,点击loadpng,自动将美化模板美化为静态页面,再次点击loadpng,再生成一个静态页面(不要点击js),就可以通过ua来做身份验证,点击ua生成一个密码,记住,使用https,记住,同时登录自己的账号和密码,loadpng要返回回文,在ua/https状态下即可。
  工欲善其事必先利其器,尤其是技术开发人员,在使用开发工具技术的过程中,
  
  1、多行字段,采用java开发时,繁琐,
  2、每次启动都要调用程序,传参数,字段值传参,
  3、数据对接需要等待好几秒,而且费时间,数据未必准确,
  
  4、报错麻烦,等待一分钟,都是日常工作;总之,会遇到很多技术问题,需要在配置中进行修改,所以很多人都不敢轻易尝试;但是,如果遇到java代码中的坑,则解决起来只需要简单几步;记得上大学的时候,老师讲过一个故事:一个大学生做生意,客户一般有100个,通过qq找了10个客户,分别取对应的联系方式,然后邮件发过去,客户回复,要做什么,你再发一遍。
  如果找到对方,最好,1次性能招10个学生,先打一波僵尸,自己发动去赚钱,发现订单不多,也招不到学生,走人,大学生自己接着赚;等真正开业了,一次性招够100个人,这时你才能赚10万块钱,为什么?这10万块钱,才是你的真金白银,而不是发几封邮件,招10个学生,来打个僵尸。
  说这个故事的意思是,当你遇到困难的时候,你需要多方协作,你不需要看到他人的失败就傻乎乎立马改变方向,困难肯定是有的,项目经理,产品经理,开发人员,测试人员,市场,老板等,除了老板跟你讲,产品策略,市场定位,产品功能等,其他人都不知道你项目哪里有问题,技术也不清楚你做的究竟是个什么产品,也不知道你对技术的需求是什么,他们顶多用上级的要求,展开你项目中,能用就行了,那么这个项目,你是顶多承担80%的任务,尽量降低到40%,是一个非常合理的比例;你遇到问题,没人帮你,先想着说服老板,说服市场,别自己自己打自己;而对于自己的技术的技术栈的掌握,一定要扎实;团队的技术落地,可以看以下方面;。
  1、对接流程各种问题(功能页面,数据库,性能,兼容性等),这里面有个重要人物就是程序员,你在跟他沟通的时候,他也在和你沟通的,切记不要嫌麻烦,对接环节,老板,需求方,

解决方案:垃圾回收算法以及常见垃圾收集器简介

采集交流优采云 发表了文章 • 0 个评论 • 39 次浏览 • 2022-11-26 03:24 • 来自相关话题

  解决方案:垃圾回收算法以及常见垃圾收集器简介
  垃圾采集
算法及常见垃圾采集
器介绍
  文章目录
  前言
  比如:作为一个java程序员,JVM会帮你进行垃圾回收,那么JVM是怎么回收的呢?常见的垃圾回收算法和垃圾回收器有哪些?它们是如何工作的?
  1. 垃圾采集
算法 1.1 分代采集
理论
  根据年轻代或老年代的不同,选择不同的垃圾回收算法。年轻代一般采用复制算法,老年代一般采用标记清除算法或标记排序算法。
  1.2 标记-复制算法
  内存排序前:首先将内存分为used(保留内存)和unused(可用内存、可回收内存、存活对象(通过gc根可达性算法判断哪些对象存活))两部分,(从eden从park到幸存者区);
  内存排序后:将已使用(保留内存)和未使用(可用内存、可回收内存、存活对象)复制交换,回收未使用的可回收内存;
  缺点:每次内存回收回收一半内存空间,浪费空间。年轻代使用复制算法,老年代不使用复制算法。
  1.3 标记-扫描算法
  标记存活的对象,清除未标记(not alive)的对象。
  缺点: 1.效率问题,如果标记的对象太多,效率不高;2、空间问题,标记清除后会产生大量不连续的碎片(内存空间);
  1.4 标记整理算法
  标记存活对象,让存活对象移动到可回收对象(不清除垃圾对象,直接将非垃圾对象移动到垃圾对象,就像赋值一样),如果可回收对象中没有存活对象,然后直接清除它们可回收对象;(write barrier模式同步修改内存地址)
  2.垃圾采集

  如果说回收算法是内存回收的方法论,那么垃圾回收器就是内存回收的具体实现。
  常见的垃圾采集
器有Seri​​al、ParNew、Parallel、CMS、Serial Old、Parallel Old、G1、ZGC。
  为什么有这么多垃圾采集
器?因为目前还没有任何场景都可以使用的采集
器,所以我们要根据具体的场景选择适合自己的垃圾采集
器。
  2.1 串行采集

  串行(serial)采集
器是最基本也是最古老的垃圾采集
器。它是一个单线程垃圾采集
器,在垃圾采集
期间暂停所有其他工作线程(“Stop The World”或简称 STW)。新生代采用复制算法,老年代采用标记-排序算法。可以回收的内存区域在几十兆到几百兆之间,不是很大,也不再使用了。使用参数 -XX:+UseSerialGC -XX:+UseSerialOldGC
  缺点:效率低,会给STW中的用户带来不好的用户体验;
  优点:简单高效(相对于其他单线程采集
器);
  Serial Old采集
器是Serial采集
器的老版本,也是单线程采集
器。它主要有两个用途:一是在JDK1.5及更早版本中与Parallel Scavenge采集
器配合使用,二是作为CMS采集
器的备份方案。
  2.2 并行清扫采集

  并行采集
器实际上是串行采集
器的多线程版本。除了使用多线程进行垃圾采集
外,其余行为(控制参数、采集
算法、回收策略等)与Serial采集
器类似。默认采集
线程数与 CPU 核心数相同。当然采集
线程数也可以通过参数(-XX:ParallelGCThreads)指定,但一般不建议修改。Parallel Scavenge采集
器侧重于吞吐量(CPU的高效利用),其STW时间比较长,用户体验不好。CMS等垃圾采集
器的关注点更多的是用户线程的停顿时间(提升用户体验)。所谓吞吐量就是CPU中运行用户代码所花费的时间与CPU总消耗时间的比值。新生代采用复制算法,老年代采用标记-排序算法。使用参数-XX:+UseParallelGC(年轻代),-XX:+UseParallelOldGC(老年代)
  Parallel Old 采集
器是 Parallel Scavenge 采集
器的老年代版本。使用多线程和“标记和排序”算法。在注重吞吐量和CPU资源的情况下,Parallel Scavenge采集
器和Parallel Old采集
器(JDK8默认的新生代和老年代采集
器),Parallel采集
器和CMS(老年代才有)采集
器可以优先使用 没有一起使用它的方法。
  2.3 ParNew采集

  ParNew采集
器其实和Paralle采集
器非常相似(ParNew用于新生代),区别(ParNew+CMS)主要是可以和CMS(用于老年代)采集
器结合使用。新生代采用复制算法,老年代采用标记-排序算法。使用参数-XX:+UseParNewGC。
  2.4 CMS 采集

  CMS(Concurrent Mark Sweep)采集
器是一种以获取最短恢复停顿时间为目标的采集
器,非常注重用户体验。
  操作过程大致如下:
  2.4.1 初始标记
  挂起所有其他线程(STW,如果没有STW机制,初始标记阶段会产生连续的对象,无法完成初始标记),记录gc roots可以直接引用的对象,以及速度很快;
  2.4.2 并发标记
  无需停止应用程序线程。应用线程和CMS线程同时运行,可能导致被标记对象的状态发生变化;(如果内存变大,整个堆内存会变大,标记时间也会变长,STW时间也会变长,用户体验不好。)缺少标签(下面会有解决方法)。
  2.4.3 重新贴标签
  它还会STW,重新标记那些在并发标记中状态发生变化的对象;(三色标增量更新)
  2.4.4 并发清理
  没有被标记的对象(垃圾对象)被清除,应用线程和CMS线程同时运行(因为应用线程也在运行,会产生新的对象,如果这些引用会被标记为黑色)它们没有被标记,黑色不会被扫描后变成浮动垃圾,在下一轮被清理(三色标记))。
  2.4.5 并发复位
  清理上面步骤标记的对象,方便下次重新标记。
  如果ParNew采集
器的执行时间为1s,那么CMS采集
器的执行时间就会大于1s。为什么?因为CMS采集
器在执行过程中会分配一部分资源(CPU)给应用线程执行,但是没有STW(用户在初始标记和重新标记时会感觉到STW),用户几乎没有感觉等了很久。
  CMS采集
器的优点:并发采集
、低暂停。
  CMS采集
器的缺点:
  (1). 会和CPU竞争资源(应用线程和CMS线程会同时运行);
  (2). 浮动垃圾(并发标记和并发清理时会产生新的垃圾,只能被下一次gc处理);
  (3). 使用mark-clear算法会产生大量的空间碎片,但是JVM可以通过XX:+UseCMSCompactAtFull采集
参数让jvm清除mark然后整理;
  (4). 在并发标记和并发清理的过程中,会出现同时回收和运行的情况。可能在回收完成之前会再次触发full gc(垃圾会在上次垃圾回收完成之前再次触发),是并发失败(concurrent mode failure),会stop the world,使用Serial old collector来回收。
  2.4.6 CMS相关核心参数
  1.-XX:+UseConcMarkSweepGC:启用cms;
  2. -XX:ConcGCThreads:并发GC线程数;
  3. -XX:+UseCMSCompactAtFull采集
: FullGC后做压缩(减少碎片);
  4. -XX:CMSFullGCsBeforeCompaction:FullGC后压缩多少次,默认0,表示每次FullGC后压缩;
  5. -XX:CMSInitiatingOccupancyFraction:当老年代的使用率达到这个比例(默认是92,是一个百分比)的时候会触发FullGC;
  6、-XX:+UseCMSInitiatingOccupancyOnly:只使用设置的恢复阈值(-XX:CMSInitiatingOccupancyFraction设置的值),如果不指定,JVM只会在第一次使用设置的值,之后会自动调整;
  7. -XX:+CMSScavengeBeforeRemark:在CMS GC之前启动一次minor gc,目的是减少老年代对新生代的引用,减少CMS GC标记阶段的开销。一般CMS 80%的GC时间都在标记阶段;
  
  8、-XX:+CMSParallellnitialMarkEnabled:表示初始标记时多线程执行,缩短STW;
  9、-XX:+CMSParallelRemarkEnabled:remarking时多线程执行,缩短STW;
  2.5 G1 垃圾采集
器 2.5.1 G1 垃圾采集
器简介
  在 JDK9 中,默认的垃圾采集
器变成了 G1。在 JDK9 中,CMS 仍然可以使用,但不推荐使用。在JDK8中,也可以使用G1,但不推荐。G1采集
器(-XX:+UseG1GC),G1(Garbage-First)是面向服务器的垃圾采集
器,主要针对配备多处理器和大容量内存的机器,同时具有高吞吐量的特点。
  G1将java堆内存划分为大小相等的独立区域(Regions),JVM最多可以有2048个Region。如果一个内存是4G(4096M),那么每个Region平均就是2M。当然也可以通过参数“-XX:G1HeapRegionSize”手动指定Region大小,但建议使用默认的计算方式。
  G1保留了新生代和老年代的概念,但不再是物理隔离。它们都是(可以是不连续的)Region 集合。比如一个Region之前可能是新生代,如果Region被垃圾回收了,后面可能又变了。变成了晚年。
  默认情况下,新生代占堆内存的5%。如果heap size为4096M,那么young generation大约占用200MB内存,对应100个Region左右。可以通过“-XX:G1NewSizePercent”设置新生代的初始比例。在系统运行的过程中,JVM会不断的给年轻代增加Region,但是年轻代的最大比例不会超过60%,可以通过“-XX:G1MaxNewSizePercent”来调整。年轻代中Eden和Survivor对应的region也和之前一样。默认值为 8:1:1。假设新生代有1000个region,eden区有800个,s0有100个,s1有100个。
  G1和其他垃圾采集
器的区别在于对大对象的处理。G1有一个Region叫做Humongous区,专门用来分配大对象,而不是直接进入老年代。在G1中,如果一个大对象超过了Region的50%,就会被放到Humongous区域。如果一个对象的内存是1.5M,就直接放到Humongous里面。如果一个对象的内存是6M,那么它会被放置在三个连续的Humongous区。
  2.5.2 G1采集器运行过程
  初始标记:挂起所有其他线程,记录gc roots直接引用的对象,非常快(STW);
  并发标记:同CMS并发标记;
  Final markup: remark with CMS (will STW);
  Filter recovery(类似于CMS并发清理,只是STW):根据用户预期的GC暂停STW时间指定回收(可以通过JVM参数指定:-XX:MaxGCPauseMills),比如old generation中1000个region满了,但是因为按照预期的停顿时间,这次恢复可能是200毫秒(如果没有设置参数-XX:MaxGCPauseMills,默认是200ms),通过计算可知,恢复800的可能只需要200毫秒regions,所以会回收800个region(采集
Set,待回收的采集
),剩下的200个region会在下次垃圾回收时回收,尽量把GC停顿时间控制在我们设定的时间范围内。不管是年轻一代还是老一代,回收算法主要使用复制算法(G1整体上是一种标记算法),将一个区域中存活的对象复制到另一个区域中,不会像CMS那样被回收 因为有很多内存碎片需要回收整理一次,G1使用复制算法回收几乎没有内存碎片。G1 采集
器在后台维护一个优先级列表。每次根据允许回收时间,优先回收价值最高的区域。比如一个region可以在200ms回收10M垃圾,另一个region可以在50ms回收10M垃圾。在有限的情况下,G1当然会优先回收后面的区域。不会像CMS那样被回收 因为有很多内存碎片需要整理一次,所以G1使用复制算法回收几乎没有内存碎片。G1 采集
器在后台维护一个优先级列表。每次根据允许回收时间,优先回收价值最高的区域。比如一个region可以在200ms回收10M垃圾,另一个region可以在50ms回收10M垃圾。在有限的情况下,G1当然会优先回收后面的区域。不会像CMS那样被回收 因为有很多内存碎片需要整理一次,所以G1使用复制算法回收几乎没有内存碎片。G1 采集
器在后台维护一个优先级列表。每次根据允许回收时间,优先回收价值最高的区域。比如一个region可以在200ms回收10M垃圾,另一个region可以在50ms回收10M垃圾。在有限的情况下,G1当然会优先回收后面的区域。优先考虑回收价值最高的地区。比如一个region可以在200ms回收10M垃圾,另一个region可以在50ms回收10M垃圾。在有限的情况下,G1当然会优先回收后面的区域。优先考虑回收价值最高的地区。比如一个region可以在200ms回收10M垃圾,另一个region可以在50ms回收10M垃圾。在有限的情况下,G1当然会优先回收后面的区域。
  2.5.3 G1采集器特点
  并行和并发:G1可以充分利用CPU和多核环境的硬件优势,使用多个CPU(CPU或CPU核心)来缩短Stop-The-World暂停时间。其他一些采集
器原本需要停止Java线程执行GC动作,但G1采集
器仍然可以让Java程序继续并发执行。
  分代采集
:虽然G1可以独立管理整个GC堆而不需要其他采集
器的配合,但是它仍然保留了分代的概念。
  空间整合:与CMS的“mark-clean”算法不同,G1是一个整体基于“mark-sort”算法的采集
器;它是在本地基于“复制”算法实现的。
  可预测的暂停:这是 G1 相对于 CMS 的另一大优势。减少暂停时间是 G1 和 CMS 共同关心的问题。不过,除了追求低停顿之外,G1 还可以建立一个可预测的停顿时间模型,允许用户或明确指定在 M 毫秒的时间段内完成垃圾采集
(由参数“-XX:MaxGCPauseMillis”指定) .
  毫无疑问,能够由用户指定预期的停顿时间是G1采集
器非常强大的功能。设置不同的预期停顿时间可以让G1在不同的应用场景下,在关注吞吐量和关注延迟之间取得最佳平衡。不过,这里设定的“期望值”一定要切合实际,不能异想天开。毕竟G1是冻结用户线程复制对象,停顿时间再低也得有个限度。它的默认暂停目标是 200 毫秒。一般来说,回收阶段占用几十到一百甚至接近200毫秒是正常的,但是如果我们把暂停时间调整到一个很低的值,比如设置为20毫秒,最有可能的结果是因为暂停目标时间太短,每次选择的采集
集合只占用堆内存的一小部分,采集
器的采集
速度逐渐跟不上分配器的分配速度,导致垃圾堆积。采集
器很可能一开始可以从空闲堆内存中获得一些喘息时间,但是应用程序运行时间长了就不行了,最终堆满会导致Full GC降低性能,所以预期的停顿时间通常设置为一两百毫秒或者两三百毫秒会比较合理。
  2.5.4 G1垃圾采集
分类
  YoungGC:YoungGC并不是说当现有的Eden区满了就立即触发。当G1触发YoungGC时,会判断触发时间是否接近设定的时间(默认为200ms)。如果没有关闭,则不会立即触发。YoungGC会不断的给Eden区增加空间(默认是5%,最大不会超过60%),只有在关闭的时候才会触发YoungGC。
  MixedGC:当老年代占用堆内存的比例达到45%时(可以通过参数-XX:InitiatingHeapOccupancyPercent设置),触发MixedGC,回收所有Young和部分Old(决定垃圾回收的优先级)按照预期的GC停顿时间顺序在old区)和大对象区(Humongous area)。(MixedGC会回收 G1的Humongous区)
  FullGC:在做复制算法的过程中(对内存空间要求比较高),需要将每个region中存活的对象复制到其他region中。如果在复制过程中发现没有足够的空区域来承载复制的对象,则会失败。触发Full GC,触发Full GC会停止系统程序,然后使用单线程进行标记、清理、压缩,为下一次MixedGC腾出一批region。这个过程非常耗时。
  2.5.5 G1采集器参数配置
  -XX:+UseG1GC:使用G1采集
器;
  -XX:ParallelGCThreads:指定GC工作的线程数;
  -XX:G1HeapRegionSize:指定分区大小(1MB~32MB,且必须是2的N次方),默认整个堆分为2048个分区
  -XX:MaxGCPauseMillis:目标暂停时间(默认200ms);
  -XX:G1NewSizePercent:新生代内存的初始空间(默认为整个堆的5%);
  -XX:G1MaxNewSizePercent:新生代的最大内存空间;
  -XX:TargetSurvivorRatio:Survivor区域的填充容量(默认50%)。Survivor区的一组物体(年龄1+年龄2+年龄n多个年龄的物体)总和超过Survivor区的50%。此时,年龄为n(含)及以上的对象将被放入老年代;
  -XX:MaxTenuringThreshold:最大年龄阈值(默认15);
  -XX:InitiatingHeapOccupancyPercent:老年代占用的空间达到整个堆内存的阈值(默认45%),则进行新生代和老年代的混合采集
(MixedGC)。比如我们前面提到的heap,默认有2048个region。如果有接近1000个region,每个region都是老年代region,可能会触发MixedGC;
  -XX:G1MixedGCLiveThresholdPercent (default 85%) 当区域中的存活对象低于该值时,该区域将被回收。如果这个值超过这个值,说明存活对象太多,回收意义不大;
  -XX:G1MixedGCCountTarget:指定一次回收过程中筛选回收的次数(默认8次)。在最后的筛选回收阶段,可以先回收一段时间,然后暂停回收,恢复系统运行,稍后再开始回收,这样就不会让系统单次停太久;
  -XX:G1HeapWastePercent (default 5%):gc过程中腾出的region是否足够阈值。混合回收时,region回收是基于复制算法,将待回收region中存活的对象放到Other Region中,然后清理掉本Region中的所有垃圾对象,从而不断清空新的Region在回收过程中。一旦free Region数量达到堆内存的5%,混合回收就会立即停止,也就是说本次混合回收结束。
  2.5.6 G1采集
器使用场景
  超过 1.50% 的堆被存活的对象占用;
  2、对象分配和提升的速度差异很大;
  3、垃圾回收时间极长,超过1秒;
  堆内存大于4.8GB(推荐值);
  5、停顿时间在500ms以内;
  2.7 ZGC采集
器 2.7.1 ZGC简介
  ZGC是JDK11中新加入的实验性低延迟垃圾采集
器。ZGC可以说是源自Azul System开发的C4(Concurrent Continuously Compacting Collector)采集
器。
  2.7.2 ZGC目标
  1.支持TB级堆;
  2、最大GC停顿时间不超过10ms;
  3.为以后的GC特性打下基础;
  4、最坏情况下,吞吐量会降低15%;
  无分代(临时):我们都知道上一代垃圾采集
器是基于“大多数对象有生有死”的假设。事实上,大多数系统的对象分配行为确实符合这个假设。那为什么ZGC不分代呢?由于分代实现比较麻烦,笔者先实现了一个比较简单好用的单代版本,后期会优化。
  2.7.3 ZGC内存布局
  ZGC采集
器基于Region内存布局,暂不设置分代,使用read barriers、color pointers等技术实现并发mark-sort算法,是一款以低延迟为首要目标的垃圾采集
器. 设备。
  ZGC的Region可以有三种容量,如图3-19所示:大、中、小:
  Small Region(小区域):容量固定为2MB,用于放置小于256KB的小对象。
  Medium Region(中型区域):容量固定为32MB,用于放置大于等于256KB但小于4MB的对象。
  Large Region(大区域):容量不固定,可以动态变化,但必须是2MB的整数倍,用于放置4MB以上的大对象。每个large region只会存储一个large object,这也说明虽然名字叫“large region”,但实际容量可能比medium region要小,最小容量可以低至4MB。Large Region在ZGC的实现中不会进行重分布(重分布是ZGC的一个处理动作,用于采集
器阶段的对象复制,后面会介绍),因为复制大对象的成本非常高。
  2.7.4 彩色指针
  前一个垃圾采集
器的GC信息保存在对象头中,而ZGC垃圾采集
器的GC信息保存在指针中。
  
  每个对象都有一个64位的指针,这64位分为:
  18 位:保留以备后用;
  1位:Finalizable标志位,这个位与并发引用处理有关,表示这个对象只能通过finalizer访问;
  1位:Remapped flag,设置该位的值后,对象不指向relocation set(relocation set表示需要GC
  区域集合);
  1位:Marked1标识;
  1位:Marked0标识,上面的Marked1都是辅助GC的标记对象;
  42位:对象的地址(所以可以支持2^42=4T内存):
  为什么有2个标记标记?
  在每个 GC 周期的开始,使用过的标记位被交换,使在前一个 GC 周期中更正的标记状态无效,并且所有引用都变为未标记。
  GC循环1:使用mark0,循环结束时所有引用标记都会变成01。
  GC循环2:使用mark1,那么期望的mark标记为10,所有的引用都可以remark。
  通过配置ZGC后对对象指针的分析,可以看出对象指针必须是64位的,那么ZGC就不能支持32位的操作系统,同样不能支持压缩指针(CompressedOops,压缩指针也是32位的)
  彩色指针的三大优势:
  1、一旦一个Region的存活对象被remove,这个Region就可以立即被释放并重新使用,而不需要等到整个堆中对该Region的所有引用都被纠正之后才能被清理掉。如果有空闲的Region,ZGC可以完成采集

  2. 颜色指针可以大大减少垃圾回收时使用的内存屏障的数量。ZGC 只使用读屏障。
  3、颜色指针可扩展性强。它可以作为一个可扩展的存储结构来记录更多与对象标记和重定位过程相关的数据,以便在未来进一步提高性能。
  2.7.5 读屏障
  在并发重分配的过程中,ZGC通过复制算法将原来的region(里面的对象)移动到另一个region,需要更新新的地址。什么时候更新?这个过程是一个懒惰的过程,它不会一直更新。当我从堆中获取旧对象值时,我得到了一个引用。此引用的颜色指针在进行并发标记时更改了颜色。在旧的引用过程中,颜色指针部分也被接管了。取的时候会加一个read barrier,判断指针是否被修改。如果它已被修改,它将在内部将旧引用移动到已使用的更新地址。转发表记录了旧对象到新对象的转发关系。
  2.7.6 ZGC问题及解决方案
  ZGC最大的问题是漂浮垃圾。ZGC的停顿时间在10ms以下,但是ZGC的执行时间还是比这个时间长了很多。如果ZGC的整个过程需要执行10分钟,这期间由于对象分配率高,会产生大量的新对象。这些对象很难进入本次GC,只能在下一次GC中回收。这些对象只能等到下一次GC才能回收的对象是浮动垃圾。
  解决方案
  目前唯一的办法就是增加堆的容量,让程序获得更多的喘息时间,但这也是治标不治本。如果要从根本上解决这个问题,还是需要引入分代采集
,让新的对象都在一个专门的区域创建。
  2.7.7 ZGC参数设置
  启用ZGC比较简单,设置JVM参数即可:-XX:+UnlockExperimentalVMOptions "-XX:+UseZGC"。调优并不难,因为ZGC的调优参数不多,远没有CMS复杂。和G1一样,可以调优的参数比较少,大部分工作都可以由JVM自动完成。ZGC可以调优的参数如下图:
  3. 垃圾回收底层算法实现 3.1 三色标记
  在gc过程或者并发标记过程中,主要有三种颜色
  黑色:表示对该对象的所有引用都已被垃圾采集
器扫描过,是一个活的(非垃圾)对象;
  灰色:表示这个对象至少有一个引用没有被垃圾采集
器扫描过;
  白色:表示这个对象还没有被垃圾采集
器访问过(没有对象被gc root引用,对象不可达);
  3.2 多标签漂浮垃圾
  因为应用线程没有停止(执行栈线程,没有STW机制,即栈线程中局部变量表、操作数栈、动态链接、方法出口的指针不指向堆内存),会有多标签(非垃圾对象被标记为垃圾对象),多标签(浮动垃圾)会在下次垃圾回收时被清除。
  3.3 缺失标签——读写障碍
  缺失标记:A-&gt;D,开头后面没有加法,B-&gt;D,开头后面有去掉。A不会被重新扫描,B重新扫描后也无法扫描D;D(以后会删除)会漏掉(阿里巴巴可能会问),D不是垃圾对象,会被标记为垃圾对象。造成程序严重错误。
  增量更新:在并发标记的过程中,将赋值(新引用)保存在一个集合中,(重标记时是为了解决并发标记时多标记或漏标记的问题,找到新添加记录的引用并重新扫描);简单理解:新添加的引用源和被引用对象记录在一个集合中(底层是C++),源引用用黑色标注。(一旦黑色对象有了新插入的对白色对象的引用,它就变成了灰色对象)
  原创
快照(Snapshot At The Beginning, SATB):(没看懂,再听一遍)在赋值前将旧的引用以快照的形式保存在集合中。在remarking的过程中,采集
中的所有引用都被标记为黑色,如果是黑色,则本轮不回收(会变成浮动垃圾,下轮回收)。
  增量更新和原创
快照都是通过写屏障来记录的。
  Write barrier:增加新的引用或减少引用是通过赋值来实现的。无论是增量更新还是原创
快照引用的记录,都必须采集
到集合中,无论是赋值前还是赋值后(代码中的操作屏障),通过write barrier记录到集合中
  赋值前后做一些处理(有点像AOP),(write barrier)写前操作,(write barrier)写后操作(增量更新)。
  CMS 实现写屏障+增量更新来处理丢失的标签。(写操作异步处理以提高性能)
  为什么G1使用原创
快照,而CMS使用增量更新来处理丢失的标签?
  因为CMS在增量更新时会继续扫描节点对象的引用,所以G1不会再深度扫描原创
快照中的对象,而是简单地标记它们,等待下一轮GC进行深度扫描。(G1有很多不同的region,CMS是老年代区域,如果再深度重新扫描,G1的成本会比CMS高)。
  4.内存设置和卡表
  Remember Set:为了解决新生代中对象的引用被老年代引用的问题,专门在新生代的内存中设置了这些老年代引用的对象(不会有很多交叉)生成引用),并且这些对象的集合使用内存集调用。
  Cardtable:Cardtable和memory set就像Java语言中HashMap和Map的关系。内存集是用卡表实现的,内存区域(卡页)在老年代是一块块划分的,或者叫页内存卡(约512字节)。如果page memory(card)中有指向young的对象 如果在generation中有对象,则将这个card page标记为dirty。卡表(Cardtable)的底层实现是一个数组,数组中每个元素对应的内存区域称为页内存(card page)。卡表底层也是通过write barrier实现的。卡页在老年代,卡表在新生代(堆)。
  5.如何选择垃圾采集

  1、优先调整堆的大小,让服务器自己选择;
  2.如果内存小于100M,使用串口采集
器;
  3、如果是单核,没有停顿时间要求,serial或者JVM可以自己选择;
  4.如果允许暂停时间超过1秒,选择parallel或者JVM来选择;
  5、如果响应时间最重要,不能超过1秒,使用并发采集
器;
  6、4G以下可以用parallel,4-8G可以用ParNew+CMS,8G以上可以用G1,几百G以上可以用ZGC;
  6. 安全点和安全区
  安全点:在做GC的过程中,不要想做就马上做GC。当用户线程在做GC的时候,会判断flag是什么(比如0和1,1表示到达安全点,0没有到达,所有用户线程都会轮询看这个flag)当用户线程flags全为1,就会被挂起,当所有用户线程flags都为1时(都到达安全点时),就会触发GC。
  安全点的位置主要有以下几点:
  1、方法返回前;
  2.调用方法后;
  3.抛出异常的位置;
  4.循环结束;
  安全区:是为正在执行的线程确定的。比如一个线程处于休眠状态,无法响应JVM的中断请求,进而运行到Safe Point。因此,JVM引入了Safe Region,也就是说在一个代码块中,引用关系不会发生变化,在这个区域的任何地方启动GC都是安全的。
  总结
  例如:常见的垃圾采集
算法mark-copy algorithm, mark-clear algorithm, mark-sort algorithm,常见的垃圾采集
器Serial, Parallel, ParNew, CMS, G1, ZGC,主要是三种垃圾:CMS, G1, ZGC 的运行collector的流程,并发标记过程中的missing mark问题,以及相应的解决方案。
  解决方案:摄像头采集的图像可以用调用opencv处理吗
  用
  OpenCV打开USB摄像头时,两个软件采集到的图像结果分别是以上两张,我用OpenCV采集的第一张图片
  第二张图是用别人的软件采集
的,感觉色差好大,在OpenCV中我觉得相机本身的很多属性都设置不定,原因是两个软件使用的库不同,而且拍到的图片默认参数不同,所以想用DirectShow, 据说有一些东西可以在里面设置属性。
  安装直接显示
  1. 下载、安装和配置 OpenCV
  2.免费下载直接显示,哈哈(
  )
  3. 解压缩到 OpenCV 所在的文件夹。
  4. VS2010 新 Win32 项目,空文档。
  5. 配置 OpenCV(还有很多其他文章,这里就不提了)。
  6. 配置直接显示:在属性管理器中,在 VC++ 目录收录
项的直接显示下添加收录
文件路径。
  在库中的 DirectShow 下添加库路径。
  7.将 CameraDS.h CameraDS.cpp 和目录 DirectShow 复制到您的项目中
  此路径收录
所需的实验过程。它也可以下载到CameraDS.h CameraDS.cpp。
  8.如有必要,在属性管理器的常规下,将使用Unicode字符集更改为unset,这样可以避免一些编译错误。//
  /
  使用 DirectShow 拍摄视频
  作者:于世琪 ()
  //由于:
  HardyAI@OpenCV 中国/
  /flymanbox@OpenCV 中国(表彰他对功能相机名称和帧宽/高设置的贡献)
  最后修改日期:2009 年 4 月 9 日
  //
  使用说明:
  将 CameraDS.h CameraDS.cpp 和目录 DirectShow 复制到您的项目中
  项目->设置->设置:(所有配置)->C/C++->类别(预处理器)->其他收录
目录
  设置为直接显示/收录
  项目->设置->设置:(所有配置)->链接->类别(输入)->其他库目录
  设置为 DirectShow/Lib//
  /
  #include
  #include “相机DS.h”
  #include
  常量字符 *g_szTitle = “相机”;
  int main()
  
  {
  1. 考虑到已经有
  一个窗口显示图像,无需再次驾驶相机,即使你开车下来,相机也已经被占用了。
  if(IsWindowVisible(FindWindow(NULL, g_szTitle)))
  {
  返回 (-1);
  }
  只需获取摄像机数量
  int m_iCamCount = CCameraDS::CameraCount();
  printf(“There are 有 %d camera.\n”, m_iCamCount);
  if(m_iCamCount == 0)
  {
  返回 (-1);
  }
  CCameraDS m_CamDS;
  获取所有摄像机的名称
  for(int i = 0; i < m_iCamCount; i++)
  {
  字符 szCamName[1024];
  int retval = m_CamDS.CameraName(i, szCamName, sizeof(szCamName));
  if(retval >0)
  {
  printf(“Camera #%d's Name is '%s'.\n”, i, szCamName);
  }
  还
  {
  printf(“无法获取相机 #%d 的名称。\n”, i);
  }
  }
  2.考虑到如果有多个摄像头,或者其中一个或几个被其他程序占用,则需要逐个遍历它们
  直到找到一个可用。
  int m_iCamNum = 0;相机编号
  IplImage *pFrame = NULL;
  而(m_iCamNum < m_iCamCount)
  {
  
  if((! m_CamDS.OpenCamera(m_iCamNum, true , 320, 240)) ||((pFrame = m_CamDS.QueryFrame()) == NULL))
  {
  m_iCamNum++;
  }
  还
  { // 找到合适的相机并退出循环。
  破;
  }
  关闭
  相机,您必须将其关闭,因为下一次测试即将进行,并且在检测之前必须清除当前足迹。
  m_CamDS.关闭相机();
  }
  if(m_iCamNum == m_iCamCount)
  {
  fprintf(stderr, “无法打开相机或被其他应用程序使用。\n”);
  返回 (-1);
  }
  cvNamedWindow(g_szTitle);
  显示
  cvShowImage(g_szTitle, pFrame);
  而(1)
  {
  获取框架
  pFrame = m_CamDS.QueryFrame();
  显示
  cvShowImage(g_szTitle, pFrame);
  if (cvWaitKey(20) == 'q')
  {
  破;
  }
  }
  m_CamDS.关闭相机();你可以不调用这个函数,CCameraDS会在相机被破坏时自动关闭相机
  cvDestroyWindow(g_szTitle);
  返回 0;
  } 查看全部

  解决方案:垃圾回收算法以及常见垃圾收集器简介
  垃圾采集
算法及常见垃圾采集
器介绍
  文章目录
  前言
  比如:作为一个java程序员,JVM会帮你进行垃圾回收,那么JVM是怎么回收的呢?常见的垃圾回收算法和垃圾回收器有哪些?它们是如何工作的?
  1. 垃圾采集
算法 1.1 分代采集
理论
  根据年轻代或老年代的不同,选择不同的垃圾回收算法。年轻代一般采用复制算法,老年代一般采用标记清除算法或标记排序算法。
  1.2 标记-复制算法
  内存排序前:首先将内存分为used(保留内存)和unused(可用内存、可回收内存、存活对象(通过gc根可达性算法判断哪些对象存活))两部分,(从eden从park到幸存者区);
  内存排序后:将已使用(保留内存)和未使用(可用内存、可回收内存、存活对象)复制交换,回收未使用的可回收内存;
  缺点:每次内存回收回收一半内存空间,浪费空间。年轻代使用复制算法,老年代不使用复制算法。
  1.3 标记-扫描算法
  标记存活的对象,清除未标记(not alive)的对象。
  缺点: 1.效率问题,如果标记的对象太多,效率不高;2、空间问题,标记清除后会产生大量不连续的碎片(内存空间);
  1.4 标记整理算法
  标记存活对象,让存活对象移动到可回收对象(不清除垃圾对象,直接将非垃圾对象移动到垃圾对象,就像赋值一样),如果可回收对象中没有存活对象,然后直接清除它们可回收对象;(write barrier模式同步修改内存地址)
  2.垃圾采集

  如果说回收算法是内存回收的方法论,那么垃圾回收器就是内存回收的具体实现。
  常见的垃圾采集
器有Seri​​al、ParNew、Parallel、CMS、Serial Old、Parallel Old、G1、ZGC。
  为什么有这么多垃圾采集
器?因为目前还没有任何场景都可以使用的采集
器,所以我们要根据具体的场景选择适合自己的垃圾采集
器。
  2.1 串行采集

  串行(serial)采集
器是最基本也是最古老的垃圾采集
器。它是一个单线程垃圾采集
器,在垃圾采集
期间暂停所有其他工作线程(“Stop The World”或简称 STW)。新生代采用复制算法,老年代采用标记-排序算法。可以回收的内存区域在几十兆到几百兆之间,不是很大,也不再使用了。使用参数 -XX:+UseSerialGC -XX:+UseSerialOldGC
  缺点:效率低,会给STW中的用户带来不好的用户体验;
  优点:简单高效(相对于其他单线程采集
器);
  Serial Old采集
器是Serial采集
器的老版本,也是单线程采集
器。它主要有两个用途:一是在JDK1.5及更早版本中与Parallel Scavenge采集
器配合使用,二是作为CMS采集
器的备份方案。
  2.2 并行清扫采集

  并行采集
器实际上是串行采集
器的多线程版本。除了使用多线程进行垃圾采集
外,其余行为(控制参数、采集
算法、回收策略等)与Serial采集
器类似。默认采集
线程数与 CPU 核心数相同。当然采集
线程数也可以通过参数(-XX:ParallelGCThreads)指定,但一般不建议修改。Parallel Scavenge采集
器侧重于吞吐量(CPU的高效利用),其STW时间比较长,用户体验不好。CMS等垃圾采集
器的关注点更多的是用户线程的停顿时间(提升用户体验)。所谓吞吐量就是CPU中运行用户代码所花费的时间与CPU总消耗时间的比值。新生代采用复制算法,老年代采用标记-排序算法。使用参数-XX:+UseParallelGC(年轻代),-XX:+UseParallelOldGC(老年代)
  Parallel Old 采集
器是 Parallel Scavenge 采集
器的老年代版本。使用多线程和“标记和排序”算法。在注重吞吐量和CPU资源的情况下,Parallel Scavenge采集
器和Parallel Old采集
器(JDK8默认的新生代和老年代采集
器),Parallel采集
器和CMS(老年代才有)采集
器可以优先使用 没有一起使用它的方法。
  2.3 ParNew采集

  ParNew采集
器其实和Paralle采集
器非常相似(ParNew用于新生代),区别(ParNew+CMS)主要是可以和CMS(用于老年代)采集
器结合使用。新生代采用复制算法,老年代采用标记-排序算法。使用参数-XX:+UseParNewGC。
  2.4 CMS 采集

  CMS(Concurrent Mark Sweep)采集
器是一种以获取最短恢复停顿时间为目标的采集
器,非常注重用户体验。
  操作过程大致如下:
  2.4.1 初始标记
  挂起所有其他线程(STW,如果没有STW机制,初始标记阶段会产生连续的对象,无法完成初始标记),记录gc roots可以直接引用的对象,以及速度很快;
  2.4.2 并发标记
  无需停止应用程序线程。应用线程和CMS线程同时运行,可能导致被标记对象的状态发生变化;(如果内存变大,整个堆内存会变大,标记时间也会变长,STW时间也会变长,用户体验不好。)缺少标签(下面会有解决方法)。
  2.4.3 重新贴标签
  它还会STW,重新标记那些在并发标记中状态发生变化的对象;(三色标增量更新)
  2.4.4 并发清理
  没有被标记的对象(垃圾对象)被清除,应用线程和CMS线程同时运行(因为应用线程也在运行,会产生新的对象,如果这些引用会被标记为黑色)它们没有被标记,黑色不会被扫描后变成浮动垃圾,在下一轮被清理(三色标记))。
  2.4.5 并发复位
  清理上面步骤标记的对象,方便下次重新标记。
  如果ParNew采集
器的执行时间为1s,那么CMS采集
器的执行时间就会大于1s。为什么?因为CMS采集
器在执行过程中会分配一部分资源(CPU)给应用线程执行,但是没有STW(用户在初始标记和重新标记时会感觉到STW),用户几乎没有感觉等了很久。
  CMS采集
器的优点:并发采集
、低暂停。
  CMS采集
器的缺点:
  (1). 会和CPU竞争资源(应用线程和CMS线程会同时运行);
  (2). 浮动垃圾(并发标记和并发清理时会产生新的垃圾,只能被下一次gc处理);
  (3). 使用mark-clear算法会产生大量的空间碎片,但是JVM可以通过XX:+UseCMSCompactAtFull采集
参数让jvm清除mark然后整理;
  (4). 在并发标记和并发清理的过程中,会出现同时回收和运行的情况。可能在回收完成之前会再次触发full gc(垃圾会在上次垃圾回收完成之前再次触发),是并发失败(concurrent mode failure),会stop the world,使用Serial old collector来回收。
  2.4.6 CMS相关核心参数
  1.-XX:+UseConcMarkSweepGC:启用cms;
  2. -XX:ConcGCThreads:并发GC线程数;
  3. -XX:+UseCMSCompactAtFull采集
: FullGC后做压缩(减少碎片);
  4. -XX:CMSFullGCsBeforeCompaction:FullGC后压缩多少次,默认0,表示每次FullGC后压缩;
  5. -XX:CMSInitiatingOccupancyFraction:当老年代的使用率达到这个比例(默认是92,是一个百分比)的时候会触发FullGC;
  6、-XX:+UseCMSInitiatingOccupancyOnly:只使用设置的恢复阈值(-XX:CMSInitiatingOccupancyFraction设置的值),如果不指定,JVM只会在第一次使用设置的值,之后会自动调整;
  7. -XX:+CMSScavengeBeforeRemark:在CMS GC之前启动一次minor gc,目的是减少老年代对新生代的引用,减少CMS GC标记阶段的开销。一般CMS 80%的GC时间都在标记阶段;
  
  8、-XX:+CMSParallellnitialMarkEnabled:表示初始标记时多线程执行,缩短STW;
  9、-XX:+CMSParallelRemarkEnabled:remarking时多线程执行,缩短STW;
  2.5 G1 垃圾采集
器 2.5.1 G1 垃圾采集
器简介
  在 JDK9 中,默认的垃圾采集
器变成了 G1。在 JDK9 中,CMS 仍然可以使用,但不推荐使用。在JDK8中,也可以使用G1,但不推荐。G1采集
器(-XX:+UseG1GC),G1(Garbage-First)是面向服务器的垃圾采集
器,主要针对配备多处理器和大容量内存的机器,同时具有高吞吐量的特点。
  G1将java堆内存划分为大小相等的独立区域(Regions),JVM最多可以有2048个Region。如果一个内存是4G(4096M),那么每个Region平均就是2M。当然也可以通过参数“-XX:G1HeapRegionSize”手动指定Region大小,但建议使用默认的计算方式。
  G1保留了新生代和老年代的概念,但不再是物理隔离。它们都是(可以是不连续的)Region 集合。比如一个Region之前可能是新生代,如果Region被垃圾回收了,后面可能又变了。变成了晚年。
  默认情况下,新生代占堆内存的5%。如果heap size为4096M,那么young generation大约占用200MB内存,对应100个Region左右。可以通过“-XX:G1NewSizePercent”设置新生代的初始比例。在系统运行的过程中,JVM会不断的给年轻代增加Region,但是年轻代的最大比例不会超过60%,可以通过“-XX:G1MaxNewSizePercent”来调整。年轻代中Eden和Survivor对应的region也和之前一样。默认值为 8:1:1。假设新生代有1000个region,eden区有800个,s0有100个,s1有100个。
  G1和其他垃圾采集
器的区别在于对大对象的处理。G1有一个Region叫做Humongous区,专门用来分配大对象,而不是直接进入老年代。在G1中,如果一个大对象超过了Region的50%,就会被放到Humongous区域。如果一个对象的内存是1.5M,就直接放到Humongous里面。如果一个对象的内存是6M,那么它会被放置在三个连续的Humongous区。
  2.5.2 G1采集器运行过程
  初始标记:挂起所有其他线程,记录gc roots直接引用的对象,非常快(STW);
  并发标记:同CMS并发标记;
  Final markup: remark with CMS (will STW);
  Filter recovery(类似于CMS并发清理,只是STW):根据用户预期的GC暂停STW时间指定回收(可以通过JVM参数指定:-XX:MaxGCPauseMills),比如old generation中1000个region满了,但是因为按照预期的停顿时间,这次恢复可能是200毫秒(如果没有设置参数-XX:MaxGCPauseMills,默认是200ms),通过计算可知,恢复800的可能只需要200毫秒regions,所以会回收800个region(采集
Set,待回收的采集
),剩下的200个region会在下次垃圾回收时回收,尽量把GC停顿时间控制在我们设定的时间范围内。不管是年轻一代还是老一代,回收算法主要使用复制算法(G1整体上是一种标记算法),将一个区域中存活的对象复制到另一个区域中,不会像CMS那样被回收 因为有很多内存碎片需要回收整理一次,G1使用复制算法回收几乎没有内存碎片。G1 采集
器在后台维护一个优先级列表。每次根据允许回收时间,优先回收价值最高的区域。比如一个region可以在200ms回收10M垃圾,另一个region可以在50ms回收10M垃圾。在有限的情况下,G1当然会优先回收后面的区域。不会像CMS那样被回收 因为有很多内存碎片需要整理一次,所以G1使用复制算法回收几乎没有内存碎片。G1 采集
器在后台维护一个优先级列表。每次根据允许回收时间,优先回收价值最高的区域。比如一个region可以在200ms回收10M垃圾,另一个region可以在50ms回收10M垃圾。在有限的情况下,G1当然会优先回收后面的区域。不会像CMS那样被回收 因为有很多内存碎片需要整理一次,所以G1使用复制算法回收几乎没有内存碎片。G1 采集
器在后台维护一个优先级列表。每次根据允许回收时间,优先回收价值最高的区域。比如一个region可以在200ms回收10M垃圾,另一个region可以在50ms回收10M垃圾。在有限的情况下,G1当然会优先回收后面的区域。优先考虑回收价值最高的地区。比如一个region可以在200ms回收10M垃圾,另一个region可以在50ms回收10M垃圾。在有限的情况下,G1当然会优先回收后面的区域。优先考虑回收价值最高的地区。比如一个region可以在200ms回收10M垃圾,另一个region可以在50ms回收10M垃圾。在有限的情况下,G1当然会优先回收后面的区域。
  2.5.3 G1采集器特点
  并行和并发:G1可以充分利用CPU和多核环境的硬件优势,使用多个CPU(CPU或CPU核心)来缩短Stop-The-World暂停时间。其他一些采集
器原本需要停止Java线程执行GC动作,但G1采集
器仍然可以让Java程序继续并发执行。
  分代采集
:虽然G1可以独立管理整个GC堆而不需要其他采集
器的配合,但是它仍然保留了分代的概念。
  空间整合:与CMS的“mark-clean”算法不同,G1是一个整体基于“mark-sort”算法的采集
器;它是在本地基于“复制”算法实现的。
  可预测的暂停:这是 G1 相对于 CMS 的另一大优势。减少暂停时间是 G1 和 CMS 共同关心的问题。不过,除了追求低停顿之外,G1 还可以建立一个可预测的停顿时间模型,允许用户或明确指定在 M 毫秒的时间段内完成垃圾采集
(由参数“-XX:MaxGCPauseMillis”指定) .
  毫无疑问,能够由用户指定预期的停顿时间是G1采集
器非常强大的功能。设置不同的预期停顿时间可以让G1在不同的应用场景下,在关注吞吐量和关注延迟之间取得最佳平衡。不过,这里设定的“期望值”一定要切合实际,不能异想天开。毕竟G1是冻结用户线程复制对象,停顿时间再低也得有个限度。它的默认暂停目标是 200 毫秒。一般来说,回收阶段占用几十到一百甚至接近200毫秒是正常的,但是如果我们把暂停时间调整到一个很低的值,比如设置为20毫秒,最有可能的结果是因为暂停目标时间太短,每次选择的采集
集合只占用堆内存的一小部分,采集
器的采集
速度逐渐跟不上分配器的分配速度,导致垃圾堆积。采集
器很可能一开始可以从空闲堆内存中获得一些喘息时间,但是应用程序运行时间长了就不行了,最终堆满会导致Full GC降低性能,所以预期的停顿时间通常设置为一两百毫秒或者两三百毫秒会比较合理。
  2.5.4 G1垃圾采集
分类
  YoungGC:YoungGC并不是说当现有的Eden区满了就立即触发。当G1触发YoungGC时,会判断触发时间是否接近设定的时间(默认为200ms)。如果没有关闭,则不会立即触发。YoungGC会不断的给Eden区增加空间(默认是5%,最大不会超过60%),只有在关闭的时候才会触发YoungGC。
  MixedGC:当老年代占用堆内存的比例达到45%时(可以通过参数-XX:InitiatingHeapOccupancyPercent设置),触发MixedGC,回收所有Young和部分Old(决定垃圾回收的优先级)按照预期的GC停顿时间顺序在old区)和大对象区(Humongous area)。(MixedGC会回收 G1的Humongous区)
  FullGC:在做复制算法的过程中(对内存空间要求比较高),需要将每个region中存活的对象复制到其他region中。如果在复制过程中发现没有足够的空区域来承载复制的对象,则会失败。触发Full GC,触发Full GC会停止系统程序,然后使用单线程进行标记、清理、压缩,为下一次MixedGC腾出一批region。这个过程非常耗时。
  2.5.5 G1采集器参数配置
  -XX:+UseG1GC:使用G1采集
器;
  -XX:ParallelGCThreads:指定GC工作的线程数;
  -XX:G1HeapRegionSize:指定分区大小(1MB~32MB,且必须是2的N次方),默认整个堆分为2048个分区
  -XX:MaxGCPauseMillis:目标暂停时间(默认200ms);
  -XX:G1NewSizePercent:新生代内存的初始空间(默认为整个堆的5%);
  -XX:G1MaxNewSizePercent:新生代的最大内存空间;
  -XX:TargetSurvivorRatio:Survivor区域的填充容量(默认50%)。Survivor区的一组物体(年龄1+年龄2+年龄n多个年龄的物体)总和超过Survivor区的50%。此时,年龄为n(含)及以上的对象将被放入老年代;
  -XX:MaxTenuringThreshold:最大年龄阈值(默认15);
  -XX:InitiatingHeapOccupancyPercent:老年代占用的空间达到整个堆内存的阈值(默认45%),则进行新生代和老年代的混合采集
(MixedGC)。比如我们前面提到的heap,默认有2048个region。如果有接近1000个region,每个region都是老年代region,可能会触发MixedGC;
  -XX:G1MixedGCLiveThresholdPercent (default 85%) 当区域中的存活对象低于该值时,该区域将被回收。如果这个值超过这个值,说明存活对象太多,回收意义不大;
  -XX:G1MixedGCCountTarget:指定一次回收过程中筛选回收的次数(默认8次)。在最后的筛选回收阶段,可以先回收一段时间,然后暂停回收,恢复系统运行,稍后再开始回收,这样就不会让系统单次停太久;
  -XX:G1HeapWastePercent (default 5%):gc过程中腾出的region是否足够阈值。混合回收时,region回收是基于复制算法,将待回收region中存活的对象放到Other Region中,然后清理掉本Region中的所有垃圾对象,从而不断清空新的Region在回收过程中。一旦free Region数量达到堆内存的5%,混合回收就会立即停止,也就是说本次混合回收结束。
  2.5.6 G1采集
器使用场景
  超过 1.50% 的堆被存活的对象占用;
  2、对象分配和提升的速度差异很大;
  3、垃圾回收时间极长,超过1秒;
  堆内存大于4.8GB(推荐值);
  5、停顿时间在500ms以内;
  2.7 ZGC采集
器 2.7.1 ZGC简介
  ZGC是JDK11中新加入的实验性低延迟垃圾采集
器。ZGC可以说是源自Azul System开发的C4(Concurrent Continuously Compacting Collector)采集
器。
  2.7.2 ZGC目标
  1.支持TB级堆;
  2、最大GC停顿时间不超过10ms;
  3.为以后的GC特性打下基础;
  4、最坏情况下,吞吐量会降低15%;
  无分代(临时):我们都知道上一代垃圾采集
器是基于“大多数对象有生有死”的假设。事实上,大多数系统的对象分配行为确实符合这个假设。那为什么ZGC不分代呢?由于分代实现比较麻烦,笔者先实现了一个比较简单好用的单代版本,后期会优化。
  2.7.3 ZGC内存布局
  ZGC采集
器基于Region内存布局,暂不设置分代,使用read barriers、color pointers等技术实现并发mark-sort算法,是一款以低延迟为首要目标的垃圾采集
器. 设备。
  ZGC的Region可以有三种容量,如图3-19所示:大、中、小:
  Small Region(小区域):容量固定为2MB,用于放置小于256KB的小对象。
  Medium Region(中型区域):容量固定为32MB,用于放置大于等于256KB但小于4MB的对象。
  Large Region(大区域):容量不固定,可以动态变化,但必须是2MB的整数倍,用于放置4MB以上的大对象。每个large region只会存储一个large object,这也说明虽然名字叫“large region”,但实际容量可能比medium region要小,最小容量可以低至4MB。Large Region在ZGC的实现中不会进行重分布(重分布是ZGC的一个处理动作,用于采集
器阶段的对象复制,后面会介绍),因为复制大对象的成本非常高。
  2.7.4 彩色指针
  前一个垃圾采集
器的GC信息保存在对象头中,而ZGC垃圾采集
器的GC信息保存在指针中。
  
  每个对象都有一个64位的指针,这64位分为:
  18 位:保留以备后用;
  1位:Finalizable标志位,这个位与并发引用处理有关,表示这个对象只能通过finalizer访问;
  1位:Remapped flag,设置该位的值后,对象不指向relocation set(relocation set表示需要GC
  区域集合);
  1位:Marked1标识;
  1位:Marked0标识,上面的Marked1都是辅助GC的标记对象;
  42位:对象的地址(所以可以支持2^42=4T内存):
  为什么有2个标记标记?
  在每个 GC 周期的开始,使用过的标记位被交换,使在前一个 GC 周期中更正的标记状态无效,并且所有引用都变为未标记。
  GC循环1:使用mark0,循环结束时所有引用标记都会变成01。
  GC循环2:使用mark1,那么期望的mark标记为10,所有的引用都可以remark。
  通过配置ZGC后对对象指针的分析,可以看出对象指针必须是64位的,那么ZGC就不能支持32位的操作系统,同样不能支持压缩指针(CompressedOops,压缩指针也是32位的)
  彩色指针的三大优势:
  1、一旦一个Region的存活对象被remove,这个Region就可以立即被释放并重新使用,而不需要等到整个堆中对该Region的所有引用都被纠正之后才能被清理掉。如果有空闲的Region,ZGC可以完成采集

  2. 颜色指针可以大大减少垃圾回收时使用的内存屏障的数量。ZGC 只使用读屏障。
  3、颜色指针可扩展性强。它可以作为一个可扩展的存储结构来记录更多与对象标记和重定位过程相关的数据,以便在未来进一步提高性能。
  2.7.5 读屏障
  在并发重分配的过程中,ZGC通过复制算法将原来的region(里面的对象)移动到另一个region,需要更新新的地址。什么时候更新?这个过程是一个懒惰的过程,它不会一直更新。当我从堆中获取旧对象值时,我得到了一个引用。此引用的颜色指针在进行并发标记时更改了颜色。在旧的引用过程中,颜色指针部分也被接管了。取的时候会加一个read barrier,判断指针是否被修改。如果它已被修改,它将在内部将旧引用移动到已使用的更新地址。转发表记录了旧对象到新对象的转发关系。
  2.7.6 ZGC问题及解决方案
  ZGC最大的问题是漂浮垃圾。ZGC的停顿时间在10ms以下,但是ZGC的执行时间还是比这个时间长了很多。如果ZGC的整个过程需要执行10分钟,这期间由于对象分配率高,会产生大量的新对象。这些对象很难进入本次GC,只能在下一次GC中回收。这些对象只能等到下一次GC才能回收的对象是浮动垃圾。
  解决方案
  目前唯一的办法就是增加堆的容量,让程序获得更多的喘息时间,但这也是治标不治本。如果要从根本上解决这个问题,还是需要引入分代采集
,让新的对象都在一个专门的区域创建。
  2.7.7 ZGC参数设置
  启用ZGC比较简单,设置JVM参数即可:-XX:+UnlockExperimentalVMOptions "-XX:+UseZGC"。调优并不难,因为ZGC的调优参数不多,远没有CMS复杂。和G1一样,可以调优的参数比较少,大部分工作都可以由JVM自动完成。ZGC可以调优的参数如下图:
  3. 垃圾回收底层算法实现 3.1 三色标记
  在gc过程或者并发标记过程中,主要有三种颜色
  黑色:表示对该对象的所有引用都已被垃圾采集
器扫描过,是一个活的(非垃圾)对象;
  灰色:表示这个对象至少有一个引用没有被垃圾采集
器扫描过;
  白色:表示这个对象还没有被垃圾采集
器访问过(没有对象被gc root引用,对象不可达);
  3.2 多标签漂浮垃圾
  因为应用线程没有停止(执行栈线程,没有STW机制,即栈线程中局部变量表、操作数栈、动态链接、方法出口的指针不指向堆内存),会有多标签(非垃圾对象被标记为垃圾对象),多标签(浮动垃圾)会在下次垃圾回收时被清除。
  3.3 缺失标签——读写障碍
  缺失标记:A-&gt;D,开头后面没有加法,B-&gt;D,开头后面有去掉。A不会被重新扫描,B重新扫描后也无法扫描D;D(以后会删除)会漏掉(阿里巴巴可能会问),D不是垃圾对象,会被标记为垃圾对象。造成程序严重错误。
  增量更新:在并发标记的过程中,将赋值(新引用)保存在一个集合中,(重标记时是为了解决并发标记时多标记或漏标记的问题,找到新添加记录的引用并重新扫描);简单理解:新添加的引用源和被引用对象记录在一个集合中(底层是C++),源引用用黑色标注。(一旦黑色对象有了新插入的对白色对象的引用,它就变成了灰色对象)
  原创
快照(Snapshot At The Beginning, SATB):(没看懂,再听一遍)在赋值前将旧的引用以快照的形式保存在集合中。在remarking的过程中,采集
中的所有引用都被标记为黑色,如果是黑色,则本轮不回收(会变成浮动垃圾,下轮回收)。
  增量更新和原创
快照都是通过写屏障来记录的。
  Write barrier:增加新的引用或减少引用是通过赋值来实现的。无论是增量更新还是原创
快照引用的记录,都必须采集
到集合中,无论是赋值前还是赋值后(代码中的操作屏障),通过write barrier记录到集合中
  赋值前后做一些处理(有点像AOP),(write barrier)写前操作,(write barrier)写后操作(增量更新)。
  CMS 实现写屏障+增量更新来处理丢失的标签。(写操作异步处理以提高性能)
  为什么G1使用原创
快照,而CMS使用增量更新来处理丢失的标签?
  因为CMS在增量更新时会继续扫描节点对象的引用,所以G1不会再深度扫描原创
快照中的对象,而是简单地标记它们,等待下一轮GC进行深度扫描。(G1有很多不同的region,CMS是老年代区域,如果再深度重新扫描,G1的成本会比CMS高)。
  4.内存设置和卡表
  Remember Set:为了解决新生代中对象的引用被老年代引用的问题,专门在新生代的内存中设置了这些老年代引用的对象(不会有很多交叉)生成引用),并且这些对象的集合使用内存集调用。
  Cardtable:Cardtable和memory set就像Java语言中HashMap和Map的关系。内存集是用卡表实现的,内存区域(卡页)在老年代是一块块划分的,或者叫页内存卡(约512字节)。如果page memory(card)中有指向young的对象 如果在generation中有对象,则将这个card page标记为dirty。卡表(Cardtable)的底层实现是一个数组,数组中每个元素对应的内存区域称为页内存(card page)。卡表底层也是通过write barrier实现的。卡页在老年代,卡表在新生代(堆)。
  5.如何选择垃圾采集

  1、优先调整堆的大小,让服务器自己选择;
  2.如果内存小于100M,使用串口采集
器;
  3、如果是单核,没有停顿时间要求,serial或者JVM可以自己选择;
  4.如果允许暂停时间超过1秒,选择parallel或者JVM来选择;
  5、如果响应时间最重要,不能超过1秒,使用并发采集
器;
  6、4G以下可以用parallel,4-8G可以用ParNew+CMS,8G以上可以用G1,几百G以上可以用ZGC;
  6. 安全点和安全区
  安全点:在做GC的过程中,不要想做就马上做GC。当用户线程在做GC的时候,会判断flag是什么(比如0和1,1表示到达安全点,0没有到达,所有用户线程都会轮询看这个flag)当用户线程flags全为1,就会被挂起,当所有用户线程flags都为1时(都到达安全点时),就会触发GC。
  安全点的位置主要有以下几点:
  1、方法返回前;
  2.调用方法后;
  3.抛出异常的位置;
  4.循环结束;
  安全区:是为正在执行的线程确定的。比如一个线程处于休眠状态,无法响应JVM的中断请求,进而运行到Safe Point。因此,JVM引入了Safe Region,也就是说在一个代码块中,引用关系不会发生变化,在这个区域的任何地方启动GC都是安全的。
  总结
  例如:常见的垃圾采集
算法mark-copy algorithm, mark-clear algorithm, mark-sort algorithm,常见的垃圾采集
器Serial, Parallel, ParNew, CMS, G1, ZGC,主要是三种垃圾:CMS, G1, ZGC 的运行collector的流程,并发标记过程中的missing mark问题,以及相应的解决方案。
  解决方案:摄像头采集的图像可以用调用opencv处理吗
  用
  OpenCV打开USB摄像头时,两个软件采集到的图像结果分别是以上两张,我用OpenCV采集的第一张图片
  第二张图是用别人的软件采集
的,感觉色差好大,在OpenCV中我觉得相机本身的很多属性都设置不定,原因是两个软件使用的库不同,而且拍到的图片默认参数不同,所以想用DirectShow, 据说有一些东西可以在里面设置属性。
  安装直接显示
  1. 下载、安装和配置 OpenCV
  2.免费下载直接显示,哈哈(
  )
  3. 解压缩到 OpenCV 所在的文件夹。
  4. VS2010 新 Win32 项目,空文档。
  5. 配置 OpenCV(还有很多其他文章,这里就不提了)。
  6. 配置直接显示:在属性管理器中,在 VC++ 目录收录
项的直接显示下添加收录
文件路径。
  在库中的 DirectShow 下添加库路径。
  7.将 CameraDS.h CameraDS.cpp 和目录 DirectShow 复制到您的项目中
  此路径收录
所需的实验过程。它也可以下载到CameraDS.h CameraDS.cpp。
  8.如有必要,在属性管理器的常规下,将使用Unicode字符集更改为unset,这样可以避免一些编译错误。//
  /
  使用 DirectShow 拍摄视频
  作者:于世琪 ()
  //由于:
  HardyAI@OpenCV 中国/
  /flymanbox@OpenCV 中国(表彰他对功能相机名称和帧宽/高设置的贡献)
  最后修改日期:2009 年 4 月 9 日
  //
  使用说明:
  将 CameraDS.h CameraDS.cpp 和目录 DirectShow 复制到您的项目中
  项目->设置->设置:(所有配置)->C/C++->类别(预处理器)->其他收录
目录
  设置为直接显示/收录
  项目->设置->设置:(所有配置)->链接->类别(输入)->其他库目录
  设置为 DirectShow/Lib//
  /
  #include
  #include “相机DS.h”
  #include
  常量字符 *g_szTitle = “相机”;
  int main()
  
  {
  1. 考虑到已经有
  一个窗口显示图像,无需再次驾驶相机,即使你开车下来,相机也已经被占用了。
  if(IsWindowVisible(FindWindow(NULL, g_szTitle)))
  {
  返回 (-1);
  }
  只需获取摄像机数量
  int m_iCamCount = CCameraDS::CameraCount();
  printf(“There are 有 %d camera.\n”, m_iCamCount);
  if(m_iCamCount == 0)
  {
  返回 (-1);
  }
  CCameraDS m_CamDS;
  获取所有摄像机的名称
  for(int i = 0; i < m_iCamCount; i++)
  {
  字符 szCamName[1024];
  int retval = m_CamDS.CameraName(i, szCamName, sizeof(szCamName));
  if(retval >0)
  {
  printf(“Camera #%d's Name is '%s'.\n”, i, szCamName);
  }
  还
  {
  printf(“无法获取相机 #%d 的名称。\n”, i);
  }
  }
  2.考虑到如果有多个摄像头,或者其中一个或几个被其他程序占用,则需要逐个遍历它们
  直到找到一个可用。
  int m_iCamNum = 0;相机编号
  IplImage *pFrame = NULL;
  而(m_iCamNum < m_iCamCount)
  {
  
  if((! m_CamDS.OpenCamera(m_iCamNum, true , 320, 240)) ||((pFrame = m_CamDS.QueryFrame()) == NULL))
  {
  m_iCamNum++;
  }
  还
  { // 找到合适的相机并退出循环。
  破;
  }
  关闭
  相机,您必须将其关闭,因为下一次测试即将进行,并且在检测之前必须清除当前足迹。
  m_CamDS.关闭相机();
  }
  if(m_iCamNum == m_iCamCount)
  {
  fprintf(stderr, “无法打开相机或被其他应用程序使用。\n”);
  返回 (-1);
  }
  cvNamedWindow(g_szTitle);
  显示
  cvShowImage(g_szTitle, pFrame);
  而(1)
  {
  获取框架
  pFrame = m_CamDS.QueryFrame();
  显示
  cvShowImage(g_szTitle, pFrame);
  if (cvWaitKey(20) == 'q')
  {
  破;
  }
  }
  m_CamDS.关闭相机();你可以不调用这个函数,CCameraDS会在相机被破坏时自动关闭相机
  cvDestroyWindow(g_szTitle);
  返回 0;
  }

优化的解决方案:ribbon负载均衡算法_软负载均衡算法

采集交流优采云 发表了文章 • 0 个评论 • 138 次浏览 • 2022-11-24 16:30 • 来自相关话题

  优化的解决方案:ribbon负载均衡算法_软负载均衡算法
  大家好,我是你们的好朋友Strones。今天就来聊聊ribbon负载均衡算法_软负载均衡算法,希望大家对编程的认识更上一层楼。
  一、丝带介绍
  Ribbon 是 Netflix 发布的负载均衡器,有助于控制 HTTP 和 TCP 客户端的行为。为Ribbon配置服务提供者地址列表后,Ribbon可以根据一定的负载均衡算法自动帮助服务消费者进行请求。Ribbon默认为我们提供了很多负载均衡算法,比如round robin、random等,当然我们也可以为Ribbon实现自定义的负载均衡算法。
  一个。循环规则
  默认情况下,轮询规则也是很多高级规则中退避的策略
  BaseLoadBalancer类中的setRule方法
  b. 可用性过滤规则
  会过滤掉开熔断的服务或者并发连接数高的服务
  C。加权响应时间规则
  通过服务的平均响应时间,给每个服务一个权重。响应时间越长,权重越小,启动统计不足,应用轮询策略
  // 开启权重配置
spring-cloud-order-service.ribbon.NFLoadBalancerRuleClassName=com.gupaoedu.springcloud.example.springclouduserservice.GpDefineIpHashRule
  d. 重试规则
  首先遵循轮询策略,如果请求服务失败,会在指定时间(30s)内重试
  e. 最佳可用规则
  先过滤掉断路器的服务,然后选择并发最少的那个
  F。随机规则
  获得随机服务
  2.RoundRobinRule轮询
   public Server choose(ILoadBalancer lb, Object key) {

if (lb == null) {

log.warn("no load balancer");
return null;
}
Server server = null;
int count = 0;
while (server == null && count++ = 10) {

log.warn("No available alive servers after 10 tries from load balancer: "
+ lb);
}
return server;
}
  3.RandomRule随机
   /** * Randomly choose from all living servers */
@edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE")
public Server choose(ILoadBalancer lb, Object key) {

if (lb == null) {

return null;
}
Server server = null;
while (server == null) {

if (Thread.interrupted()) {

return null;
}
List upList = lb.getReachableServers();
List allList = lb.getAllServers();
int serverCount = allList.size();
if (serverCount == 0) {

/* * No servers. End regardless of pass, because subsequent passes * only get more restrictive. */
return null;
}
int index = chooseRandomInt(serverCount);
server = upList.get(index);
if (server == null) {

/* * The only time this should happen is if the server list were * somehow trimmed. This is a transient condition. Retry after * yielding. */
Thread.yield();
continue;
}
if (server.isAlive()) {

return (server);
}
// Shouldn't actually happen.. but must be transient or a bug.
server = null;
<p>
Thread.yield();
}
return server;
}
</p>
  4.RetryRule重试
  默认先使用round-robin算法(IRule subRule = new RoundRobinRule()),再使用retry算法;
  默认是0.5s重试一次(long maxRetryMillis = 500)
<p>package com.netflix.loadbalancer;
import com.netflix.client.config.IClientConfig;
public class RetryRule extends AbstractLoadBalancerRule {

IRule subRule = new RoundRobinRule();
long maxRetryMillis = 500;
public RetryRule() {

}
public RetryRule(IRule subRule) {

this.subRule = (subRule != null) ? subRule : new RoundRobinRule();
}
public RetryRule(IRule subRule, long maxRetryMillis) {

this.subRule = (subRule != null) ? subRule : new RoundRobinRule();
this.maxRetryMillis = (maxRetryMillis > 0) ? maxRetryMillis : 500;
}
public void setRule(IRule subRule) {

this.subRule = (subRule != null) ? subRule : new RoundRobinRule();
}
public IRule getRule() {

return subRule;
}
public void setMaxRetryMillis(long maxRetryMillis) {

if (maxRetryMillis > 0) {

this.maxRetryMillis = maxRetryMillis;
} else {

this.maxRetryMillis = 500;
}
}
public long getMaxRetryMillis() {

return maxRetryMillis;
}
@Override
public void setLoadBalancer(ILoadBalancer lb) {

super.setLoadBalancer(lb);
subRule.setLoadBalancer(lb);
}
/* * Loop if necessary. Note that the time CAN be exceeded depending on the * subRule, because we're not spawning additional threads and returning * early. */
//具体重试代码
public Server choose(ILoadBalancer lb, Object key) {

long requestTime = System.currentTimeMillis();
long deadline = requestTime + maxRetryMillis;
Server answer = null;
answer = subRule.choose(key);
if (((answer == null) || (!answer.isAlive()))
&& (System.currentTimeMillis() 查看全部

  优化的解决方案:ribbon负载均衡算法_软负载均衡算法
  大家好,我是你们的好朋友Strones。今天就来聊聊ribbon负载均衡算法_软负载均衡算法,希望大家对编程的认识更上一层楼。
  一、丝带介绍
  Ribbon 是 Netflix 发布的负载均衡器,有助于控制 HTTP 和 TCP 客户端的行为。为Ribbon配置服务提供者地址列表后,Ribbon可以根据一定的负载均衡算法自动帮助服务消费者进行请求。Ribbon默认为我们提供了很多负载均衡算法,比如round robin、random等,当然我们也可以为Ribbon实现自定义的负载均衡算法。
  一个。循环规则
  默认情况下,轮询规则也是很多高级规则中退避的策略
  BaseLoadBalancer类中的setRule方法
  b. 可用性过滤规则
  会过滤掉开熔断的服务或者并发连接数高的服务
  C。加权响应时间规则
  通过服务的平均响应时间,给每个服务一个权重。响应时间越长,权重越小,启动统计不足,应用轮询策略
  // 开启权重配置
spring-cloud-order-service.ribbon.NFLoadBalancerRuleClassName=com.gupaoedu.springcloud.example.springclouduserservice.GpDefineIpHashRule
  d. 重试规则
  首先遵循轮询策略,如果请求服务失败,会在指定时间(30s)内重试
  e. 最佳可用规则
  先过滤掉断路器的服务,然后选择并发最少的那个
  F。随机规则
  获得随机服务
  2.RoundRobinRule轮询
   public Server choose(ILoadBalancer lb, Object key) {

if (lb == null) {

log.warn("no load balancer");
return null;
}
Server server = null;
int count = 0;
while (server == null && count++ = 10) {

log.warn("No available alive servers after 10 tries from load balancer: "
+ lb);
}
return server;
}
  3.RandomRule随机
   /** * Randomly choose from all living servers */
@edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE")
public Server choose(ILoadBalancer lb, Object key) {

if (lb == null) {

return null;
}
Server server = null;
while (server == null) {

if (Thread.interrupted()) {

return null;
}
List upList = lb.getReachableServers();
List allList = lb.getAllServers();
int serverCount = allList.size();
if (serverCount == 0) {

/* * No servers. End regardless of pass, because subsequent passes * only get more restrictive. */
return null;
}
int index = chooseRandomInt(serverCount);
server = upList.get(index);
if (server == null) {

/* * The only time this should happen is if the server list were * somehow trimmed. This is a transient condition. Retry after * yielding. */
Thread.yield();
continue;
}
if (server.isAlive()) {

return (server);
}
// Shouldn't actually happen.. but must be transient or a bug.
server = null;
<p>
Thread.yield();
}
return server;
}
</p>
  4.RetryRule重试
  默认先使用round-robin算法(IRule subRule = new RoundRobinRule()),再使用retry算法;
  默认是0.5s重试一次(long maxRetryMillis = 500)
<p>package com.netflix.loadbalancer;
import com.netflix.client.config.IClientConfig;
public class RetryRule extends AbstractLoadBalancerRule {

IRule subRule = new RoundRobinRule();
long maxRetryMillis = 500;
public RetryRule() {

}
public RetryRule(IRule subRule) {

this.subRule = (subRule != null) ? subRule : new RoundRobinRule();
}
public RetryRule(IRule subRule, long maxRetryMillis) {

this.subRule = (subRule != null) ? subRule : new RoundRobinRule();
this.maxRetryMillis = (maxRetryMillis > 0) ? maxRetryMillis : 500;
}
public void setRule(IRule subRule) {

this.subRule = (subRule != null) ? subRule : new RoundRobinRule();
}
public IRule getRule() {

return subRule;
}
public void setMaxRetryMillis(long maxRetryMillis) {

if (maxRetryMillis > 0) {

this.maxRetryMillis = maxRetryMillis;
} else {

this.maxRetryMillis = 500;
}
}
public long getMaxRetryMillis() {

return maxRetryMillis;
}
@Override
public void setLoadBalancer(ILoadBalancer lb) {

super.setLoadBalancer(lb);
subRule.setLoadBalancer(lb);
}
/* * Loop if necessary. Note that the time CAN be exceeded depending on the * subRule, because we're not spawning additional threads and returning * early. */
//具体重试代码
public Server choose(ILoadBalancer lb, Object key) {

long requestTime = System.currentTimeMillis();
long deadline = requestTime + maxRetryMillis;
Server answer = null;
answer = subRule.choose(key);
if (((answer == null) || (!answer.isAlive()))
&& (System.currentTimeMillis()

解决方案:UNDO自动管理和手工管理、闪回操作、表空间的空间管理算法

采集交流优采云 发表了文章 • 0 个评论 • 39 次浏览 • 2022-11-24 04:37 • 来自相关话题

  解决方案:UNDO自动管理和手工管理、闪回操作、表空间的空间管理算法
  撤消表空间 --“ 使用回滚段在数据修改前保存旧映像
  如何管理回滚段:
  SQL>
SQL> show parameter undo_management

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
SQL> show parameter undo_tablespace

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace string UNDOTBS1
SQL>
  SQL>
SQL>
SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/system01.dbf
/u02/oradata/CDB1/sysaux01.dbf
/u02/oradata/CDB1/undotbs01.dbf
/u02/oradata/CDB1/pdbseed/system01.dbf
/u02/oradata/CDB1/pdbseed/sysaux01.dbf
/u02/oradata/CDB1/users01.dbf
/u02/oradata/CDB1/pdbseed/undotbs01.dbf
/u02/oradata/CDB1/pdb1/system01.dbf
/u02/oradata/CDB1/pdb1/sysaux01.dbf
/u02/oradata/CDB1/pdb1/undotbs01.dbf
/u02/oradata/CDB1/pdb1/users01.dbf

11 rows selected.

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT
SQL>
SQL> alter session set container=PDB1;

Session altered.

SQL> create undo tablespace undotbs2 datafile &#39;/u02/oradata/CDB1/pdb1/undotbs02.dbf&#39; size 10m;

Tablespace created.

SQL>
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;

SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_3588498444$ UNDOTBS1 ONLINE
_SYSSMU2_2971032042$ UNDOTBS1 ONLINE
_SYSSMU3_3657342154$ UNDOTBS1 ONLINE
_SYSSMU4_811969446$ UNDOTBS1 ONLINE
_SYSSMU5_3018429039$ UNDOTBS1 ONLINE
_SYSSMU6_442110264$ UNDOTBS1 ONLINE
_SYSSMU7_2728255665$ UNDOTBS1 ONLINE
_SYSSMU8_801938064$ UNDOTBS1 ONLINE
_SYSSMU9_647420285$ UNDOTBS1 ONLINE
_SYSSMU10_2262159254$ UNDOTBS1 ONLINE

SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
_SYSSMU11_2950309372$ UNDOTBS2 OFFLINE
_SYSSMU12_3550765581$ UNDOTBS2 OFFLINE
_SYSSMU13_2003268147$ UNDOTBS2 OFFLINE
_SYSSMU14_200385032$ UNDOTBS2 OFFLINE
_SYSSMU15_2315478656$ UNDOTBS2 OFFLINE
_SYSSMU16_3694721358$ UNDOTBS2 OFFLINE
_SYSSMU17_302315325$ UNDOTBS2 OFFLINE
_SYSSMU18_2589589835$ UNDOTBS2 OFFLINE
_SYSSMU19_2290367767$ UNDOTBS2 OFFLINE
_SYSSMU20_459963109$ UNDOTBS2 OFFLINE

21 rows selected.

SQL>
  SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/system01.dbf
/u02/oradata/CDB1/sysaux01.dbf
/u02/oradata/CDB1/undotbs01.dbf
/u02/oradata/CDB1/pdbseed/system01.dbf
/u02/oradata/CDB1/pdbseed/sysaux01.dbf
/u02/oradata/CDB1/users01.dbf
/u02/oradata/CDB1/pdbseed/undotbs01.dbf
/u02/oradata/CDB1/pdb1/system01.dbf
/u02/oradata/CDB1/pdb1/sysaux01.dbf
/u02/oradata/CDB1/pdb1/undotbs01.dbf
/u02/oradata/CDB1/pdb1/users01.dbf
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/pdb1/undotbs02.dbf
12 rows selected.
SQL> create undo tablespace undotbs2 datafile &#39;/u02/oradata/CDB1/undotbs02.dbf&#39; size 10m;
Tablespace created.
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/system01.dbf
/u02/oradata/CDB1/sysaux01.dbf
/u02/oradata/CDB1/undotbs01.dbf
/u02/oradata/CDB1/pdbseed/system01.dbf
/u02/oradata/CDB1/pdbseed/sysaux01.dbf
/u02/oradata/CDB1/users01.dbf
/u02/oradata/CDB1/pdbseed/undotbs01.dbf
/u02/oradata/CDB1/pdb1/system01.dbf
/u02/oradata/CDB1/pdb1/sysaux01.dbf
/u02/oradata/CDB1/pdb1/undotbs01.dbf
/u02/oradata/CDB1/pdb1/users01.dbf
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/pdb1/undotbs02.dbf
/u02/oradata/CDB1/undotbs02.dbf
13 rows selected.
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_1261223759$ UNDOTBS1 ONLINE
_SYSSMU2_27624015$ UNDOTBS1 ONLINE
_SYSSMU3_2421748942$ UNDOTBS1 ONLINE
_SYSSMU4_625702278$ UNDOTBS1 ONLINE
_SYSSMU5_2101348960$ UNDOTBS1 ONLINE
_SYSSMU6_813816332$ UNDOTBS1 ONLINE
_SYSSMU7_2329891355$ UNDOTBS1 ONLINE
_SYSSMU8_399776867$ UNDOTBS1 ONLINE
_SYSSMU9_1692468413$ UNDOTBS1 ONLINE
_SYSSMU10_930580995$ UNDOTBS1 ONLINE
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
_SYSSMU11_819496071$ UNDOTBS2 OFFLINE
_SYSSMU12_3852438105$ UNDOTBS2 OFFLINE
_SYSSMU13_4053449264$ UNDOTBS2 OFFLINE
_SYSSMU14_3568283922$ UNDOTBS2 OFFLINE
_SYSSMU15_4273800205$ UNDOTBS2 OFFLINE
_SYSSMU16_3358818169$ UNDOTBS2 OFFLINE
_SYSSMU17_1656102559$ UNDOTBS2 OFFLINE
_SYSSMU18_3046128593$ UNDOTBS2 OFFLINE
_SYSSMU19_2820437463$ UNDOTBS2 OFFLINE
_SYSSMU20_1569246834$ UNDOTBS2 OFFLINE
21 rows selected.
SQL>
  SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/system01.dbf
/u02/oradata/CDB1/sysaux01.dbf
/u02/oradata/CDB1/undotbs01.dbf
/u02/oradata/CDB1/pdbseed/system01.dbf
/u02/oradata/CDB1/pdbseed/sysaux01.dbf
/u02/oradata/CDB1/users01.dbf
/u02/oradata/CDB1/pdbseed/undotbs01.dbf
/u02/oradata/CDB1/pdb1/system01.dbf
/u02/oradata/CDB1/pdb1/sysaux01.dbf
/u02/oradata/CDB1/pdb1/undotbs01.dbf
/u02/oradata/CDB1/pdb1/users01.dbf
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/pdb1/undotbs02.dbf
12 rows selected.
SQL> create undo tablespace undotbs2 datafile &#39;/u02/oradata/CDB1/undotbs02.dbf&#39; size 10m;
Tablespace created.
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/system01.dbf
/u02/oradata/CDB1/sysaux01.dbf
/u02/oradata/CDB1/undotbs01.dbf
/u02/oradata/CDB1/pdbseed/system01.dbf
/u02/oradata/CDB1/pdbseed/sysaux01.dbf
/u02/oradata/CDB1/users01.dbf
/u02/oradata/CDB1/pdbseed/undotbs01.dbf
/u02/oradata/CDB1/pdb1/system01.dbf
/u02/oradata/CDB1/pdb1/sysaux01.dbf
/u02/oradata/CDB1/pdb1/undotbs01.dbf
/u02/oradata/CDB1/pdb1/users01.dbf
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/pdb1/undotbs02.dbf
/u02/oradata/CDB1/undotbs02.dbf
13 rows selected.
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_1261223759$ UNDOTBS1 ONLINE
_SYSSMU2_27624015$ UNDOTBS1 ONLINE
_SYSSMU3_2421748942$ UNDOTBS1 ONLINE
_SYSSMU4_625702278$ UNDOTBS1 ONLINE
_SYSSMU5_2101348960$ UNDOTBS1 ONLINE
_SYSSMU6_813816332$ UNDOTBS1 ONLINE
_SYSSMU7_2329891355$ UNDOTBS1 ONLINE
_SYSSMU8_399776867$ UNDOTBS1 ONLINE
_SYSSMU9_1692468413$ UNDOTBS1 ONLINE
_SYSSMU10_930580995$ UNDOTBS1 ONLINE
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
_SYSSMU11_819496071$ UNDOTBS2 OFFLINE
_SYSSMU12_3852438105$ UNDOTBS2 OFFLINE
_SYSSMU13_4053449264$ UNDOTBS2 OFFLINE
_SYSSMU14_3568283922$ UNDOTBS2 OFFLINE
_SYSSMU15_4273800205$ UNDOTBS2 OFFLINE
_SYSSMU16_3358818169$ UNDOTBS2 OFFLINE
_SYSSMU17_1656102559$ UNDOTBS2 OFFLINE
_SYSSMU18_3046128593$ UNDOTBS2 OFFLINE
_SYSSMU19_2820437463$ UNDOTBS2 OFFLINE
_SYSSMU20_1569246834$ UNDOTBS2 OFFLINE
21 rows selected.
SQL> show user
USER is "SYS"
SQL> col username for a10
SQL> select s.USERNAME,t.XIDUSN,t.USED_UBLK from v$session s, v$transaction t where t.SES_ADDR=s.SADDR;
USERNAME XIDUSN USED_UBLK
---------- ---------- ----------
SCOTT 8 20
SCOTT 2 1
SQL>
SQL> select name from v$rollname where usn=8;
NAME
------------------------------
_SYSSMU8_399776867$
SQL> select name from v$rollname where usn=2;
NAME
------------------------------
_SYSSMU2_27624015$
SQL>
  撤消手动管理
  SQL>
SQL> show parameter undo_management
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
SQL> show parameter undo_tablespace
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace string UNDOTBS1
SQL>
SQL> alter system set undo_management=manual scope=spfile
2 ;
System altered.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>
SQL> startup
ORACLE instance started.
Total System Global Area 629145392 bytes
Fixed Size 9137968 bytes
Variable Size 184549376 bytes
Database Buffers 427819008 bytes
Redo Buffers 7639040 bytes
Database mounted.
Database opened.
SQL> show parameter undo_management
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string MANUAL
SQL>
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_1261223759$ UNDOTBS1 OFFLINE
_SYSSMU2_27624015$ UNDOTBS1 OFFLINE
_SYSSMU3_2421748942$ UNDOTBS1 OFFLINE
_SYSSMU4_625702278$ UNDOTBS1 OFFLINE
_SYSSMU5_2101348960$ UNDOTBS1 OFFLINE
_SYSSMU6_813816332$ UNDOTBS1 OFFLINE
_SYSSMU7_2329891355$ UNDOTBS1 OFFLINE
_SYSSMU8_399776867$ UNDOTBS1 OFFLINE
_SYSSMU9_1692468413$ UNDOTBS1 OFFLINE
_SYSSMU10_930580995$ UNDOTBS1 OFFLINE
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
_SYSSMU11_819496071$ UNDOTBS2 OFFLINE
_SYSSMU12_3852438105$ UNDOTBS2 OFFLINE
_SYSSMU13_4053449264$ UNDOTBS2 OFFLINE
_SYSSMU14_3568283922$ UNDOTBS2 OFFLINE
_SYSSMU15_4273800205$ UNDOTBS2 OFFLINE
_SYSSMU16_3358818169$ UNDOTBS2 OFFLINE
_SYSSMU17_1656102559$ UNDOTBS2 OFFLINE
_SYSSMU18_3046128593$ UNDOTBS2 OFFLINE
_SYSSMU19_2820437463$ UNDOTBS2 OFFLINE
_SYSSMU20_1569246834$ UNDOTBS2 OFFLINE
21 rows selected.
SQL>
  切换到手动管理 UNDO 表空间以执行更新语句时,会遇到以下错误:
  [oracle@oracle-db-19c ~]$
[oracle@oracle-db-19c ~]$ sqlplus scott/tiger@PDB1
SQL*Plus: Release 19.0.0.0.0 - Production on Wed Nov 23 11:04:26 2022
<p>
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Last Successful login time: Wed Nov 23 2022 10:46:24 +08:00
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> show user
USER is "SCOTT"
SQL>
SQL> set pagesize 200
SQL> set linesize 200
SQL>
SQL> update e01 set sal=sal+1;
update e01 set sal=sal+1
*
ERROR at line 1:
ORA-01552: cannot use system rollback segment for non-system tablespace &#39;USERS&#39;
SQL> </p>
  将表 e01 移动到系统表空间后,表更新可用。
  SQL>
SQL> alter table e01 move tablespace system;
Table altered.
SQL>
SQL> update e01 set sal=sal+1;
14 rows updated.
SQL> roll
Rollback complete.
SQL>
SQL>
  尝试在 Scott 用户下进行表构建实验:
  SQL>
SQL>
SQL> select * from tab
2 ;
TNAME TABTYPE CLUSTERID
-------------------------------------------------------------------------------------------------------------------------------- ------------- ----------
T02 TABLE
T01 TABLE
T03 TABLE
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
DETAIL_DEPT TABLE
VU10 VIEW
VUTEST VIEW
E01 TABLE
TEMP TABLE
TEMP02 TABLE
OB1 TABLE
14 rows selected.
SQL>
SQL>
SQL>
SQL> create table e02 as select * from emp;
create table e02 as select * from emp
*
ERROR at line 1:
ORA-01552: cannot use system rollback segment for non-system tablespace &#39;USERS&#39;
SQL> desc e02;
ERROR:
ORA-04043: object e02 does not exist
SQL> create table e02 as select * from emp where 1=0;
Table created.
SQL> desc e02;
Name Null? Type
----------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------
EMPNO NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
SQL>
  结论:可以创建一个空表,但不能创建收录
数据的表。表之所以能成功,是因为deferred_segment_creation是开放的。(延迟段创建)。
  SQL>显示参数段
  名称类型值
  ------------------------------------ ----------- ------------------------------
  deferred_segment_creation布尔值为 TRUE
  rollback_segments字符串
  transactions_per_rollback_segment整数 5
  SQL>
  让我们尝试关闭此延迟分段创建,以查看 SCOTT 用户是否可以继续创建表?如下图所示:
  [oracle@oracle-db-19c ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Wed Nov 23 15:55:34 2022
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> alter session set container=PDB1;
Session altered.
SQL> show con_name;
CON_NAME
------------------------------
PDB1
SQL> show parameter segment
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation boolean TRUE
rollback_segments string
transactions_per_rollback_segment integer 5
SQL> alter system set deferred_segment_creation=FALSE;
System altered.
SQL> show parameter segment
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation boolean FALSE
rollback_segments string
transactions_per_rollback_segment integer 5
SQL>
  结论是,您可以简单地创建一个没有数据的表,但不能创建一个带有数字的表。
  SQL> create table e02 as select * from emp;
create table e02 as select * from emp
*
ERROR at line 1:
ORA-01552: cannot use system rollback segment for non-system tablespace &#39;USERS&#39;
SQL> create table e03 as select * from emp where 1=0;
Table created.
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
-------------------------------------------------------------------------------------------------------------------------------- ------------- ----------
T02 TABLE
T01 TABLE
T03 TABLE
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
DETAIL_DEPT TABLE
VU10 VIEW
VUTEST VIEW
E01 TABLE
TEMP TABLE
TEMP02 TABLE
E03 TABLE
OB1 TABLE
15 rows selected.
SQL>
  手动管理回滚段:
  创建回滚段 RBS1 表空间 UNDOTBS1;
  创建回滚段 RBS2 表空间 UNDOTBS1;
  创建回滚段 RBS3 表空间 UNDOTBS1;
  更改系统集 rollback_segments=&#39;RBS1&#39;,&#39;RBS2&#39;, &#39;RBS3&#39; 范围=spfile;
  SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_3588498444$ UNDOTBS1 OFFLINE
_SYSSMU2_2971032042$ UNDOTBS1 OFFLINE
_SYSSMU3_3657342154$ UNDOTBS1 OFFLINE
_SYSSMU4_811969446$ UNDOTBS1 OFFLINE
_SYSSMU5_3018429039$ UNDOTBS1 OFFLINE
_SYSSMU6_442110264$ UNDOTBS1 OFFLINE
_SYSSMU7_2728255665$ UNDOTBS1 OFFLINE
_SYSSMU8_801938064$ UNDOTBS1 OFFLINE
_SYSSMU9_647420285$ UNDOTBS1 OFFLINE
_SYSSMU10_2262159254$ UNDOTBS1 OFFLINE
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
_SYSSMU11_2950309372$ UNDOTBS2 OFFLINE
_SYSSMU12_3550765581$ UNDOTBS2 OFFLINE
_SYSSMU13_2003268147$ UNDOTBS2 OFFLINE
_SYSSMU14_200385032$ UNDOTBS2 OFFLINE
_SYSSMU15_2315478656$ UNDOTBS2 OFFLINE
_SYSSMU16_3694721358$ UNDOTBS2 OFFLINE
_SYSSMU17_302315325$ UNDOTBS2 OFFLINE
_SYSSMU18_2589589835$ UNDOTBS2 OFFLINE
_SYSSMU19_2290367767$ UNDOTBS2 OFFLINE
_SYSSMU20_459963109$ UNDOTBS2 OFFLINE
21 rows selected.
SQL> create rollback segment rbs1 tablespace UNDOTBS1;
Rollback segment created.
SQL>
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_3588498444$ UNDOTBS1 OFFLINE
_SYSSMU2_2971032042$ UNDOTBS1 OFFLINE
_SYSSMU3_3657342154$ UNDOTBS1 OFFLINE
_SYSSMU4_811969446$ UNDOTBS1 OFFLINE
_SYSSMU5_3018429039$ UNDOTBS1 OFFLINE
_SYSSMU6_442110264$ UNDOTBS1 OFFLINE
_SYSSMU7_2728255665$ UNDOTBS1 OFFLINE
_SYSSMU8_801938064$ UNDOTBS1 OFFLINE
_SYSSMU9_647420285$ UNDOTBS1 OFFLINE
_SYSSMU10_2262159254$ UNDOTBS1 OFFLINE
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
RBS1 UNDOTBS1 OFFLINE
_SYSSMU11_2950309372$ UNDOTBS2 OFFLINE
_SYSSMU12_3550765581$ UNDOTBS2 OFFLINE
_SYSSMU13_2003268147$ UNDOTBS2 OFFLINE
_SYSSMU14_200385032$ UNDOTBS2 OFFLINE
_SYSSMU15_2315478656$ UNDOTBS2 OFFLINE
_SYSSMU16_3694721358$ UNDOTBS2 OFFLINE
_SYSSMU17_302315325$ UNDOTBS2 OFFLINE
_SYSSMU18_2589589835$ UNDOTBS2 OFFLINE
_SYSSMU19_2290367767$ UNDOTBS2 OFFLINE
_SYSSMU20_459963109$ UNDOTBS2 OFFLINE
22 rows selected.
SQL>
  SQL> show parameter rollback
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
fast_start_parallel_rollback string LOW
rollback_segments string
transactions_per_rollback_segment integer 5
SQL>
SQL> shutdown immediate
Pluggable Database closed.
SQL> startup
Pluggable Database opened.
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_3588498444$ UNDOTBS1 OFFLINE
_SYSSMU2_2971032042$ UNDOTBS1 OFFLINE
_SYSSMU3_3657342154$ UNDOTBS1 OFFLINE
_SYSSMU4_811969446$ UNDOTBS1 OFFLINE
_SYSSMU5_3018429039$ UNDOTBS1 OFFLINE
_SYSSMU6_442110264$ UNDOTBS1 OFFLINE
_SYSSMU7_2728255665$ UNDOTBS1 OFFLINE
_SYSSMU8_801938064$ UNDOTBS1 OFFLINE
_SYSSMU9_647420285$ UNDOTBS1 OFFLINE
_SYSSMU10_2262159254$ UNDOTBS1 OFFLINE
RBS1 UNDOTBS1 OFFLINE
_SYSSMU11_2950309372$ UNDOTBS2 OFFLINE
_SYSSMU12_3550765581$ UNDOTBS2 OFFLINE
_SYSSMU13_2003268147$ UNDOTBS2 OFFLINE
_SYSSMU14_200385032$ UNDOTBS2 OFFLINE
_SYSSMU15_2315478656$ UNDOTBS2 OFFLINE
_SYSSMU16_3694721358$ UNDOTBS2 OFFLINE
_SYSSMU17_302315325$ UNDOTBS2 OFFLINE
_SYSSMU18_2589589835$ UNDOTBS2 OFFLINE
_SYSSMU19_2290367767$ UNDOTBS2 OFFLINE
_SYSSMU20_459963109$ UNDOTBS2 OFFLINE
22 rows selected.
SQL>
SQL>
SQL> alter system set rollback_segments=&#39;RBS1&#39; scope=spfile;
System altered.
SQL> startup force
Pluggable Database opened.
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_3588498444$ UNDOTBS1 OFFLINE
_SYSSMU2_2971032042$ UNDOTBS1 OFFLINE
_SYSSMU3_3657342154$ UNDOTBS1 OFFLINE
_SYSSMU4_811969446$ UNDOTBS1 OFFLINE
_SYSSMU5_3018429039$ UNDOTBS1 OFFLINE
_SYSSMU6_442110264$ UNDOTBS1 OFFLINE
_SYSSMU7_2728255665$ UNDOTBS1 OFFLINE
_SYSSMU8_801938064$ UNDOTBS1 OFFLINE
_SYSSMU9_647420285$ UNDOTBS1 OFFLINE
_SYSSMU10_2262159254$ UNDOTBS1 OFFLINE
RBS1 UNDOTBS1 ONLINE
_SYSSMU11_2950309372$ UNDOTBS2 OFFLINE
_SYSSMU12_3550765581$ UNDOTBS2 OFFLINE
_SYSSMU13_2003268147$ UNDOTBS2 OFFLINE
_SYSSMU14_200385032$ UNDOTBS2 OFFLINE
_SYSSMU15_2315478656$ UNDOTBS2 OFFLINE
_SYSSMU16_3694721358$ UNDOTBS2 OFFLINE
_SYSSMU17_302315325$ UNDOTBS2 OFFLINE
_SYSSMU18_2589589835$ UNDOTBS2 OFFLINE
_SYSSMU19_2290367767$ UNDOTBS2 OFFLINE
_SYSSMU20_459963109$ UNDOTBS2 OFFLINE
22 rows selected.
SQL>
  为 DML 操作提供闪回处理
  闪回查询:
  SQL> select * from e01;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
<p>
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 24-JAN-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 02-APR-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL> update e01 set sal = 1;
14 rows updated.
SQL> commit;
Commit complete.
SQL> rollback;
Rollback complete.
SQL> select * from e01;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 1 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1 500 30
7566 JONES MANAGER 7839 02-APR-81 1 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 1 30
7782 CLARK MANAGER 7839 09-JUN-81 1 10
7788 SCOTT ANALYST 7566 24-JAN-87 1 20
7839 KING PRESIDENT 17-NOV-81 1 10
7844 TURNER SALESMAN 7698 08-SEP-81 1 0 30
7876 ADAMS CLERK 7788 02-APR-87 1 20
7900 JAMES CLERK 7698 03-DEC-81 1 30
7902 FORD ANALYST 7566 03-DEC-81 1 20
7934 MILLER CLERK 7782 23-JAN-82 1 10
14 rows selected.
SQL> select * from e01 as of timestamp(sysdate-5/1440);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 24-JAN-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 02-APR-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL> alter table e01 enable row movement;
Table altered.
SQL> flashback table e01 to timestamp(sysdate-5/1440);
Flashback complete.
SQL> select * from e01;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 24-JAN-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 02-APR-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL></p>
  您可以闪回 15 分 900 秒。
  SQL> select * from e01 as of timestamp(sysdate-15/1440);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 24-JAN-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 02-APR-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL>
  闪回版本查询
  SQL> update e01 set sal=sal+100 where deptno=10;
3 rows updated.
SQL> commit;
Commit complete.
SQL> update e01 set sal=sal*1.1 where deptno=30;
6 rows updated.
SQL> commit;
Commit complete.
SQL> update e01 set sal=3;
14 rows updated.
SQL> commit;
Commit complete.
SQL> select * from e01;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 3 20
7499 ALLEN SALESMAN 7698 20-FEB-81 3 300 30
7521 WARD SALESMAN 7698 22-FEB-81 3 500 30
7566 JONES MANAGER 7839 02-APR-81 3 20
7654 MARTIN SALESMAN 7698 28-SEP-81 3 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 3 30
7782 CLARK MANAGER 7839 09-JUN-81 3 10
7788 SCOTT ANALYST 7566 24-JAN-87 3 20
7839 KING PRESIDENT 17-NOV-81 3 10
7844 TURNER SALESMAN 7698 08-SEP-81 3 0 30
7876 ADAMS CLERK 7788 02-APR-87 3 20
7900 JAMES CLERK 7698 03-DEC-81 3 30
7902 FORD ANALYST 7566 03-DEC-81 3 20
7934 MILLER CLERK 7782 23-JAN-82 3 10
14 rows selected.
SQL> --闪回版本查询
SQL> select versions_startscn,versions_endscn,versions_operation,versions_xid,sal from e01 versions between scn_minvalue and maxvalue where empno=7369;
select versions_startscn,versions_endscn,versions_operation,versions_xid,sal from e01 versions between scn_minvalue and maxvalue where empno=7369
*
ERROR at line 1:
ORA-00905: missing keyword
SQL> select
2 versions_startscn,
3 versions_endscn,
4 versions_operation,
5 versions_xid,
6 sal
7 from e01
8 versions between scn minvalue and maxvalue
9 where empno=7369;
VERSIONS_STARTSCN VERSIONS_ENDSCN V VERSIONS_XID SAL
----------------- --------------- - ---------------- ----------
17826843 U 03000300BC030000 3
17826652 17826843 I 070010006E030000 800
17826652 D 070010006E030000 1
17825320 17826652 U 03002000BB030000 1
17825320 800
SQL>
SQL> col versions_starttime for a25;
SQL> col versions_endtime for a25;
SQL> select
2 versions_starttime
3 versions_endtime,
4 --versions_startscn,
5 --versions_endscn,
6 versions_operation,
7 versions_xid,
8 sal
9 from e01
10 versions between scn minvalue and maxvalue
11 where empno=7369;
VERSIONS_ENDTIME V VERSIONS_XID SAL
------------------------- - ---------------- ----------
23-NOV-22 09.55.07 PM U 03000300BC030000 3
23-NOV-22 09.50.16 PM I 070010006E030000 800
23-NOV-22 09.50.16 PM D 070010006E030000 1
1
SQL> --闪回版本查询
SQL> select * from e01 as of scn 17826652;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 24-JAN-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 02-APR-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL> flashback table e01 to scn 17826652;
Flashback complete.
SQL> select * from e01;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 24-JAN-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 02-APR-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL>
  注意:为了进行闪回表操作,您必须首先打开行移动,如果不打开行移动,您将无法执行闪回操作。
  SQL> alter table e01 enable row movement;
Table altered.
  启用追加日志数据模式:
  SQL>
SQL> alter database add supplemental log data;
Database altered.
SQL>
  SQL>
SQL> update e01 set sal=sal*1.15 where deptno=30;
6 rows updated.
SQL>
SQL> select
2 --versions_starttime
3 --versions_endtime,
4 versions_startscn,
5 versions_endscn,
6 versions_operation,
7 versions_xid,
8 sal
9 from e01
10 versions between scn minvalue and maxvalue
11 where empno=7844;
VERSIONS_STARTSCN VERSIONS_ENDSCN V VERSIONS_XID SAL
----------------- --------------- - ---------------- ----------
17846142 I 02000B0061030000 1500
17846142 D 02000B0061030000 3
17846142 3
SQL>
  闪回事务查询
  
select
--versions_starttime
--versions_endtime,
versions_startscn,
versions_endscn,
versions_operation,
versions_xid,
sal
from e01
versions between scn minvalue and maxvalue
where empno=7844;
---闪回事务查询,sys用户才可以查询
SQL> select undo_sql from flashback_transaction_query where xid=&#39;02000B0061030000&#39;;
UNDO_SQL
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
16 rows selected.
SQL>
  事实:大数据采集手段_大数据采集和处理的内容
  大数据采集方式_大数据采集处理内容 大数据开启了数据大规模生产、共享和应用的时代,给技术和商业带来了巨大的变革。麦肯锡研究表明,在医疗、零售和制造领域,大数据每年可以提高劳动生产率0.5-1个百分点。大数据在核心领域的渗透速度是有目共睹的。但调查显示,未被利用的信息比例高达99.4%,这很大程度上是由于无法获取和采集
高价值信息。因此,在大数据时代的背景下,如何从大数据中采集
有用的信息已经是大数据发展的关键因素之一,那么什么是大数据...
  大家好,我是建筑先生,一个会写代码会吟诗的架构师。今天就来说说大数据采集的手段_大数据采集处理的内容,希望能帮助大家进步!!!
  大数据开启了数据大规模生产、共享和应用的时代,给技术和商业带来了巨大变革。麦肯锡研究表明,在医疗、零售和制造领域,大数据每年可以提高劳动生产率0.5-1个百分点。大数据在核心领域的渗透速度是有目共睹的。但调查显示,未被利用的信息比例高达99.4%,这很大程度上是由于无法获取和采集
高价值信息。因此,在大数据时代的背景下,如何从大数据中采集
有用的信息已经是大数据发展的关键因素之一,那么什么是大数据采集
技术呢?本期为大家介绍大数据采集技术,
  ▌什么是数据采集

  数据采集​​(Data Acquisition,DAQ),又称数据采集,是指从传感器等被测器件等模拟和数字被测单元自动采集信息的过程。数据分类 在新一代数据体系中,对传统数据体系中没有考虑到的新数据源进行归纳和分类,可分为上网行为数据和内容数据两大类。
  上网行为数据:页面数据、交互数据、表单数据、会话数据等。
  内容数据:应用日志、电子文档、机器数据、语音数据、社交媒体数据等。
  大数据的主要来源:1)商业数据2)互联网数据3)传感器数据
  ▌数据采集与大数据采集的区别
  
  ▌传统数据采集的不足
  传统的数据采集来源单一,存储、管理和分析的数据量较小,大部分可以通过关系数据库和并行数据仓库进行处理。在依靠并行计算提高数据处理速度方面,传统的并行数据库技术追求高一致性和容错性。按照CAP理论,其可用性和可扩展性是很难保证的。
  ▌大数据采集新方法
  系统日志采集
方法
  很多互联网公司都有自己的海量数据采集工具,多用于系统日志采集,比如Hadoop的Chukwa、Cloudera的Flume、Facebook的Scribe等,这些工具采用分布式架构,可以满足单机上百MB的日志数据第二。采集和传输要求。
  网络数据获取方式
  网络数据采集是指通过网络爬虫或网站公共API从网站获取数据信息。该方法可以将网页中的非结构化数据提取出来,存储为统一的本地数据文件,并进行结构化存储。支持图片、音频、视频等文件或附件的采集
,附件与文本可自动关联。除了网络中收录
的内容外,还可以使用 DPI 或 DFI 等带宽管理技术处理网络流量的采集

  其他数据采集
方法
  对于企业生产经营数据或学科研究数据等保密要求高的数据,可通过与企业或研究机构合作,采用特定系统接口等相关方式采集
数据。
  ▌大数据采集平台
  
  最后给大家介绍几个应用广泛的大数据采集平台,供大家参考。
  1)阿帕奇水槽
  Flume是Apache下一个开源、高可靠、高扩展、易于管理、支持客户扩展的数据采集系统。Flume是使用JRuby构建的,所以它依赖于Java运行环境。
  2)流利
  Fluentd 是另一个开源数据采集
框架。Fluentd使用C/Ruby开发,使用JSON文件统一日志数据。其可插拔架构支持各种类型和格式的数据源和数据输出。最后,它还同时提供了高可靠性和良好的可扩展性。Treasure Data, Inc 为该产品提供支持和维护。
  3) 日志存储
  Logstash是著名的开源数据栈ELK(ElasticSearch、Logstash、Kibana)中的L。Logstash 使用 JRuby 开发,所有运行时都依赖于 JVM。
  4)Splunk转发器
  Splunk 是一个分布式机器数据平台,主要有三个角色: Search Head 负责数据的搜索和处理,提供搜索过程中的信息提取;Indexer负责数据的存储和索引;Forwarder负责数据的采集、清洗、变形,并发送给Indexer
  很多初学者对大数据的概念比较模糊。什么是大数据,它能做什么,什么时候学,应该走什么路线,学完后往哪里发展,想了解更多,想学习欢迎同学们加入大数据学习扣群:805127855,里面有海量干货(零基础进阶经典实战)分享给大家,更有清华毕业资深大数据讲师免费授课,分享国内最全。大数据高端实战实战学习流程体系 查看全部

  解决方案:UNDO自动管理和手工管理、闪回操作、表空间的空间管理算法
  撤消表空间 --“ 使用回滚段在数据修改前保存旧映像
  如何管理回滚段:
  SQL>
SQL> show parameter undo_management

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
SQL> show parameter undo_tablespace

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace string UNDOTBS1
SQL>
  SQL>
SQL>
SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/system01.dbf
/u02/oradata/CDB1/sysaux01.dbf
/u02/oradata/CDB1/undotbs01.dbf
/u02/oradata/CDB1/pdbseed/system01.dbf
/u02/oradata/CDB1/pdbseed/sysaux01.dbf
/u02/oradata/CDB1/users01.dbf
/u02/oradata/CDB1/pdbseed/undotbs01.dbf
/u02/oradata/CDB1/pdb1/system01.dbf
/u02/oradata/CDB1/pdb1/sysaux01.dbf
/u02/oradata/CDB1/pdb1/undotbs01.dbf
/u02/oradata/CDB1/pdb1/users01.dbf

11 rows selected.

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT
SQL>
SQL> alter session set container=PDB1;

Session altered.

SQL> create undo tablespace undotbs2 datafile &#39;/u02/oradata/CDB1/pdb1/undotbs02.dbf&#39; size 10m;

Tablespace created.

SQL>
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;

SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_3588498444$ UNDOTBS1 ONLINE
_SYSSMU2_2971032042$ UNDOTBS1 ONLINE
_SYSSMU3_3657342154$ UNDOTBS1 ONLINE
_SYSSMU4_811969446$ UNDOTBS1 ONLINE
_SYSSMU5_3018429039$ UNDOTBS1 ONLINE
_SYSSMU6_442110264$ UNDOTBS1 ONLINE
_SYSSMU7_2728255665$ UNDOTBS1 ONLINE
_SYSSMU8_801938064$ UNDOTBS1 ONLINE
_SYSSMU9_647420285$ UNDOTBS1 ONLINE
_SYSSMU10_2262159254$ UNDOTBS1 ONLINE

SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
_SYSSMU11_2950309372$ UNDOTBS2 OFFLINE
_SYSSMU12_3550765581$ UNDOTBS2 OFFLINE
_SYSSMU13_2003268147$ UNDOTBS2 OFFLINE
_SYSSMU14_200385032$ UNDOTBS2 OFFLINE
_SYSSMU15_2315478656$ UNDOTBS2 OFFLINE
_SYSSMU16_3694721358$ UNDOTBS2 OFFLINE
_SYSSMU17_302315325$ UNDOTBS2 OFFLINE
_SYSSMU18_2589589835$ UNDOTBS2 OFFLINE
_SYSSMU19_2290367767$ UNDOTBS2 OFFLINE
_SYSSMU20_459963109$ UNDOTBS2 OFFLINE

21 rows selected.

SQL>
  SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/system01.dbf
/u02/oradata/CDB1/sysaux01.dbf
/u02/oradata/CDB1/undotbs01.dbf
/u02/oradata/CDB1/pdbseed/system01.dbf
/u02/oradata/CDB1/pdbseed/sysaux01.dbf
/u02/oradata/CDB1/users01.dbf
/u02/oradata/CDB1/pdbseed/undotbs01.dbf
/u02/oradata/CDB1/pdb1/system01.dbf
/u02/oradata/CDB1/pdb1/sysaux01.dbf
/u02/oradata/CDB1/pdb1/undotbs01.dbf
/u02/oradata/CDB1/pdb1/users01.dbf
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/pdb1/undotbs02.dbf
12 rows selected.
SQL> create undo tablespace undotbs2 datafile &#39;/u02/oradata/CDB1/undotbs02.dbf&#39; size 10m;
Tablespace created.
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/system01.dbf
/u02/oradata/CDB1/sysaux01.dbf
/u02/oradata/CDB1/undotbs01.dbf
/u02/oradata/CDB1/pdbseed/system01.dbf
/u02/oradata/CDB1/pdbseed/sysaux01.dbf
/u02/oradata/CDB1/users01.dbf
/u02/oradata/CDB1/pdbseed/undotbs01.dbf
/u02/oradata/CDB1/pdb1/system01.dbf
/u02/oradata/CDB1/pdb1/sysaux01.dbf
/u02/oradata/CDB1/pdb1/undotbs01.dbf
/u02/oradata/CDB1/pdb1/users01.dbf
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/pdb1/undotbs02.dbf
/u02/oradata/CDB1/undotbs02.dbf
13 rows selected.
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_1261223759$ UNDOTBS1 ONLINE
_SYSSMU2_27624015$ UNDOTBS1 ONLINE
_SYSSMU3_2421748942$ UNDOTBS1 ONLINE
_SYSSMU4_625702278$ UNDOTBS1 ONLINE
_SYSSMU5_2101348960$ UNDOTBS1 ONLINE
_SYSSMU6_813816332$ UNDOTBS1 ONLINE
_SYSSMU7_2329891355$ UNDOTBS1 ONLINE
_SYSSMU8_399776867$ UNDOTBS1 ONLINE
_SYSSMU9_1692468413$ UNDOTBS1 ONLINE
_SYSSMU10_930580995$ UNDOTBS1 ONLINE
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
_SYSSMU11_819496071$ UNDOTBS2 OFFLINE
_SYSSMU12_3852438105$ UNDOTBS2 OFFLINE
_SYSSMU13_4053449264$ UNDOTBS2 OFFLINE
_SYSSMU14_3568283922$ UNDOTBS2 OFFLINE
_SYSSMU15_4273800205$ UNDOTBS2 OFFLINE
_SYSSMU16_3358818169$ UNDOTBS2 OFFLINE
_SYSSMU17_1656102559$ UNDOTBS2 OFFLINE
_SYSSMU18_3046128593$ UNDOTBS2 OFFLINE
_SYSSMU19_2820437463$ UNDOTBS2 OFFLINE
_SYSSMU20_1569246834$ UNDOTBS2 OFFLINE
21 rows selected.
SQL>
  SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/system01.dbf
/u02/oradata/CDB1/sysaux01.dbf
/u02/oradata/CDB1/undotbs01.dbf
/u02/oradata/CDB1/pdbseed/system01.dbf
/u02/oradata/CDB1/pdbseed/sysaux01.dbf
/u02/oradata/CDB1/users01.dbf
/u02/oradata/CDB1/pdbseed/undotbs01.dbf
/u02/oradata/CDB1/pdb1/system01.dbf
/u02/oradata/CDB1/pdb1/sysaux01.dbf
/u02/oradata/CDB1/pdb1/undotbs01.dbf
/u02/oradata/CDB1/pdb1/users01.dbf
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/pdb1/undotbs02.dbf
12 rows selected.
SQL> create undo tablespace undotbs2 datafile &#39;/u02/oradata/CDB1/undotbs02.dbf&#39; size 10m;
Tablespace created.
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/system01.dbf
/u02/oradata/CDB1/sysaux01.dbf
/u02/oradata/CDB1/undotbs01.dbf
/u02/oradata/CDB1/pdbseed/system01.dbf
/u02/oradata/CDB1/pdbseed/sysaux01.dbf
/u02/oradata/CDB1/users01.dbf
/u02/oradata/CDB1/pdbseed/undotbs01.dbf
/u02/oradata/CDB1/pdb1/system01.dbf
/u02/oradata/CDB1/pdb1/sysaux01.dbf
/u02/oradata/CDB1/pdb1/undotbs01.dbf
/u02/oradata/CDB1/pdb1/users01.dbf
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/pdb1/undotbs02.dbf
/u02/oradata/CDB1/undotbs02.dbf
13 rows selected.
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_1261223759$ UNDOTBS1 ONLINE
_SYSSMU2_27624015$ UNDOTBS1 ONLINE
_SYSSMU3_2421748942$ UNDOTBS1 ONLINE
_SYSSMU4_625702278$ UNDOTBS1 ONLINE
_SYSSMU5_2101348960$ UNDOTBS1 ONLINE
_SYSSMU6_813816332$ UNDOTBS1 ONLINE
_SYSSMU7_2329891355$ UNDOTBS1 ONLINE
_SYSSMU8_399776867$ UNDOTBS1 ONLINE
_SYSSMU9_1692468413$ UNDOTBS1 ONLINE
_SYSSMU10_930580995$ UNDOTBS1 ONLINE
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
_SYSSMU11_819496071$ UNDOTBS2 OFFLINE
_SYSSMU12_3852438105$ UNDOTBS2 OFFLINE
_SYSSMU13_4053449264$ UNDOTBS2 OFFLINE
_SYSSMU14_3568283922$ UNDOTBS2 OFFLINE
_SYSSMU15_4273800205$ UNDOTBS2 OFFLINE
_SYSSMU16_3358818169$ UNDOTBS2 OFFLINE
_SYSSMU17_1656102559$ UNDOTBS2 OFFLINE
_SYSSMU18_3046128593$ UNDOTBS2 OFFLINE
_SYSSMU19_2820437463$ UNDOTBS2 OFFLINE
_SYSSMU20_1569246834$ UNDOTBS2 OFFLINE
21 rows selected.
SQL> show user
USER is "SYS"
SQL> col username for a10
SQL> select s.USERNAME,t.XIDUSN,t.USED_UBLK from v$session s, v$transaction t where t.SES_ADDR=s.SADDR;
USERNAME XIDUSN USED_UBLK
---------- ---------- ----------
SCOTT 8 20
SCOTT 2 1
SQL>
SQL> select name from v$rollname where usn=8;
NAME
------------------------------
_SYSSMU8_399776867$
SQL> select name from v$rollname where usn=2;
NAME
------------------------------
_SYSSMU2_27624015$
SQL>
  撤消手动管理
  SQL>
SQL> show parameter undo_management
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
SQL> show parameter undo_tablespace
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace string UNDOTBS1
SQL>
SQL> alter system set undo_management=manual scope=spfile
2 ;
System altered.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>
SQL> startup
ORACLE instance started.
Total System Global Area 629145392 bytes
Fixed Size 9137968 bytes
Variable Size 184549376 bytes
Database Buffers 427819008 bytes
Redo Buffers 7639040 bytes
Database mounted.
Database opened.
SQL> show parameter undo_management
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string MANUAL
SQL>
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_1261223759$ UNDOTBS1 OFFLINE
_SYSSMU2_27624015$ UNDOTBS1 OFFLINE
_SYSSMU3_2421748942$ UNDOTBS1 OFFLINE
_SYSSMU4_625702278$ UNDOTBS1 OFFLINE
_SYSSMU5_2101348960$ UNDOTBS1 OFFLINE
_SYSSMU6_813816332$ UNDOTBS1 OFFLINE
_SYSSMU7_2329891355$ UNDOTBS1 OFFLINE
_SYSSMU8_399776867$ UNDOTBS1 OFFLINE
_SYSSMU9_1692468413$ UNDOTBS1 OFFLINE
_SYSSMU10_930580995$ UNDOTBS1 OFFLINE
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
_SYSSMU11_819496071$ UNDOTBS2 OFFLINE
_SYSSMU12_3852438105$ UNDOTBS2 OFFLINE
_SYSSMU13_4053449264$ UNDOTBS2 OFFLINE
_SYSSMU14_3568283922$ UNDOTBS2 OFFLINE
_SYSSMU15_4273800205$ UNDOTBS2 OFFLINE
_SYSSMU16_3358818169$ UNDOTBS2 OFFLINE
_SYSSMU17_1656102559$ UNDOTBS2 OFFLINE
_SYSSMU18_3046128593$ UNDOTBS2 OFFLINE
_SYSSMU19_2820437463$ UNDOTBS2 OFFLINE
_SYSSMU20_1569246834$ UNDOTBS2 OFFLINE
21 rows selected.
SQL>
  切换到手动管理 UNDO 表空间以执行更新语句时,会遇到以下错误:
  [oracle@oracle-db-19c ~]$
[oracle@oracle-db-19c ~]$ sqlplus scott/tiger@PDB1
SQL*Plus: Release 19.0.0.0.0 - Production on Wed Nov 23 11:04:26 2022
<p>
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Last Successful login time: Wed Nov 23 2022 10:46:24 +08:00
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> show user
USER is "SCOTT"
SQL>
SQL> set pagesize 200
SQL> set linesize 200
SQL>
SQL> update e01 set sal=sal+1;
update e01 set sal=sal+1
*
ERROR at line 1:
ORA-01552: cannot use system rollback segment for non-system tablespace &#39;USERS&#39;
SQL> </p>
  将表 e01 移动到系统表空间后,表更新可用。
  SQL>
SQL> alter table e01 move tablespace system;
Table altered.
SQL>
SQL> update e01 set sal=sal+1;
14 rows updated.
SQL> roll
Rollback complete.
SQL>
SQL>
  尝试在 Scott 用户下进行表构建实验:
  SQL>
SQL>
SQL> select * from tab
2 ;
TNAME TABTYPE CLUSTERID
-------------------------------------------------------------------------------------------------------------------------------- ------------- ----------
T02 TABLE
T01 TABLE
T03 TABLE
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
DETAIL_DEPT TABLE
VU10 VIEW
VUTEST VIEW
E01 TABLE
TEMP TABLE
TEMP02 TABLE
OB1 TABLE
14 rows selected.
SQL>
SQL>
SQL>
SQL> create table e02 as select * from emp;
create table e02 as select * from emp
*
ERROR at line 1:
ORA-01552: cannot use system rollback segment for non-system tablespace &#39;USERS&#39;
SQL> desc e02;
ERROR:
ORA-04043: object e02 does not exist
SQL> create table e02 as select * from emp where 1=0;
Table created.
SQL> desc e02;
Name Null? Type
----------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------
EMPNO NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
SQL>
  结论:可以创建一个空表,但不能创建收录
数据的表。表之所以能成功,是因为deferred_segment_creation是开放的。(延迟段创建)。
  SQL>显示参数段
  名称类型值
  ------------------------------------ ----------- ------------------------------
  deferred_segment_creation布尔值为 TRUE
  rollback_segments字符串
  transactions_per_rollback_segment整数 5
  SQL>
  让我们尝试关闭此延迟分段创建,以查看 SCOTT 用户是否可以继续创建表?如下图所示:
  [oracle@oracle-db-19c ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Wed Nov 23 15:55:34 2022
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> alter session set container=PDB1;
Session altered.
SQL> show con_name;
CON_NAME
------------------------------
PDB1
SQL> show parameter segment
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation boolean TRUE
rollback_segments string
transactions_per_rollback_segment integer 5
SQL> alter system set deferred_segment_creation=FALSE;
System altered.
SQL> show parameter segment
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation boolean FALSE
rollback_segments string
transactions_per_rollback_segment integer 5
SQL>
  结论是,您可以简单地创建一个没有数据的表,但不能创建一个带有数字的表。
  SQL> create table e02 as select * from emp;
create table e02 as select * from emp
*
ERROR at line 1:
ORA-01552: cannot use system rollback segment for non-system tablespace &#39;USERS&#39;
SQL> create table e03 as select * from emp where 1=0;
Table created.
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
-------------------------------------------------------------------------------------------------------------------------------- ------------- ----------
T02 TABLE
T01 TABLE
T03 TABLE
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
DETAIL_DEPT TABLE
VU10 VIEW
VUTEST VIEW
E01 TABLE
TEMP TABLE
TEMP02 TABLE
E03 TABLE
OB1 TABLE
15 rows selected.
SQL>
  手动管理回滚段:
  创建回滚段 RBS1 表空间 UNDOTBS1;
  创建回滚段 RBS2 表空间 UNDOTBS1;
  创建回滚段 RBS3 表空间 UNDOTBS1;
  更改系统集 rollback_segments=&#39;RBS1&#39;,&#39;RBS2&#39;, &#39;RBS3&#39; 范围=spfile;
  SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_3588498444$ UNDOTBS1 OFFLINE
_SYSSMU2_2971032042$ UNDOTBS1 OFFLINE
_SYSSMU3_3657342154$ UNDOTBS1 OFFLINE
_SYSSMU4_811969446$ UNDOTBS1 OFFLINE
_SYSSMU5_3018429039$ UNDOTBS1 OFFLINE
_SYSSMU6_442110264$ UNDOTBS1 OFFLINE
_SYSSMU7_2728255665$ UNDOTBS1 OFFLINE
_SYSSMU8_801938064$ UNDOTBS1 OFFLINE
_SYSSMU9_647420285$ UNDOTBS1 OFFLINE
_SYSSMU10_2262159254$ UNDOTBS1 OFFLINE
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
_SYSSMU11_2950309372$ UNDOTBS2 OFFLINE
_SYSSMU12_3550765581$ UNDOTBS2 OFFLINE
_SYSSMU13_2003268147$ UNDOTBS2 OFFLINE
_SYSSMU14_200385032$ UNDOTBS2 OFFLINE
_SYSSMU15_2315478656$ UNDOTBS2 OFFLINE
_SYSSMU16_3694721358$ UNDOTBS2 OFFLINE
_SYSSMU17_302315325$ UNDOTBS2 OFFLINE
_SYSSMU18_2589589835$ UNDOTBS2 OFFLINE
_SYSSMU19_2290367767$ UNDOTBS2 OFFLINE
_SYSSMU20_459963109$ UNDOTBS2 OFFLINE
21 rows selected.
SQL> create rollback segment rbs1 tablespace UNDOTBS1;
Rollback segment created.
SQL>
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_3588498444$ UNDOTBS1 OFFLINE
_SYSSMU2_2971032042$ UNDOTBS1 OFFLINE
_SYSSMU3_3657342154$ UNDOTBS1 OFFLINE
_SYSSMU4_811969446$ UNDOTBS1 OFFLINE
_SYSSMU5_3018429039$ UNDOTBS1 OFFLINE
_SYSSMU6_442110264$ UNDOTBS1 OFFLINE
_SYSSMU7_2728255665$ UNDOTBS1 OFFLINE
_SYSSMU8_801938064$ UNDOTBS1 OFFLINE
_SYSSMU9_647420285$ UNDOTBS1 OFFLINE
_SYSSMU10_2262159254$ UNDOTBS1 OFFLINE
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
RBS1 UNDOTBS1 OFFLINE
_SYSSMU11_2950309372$ UNDOTBS2 OFFLINE
_SYSSMU12_3550765581$ UNDOTBS2 OFFLINE
_SYSSMU13_2003268147$ UNDOTBS2 OFFLINE
_SYSSMU14_200385032$ UNDOTBS2 OFFLINE
_SYSSMU15_2315478656$ UNDOTBS2 OFFLINE
_SYSSMU16_3694721358$ UNDOTBS2 OFFLINE
_SYSSMU17_302315325$ UNDOTBS2 OFFLINE
_SYSSMU18_2589589835$ UNDOTBS2 OFFLINE
_SYSSMU19_2290367767$ UNDOTBS2 OFFLINE
_SYSSMU20_459963109$ UNDOTBS2 OFFLINE
22 rows selected.
SQL>
  SQL> show parameter rollback
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
fast_start_parallel_rollback string LOW
rollback_segments string
transactions_per_rollback_segment integer 5
SQL>
SQL> shutdown immediate
Pluggable Database closed.
SQL> startup
Pluggable Database opened.
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_3588498444$ UNDOTBS1 OFFLINE
_SYSSMU2_2971032042$ UNDOTBS1 OFFLINE
_SYSSMU3_3657342154$ UNDOTBS1 OFFLINE
_SYSSMU4_811969446$ UNDOTBS1 OFFLINE
_SYSSMU5_3018429039$ UNDOTBS1 OFFLINE
_SYSSMU6_442110264$ UNDOTBS1 OFFLINE
_SYSSMU7_2728255665$ UNDOTBS1 OFFLINE
_SYSSMU8_801938064$ UNDOTBS1 OFFLINE
_SYSSMU9_647420285$ UNDOTBS1 OFFLINE
_SYSSMU10_2262159254$ UNDOTBS1 OFFLINE
RBS1 UNDOTBS1 OFFLINE
_SYSSMU11_2950309372$ UNDOTBS2 OFFLINE
_SYSSMU12_3550765581$ UNDOTBS2 OFFLINE
_SYSSMU13_2003268147$ UNDOTBS2 OFFLINE
_SYSSMU14_200385032$ UNDOTBS2 OFFLINE
_SYSSMU15_2315478656$ UNDOTBS2 OFFLINE
_SYSSMU16_3694721358$ UNDOTBS2 OFFLINE
_SYSSMU17_302315325$ UNDOTBS2 OFFLINE
_SYSSMU18_2589589835$ UNDOTBS2 OFFLINE
_SYSSMU19_2290367767$ UNDOTBS2 OFFLINE
_SYSSMU20_459963109$ UNDOTBS2 OFFLINE
22 rows selected.
SQL>
SQL>
SQL> alter system set rollback_segments=&#39;RBS1&#39; scope=spfile;
System altered.
SQL> startup force
Pluggable Database opened.
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_3588498444$ UNDOTBS1 OFFLINE
_SYSSMU2_2971032042$ UNDOTBS1 OFFLINE
_SYSSMU3_3657342154$ UNDOTBS1 OFFLINE
_SYSSMU4_811969446$ UNDOTBS1 OFFLINE
_SYSSMU5_3018429039$ UNDOTBS1 OFFLINE
_SYSSMU6_442110264$ UNDOTBS1 OFFLINE
_SYSSMU7_2728255665$ UNDOTBS1 OFFLINE
_SYSSMU8_801938064$ UNDOTBS1 OFFLINE
_SYSSMU9_647420285$ UNDOTBS1 OFFLINE
_SYSSMU10_2262159254$ UNDOTBS1 OFFLINE
RBS1 UNDOTBS1 ONLINE
_SYSSMU11_2950309372$ UNDOTBS2 OFFLINE
_SYSSMU12_3550765581$ UNDOTBS2 OFFLINE
_SYSSMU13_2003268147$ UNDOTBS2 OFFLINE
_SYSSMU14_200385032$ UNDOTBS2 OFFLINE
_SYSSMU15_2315478656$ UNDOTBS2 OFFLINE
_SYSSMU16_3694721358$ UNDOTBS2 OFFLINE
_SYSSMU17_302315325$ UNDOTBS2 OFFLINE
_SYSSMU18_2589589835$ UNDOTBS2 OFFLINE
_SYSSMU19_2290367767$ UNDOTBS2 OFFLINE
_SYSSMU20_459963109$ UNDOTBS2 OFFLINE
22 rows selected.
SQL>
  为 DML 操作提供闪回处理
  闪回查询:
  SQL> select * from e01;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
<p>
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 24-JAN-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 02-APR-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL> update e01 set sal = 1;
14 rows updated.
SQL> commit;
Commit complete.
SQL> rollback;
Rollback complete.
SQL> select * from e01;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 1 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1 500 30
7566 JONES MANAGER 7839 02-APR-81 1 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 1 30
7782 CLARK MANAGER 7839 09-JUN-81 1 10
7788 SCOTT ANALYST 7566 24-JAN-87 1 20
7839 KING PRESIDENT 17-NOV-81 1 10
7844 TURNER SALESMAN 7698 08-SEP-81 1 0 30
7876 ADAMS CLERK 7788 02-APR-87 1 20
7900 JAMES CLERK 7698 03-DEC-81 1 30
7902 FORD ANALYST 7566 03-DEC-81 1 20
7934 MILLER CLERK 7782 23-JAN-82 1 10
14 rows selected.
SQL> select * from e01 as of timestamp(sysdate-5/1440);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 24-JAN-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 02-APR-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL> alter table e01 enable row movement;
Table altered.
SQL> flashback table e01 to timestamp(sysdate-5/1440);
Flashback complete.
SQL> select * from e01;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 24-JAN-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 02-APR-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL></p>
  您可以闪回 15 分 900 秒。
  SQL> select * from e01 as of timestamp(sysdate-15/1440);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 24-JAN-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 02-APR-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL>
  闪回版本查询
  SQL> update e01 set sal=sal+100 where deptno=10;
3 rows updated.
SQL> commit;
Commit complete.
SQL> update e01 set sal=sal*1.1 where deptno=30;
6 rows updated.
SQL> commit;
Commit complete.
SQL> update e01 set sal=3;
14 rows updated.
SQL> commit;
Commit complete.
SQL> select * from e01;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 3 20
7499 ALLEN SALESMAN 7698 20-FEB-81 3 300 30
7521 WARD SALESMAN 7698 22-FEB-81 3 500 30
7566 JONES MANAGER 7839 02-APR-81 3 20
7654 MARTIN SALESMAN 7698 28-SEP-81 3 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 3 30
7782 CLARK MANAGER 7839 09-JUN-81 3 10
7788 SCOTT ANALYST 7566 24-JAN-87 3 20
7839 KING PRESIDENT 17-NOV-81 3 10
7844 TURNER SALESMAN 7698 08-SEP-81 3 0 30
7876 ADAMS CLERK 7788 02-APR-87 3 20
7900 JAMES CLERK 7698 03-DEC-81 3 30
7902 FORD ANALYST 7566 03-DEC-81 3 20
7934 MILLER CLERK 7782 23-JAN-82 3 10
14 rows selected.
SQL> --闪回版本查询
SQL> select versions_startscn,versions_endscn,versions_operation,versions_xid,sal from e01 versions between scn_minvalue and maxvalue where empno=7369;
select versions_startscn,versions_endscn,versions_operation,versions_xid,sal from e01 versions between scn_minvalue and maxvalue where empno=7369
*
ERROR at line 1:
ORA-00905: missing keyword
SQL> select
2 versions_startscn,
3 versions_endscn,
4 versions_operation,
5 versions_xid,
6 sal
7 from e01
8 versions between scn minvalue and maxvalue
9 where empno=7369;
VERSIONS_STARTSCN VERSIONS_ENDSCN V VERSIONS_XID SAL
----------------- --------------- - ---------------- ----------
17826843 U 03000300BC030000 3
17826652 17826843 I 070010006E030000 800
17826652 D 070010006E030000 1
17825320 17826652 U 03002000BB030000 1
17825320 800
SQL>
SQL> col versions_starttime for a25;
SQL> col versions_endtime for a25;
SQL> select
2 versions_starttime
3 versions_endtime,
4 --versions_startscn,
5 --versions_endscn,
6 versions_operation,
7 versions_xid,
8 sal
9 from e01
10 versions between scn minvalue and maxvalue
11 where empno=7369;
VERSIONS_ENDTIME V VERSIONS_XID SAL
------------------------- - ---------------- ----------
23-NOV-22 09.55.07 PM U 03000300BC030000 3
23-NOV-22 09.50.16 PM I 070010006E030000 800
23-NOV-22 09.50.16 PM D 070010006E030000 1
1
SQL> --闪回版本查询
SQL> select * from e01 as of scn 17826652;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 24-JAN-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 02-APR-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL> flashback table e01 to scn 17826652;
Flashback complete.
SQL> select * from e01;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 24-JAN-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 02-APR-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL>
  注意:为了进行闪回表操作,您必须首先打开行移动,如果不打开行移动,您将无法执行闪回操作。
  SQL> alter table e01 enable row movement;
Table altered.
  启用追加日志数据模式:
  SQL>
SQL> alter database add supplemental log data;
Database altered.
SQL>
  SQL>
SQL> update e01 set sal=sal*1.15 where deptno=30;
6 rows updated.
SQL>
SQL> select
2 --versions_starttime
3 --versions_endtime,
4 versions_startscn,
5 versions_endscn,
6 versions_operation,
7 versions_xid,
8 sal
9 from e01
10 versions between scn minvalue and maxvalue
11 where empno=7844;
VERSIONS_STARTSCN VERSIONS_ENDSCN V VERSIONS_XID SAL
----------------- --------------- - ---------------- ----------
17846142 I 02000B0061030000 1500
17846142 D 02000B0061030000 3
17846142 3
SQL>
  闪回事务查询
  
select
--versions_starttime
--versions_endtime,
versions_startscn,
versions_endscn,
versions_operation,
versions_xid,
sal
from e01
versions between scn minvalue and maxvalue
where empno=7844;
---闪回事务查询,sys用户才可以查询
SQL> select undo_sql from flashback_transaction_query where xid=&#39;02000B0061030000&#39;;
UNDO_SQL
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
16 rows selected.
SQL>
  事实:大数据采集手段_大数据采集和处理的内容
  大数据采集方式_大数据采集处理内容 大数据开启了数据大规模生产、共享和应用的时代,给技术和商业带来了巨大的变革。麦肯锡研究表明,在医疗、零售和制造领域,大数据每年可以提高劳动生产率0.5-1个百分点。大数据在核心领域的渗透速度是有目共睹的。但调查显示,未被利用的信息比例高达99.4%,这很大程度上是由于无法获取和采集
高价值信息。因此,在大数据时代的背景下,如何从大数据中采集
有用的信息已经是大数据发展的关键因素之一,那么什么是大数据...
  大家好,我是建筑先生,一个会写代码会吟诗的架构师。今天就来说说大数据采集的手段_大数据采集处理的内容,希望能帮助大家进步!!!
  大数据开启了数据大规模生产、共享和应用的时代,给技术和商业带来了巨大变革。麦肯锡研究表明,在医疗、零售和制造领域,大数据每年可以提高劳动生产率0.5-1个百分点。大数据在核心领域的渗透速度是有目共睹的。但调查显示,未被利用的信息比例高达99.4%,这很大程度上是由于无法获取和采集
高价值信息。因此,在大数据时代的背景下,如何从大数据中采集
有用的信息已经是大数据发展的关键因素之一,那么什么是大数据采集
技术呢?本期为大家介绍大数据采集技术,
  ▌什么是数据采集

  数据采集​​(Data Acquisition,DAQ),又称数据采集,是指从传感器等被测器件等模拟和数字被测单元自动采集信息的过程。数据分类 在新一代数据体系中,对传统数据体系中没有考虑到的新数据源进行归纳和分类,可分为上网行为数据和内容数据两大类。
  上网行为数据:页面数据、交互数据、表单数据、会话数据等。
  内容数据:应用日志、电子文档、机器数据、语音数据、社交媒体数据等。
  大数据的主要来源:1)商业数据2)互联网数据3)传感器数据
  ▌数据采集与大数据采集的区别
  
  ▌传统数据采集的不足
  传统的数据采集来源单一,存储、管理和分析的数据量较小,大部分可以通过关系数据库和并行数据仓库进行处理。在依靠并行计算提高数据处理速度方面,传统的并行数据库技术追求高一致性和容错性。按照CAP理论,其可用性和可扩展性是很难保证的。
  ▌大数据采集新方法
  系统日志采集
方法
  很多互联网公司都有自己的海量数据采集工具,多用于系统日志采集,比如Hadoop的Chukwa、Cloudera的Flume、Facebook的Scribe等,这些工具采用分布式架构,可以满足单机上百MB的日志数据第二。采集和传输要求。
  网络数据获取方式
  网络数据采集是指通过网络爬虫或网站公共API从网站获取数据信息。该方法可以将网页中的非结构化数据提取出来,存储为统一的本地数据文件,并进行结构化存储。支持图片、音频、视频等文件或附件的采集
,附件与文本可自动关联。除了网络中收录
的内容外,还可以使用 DPI 或 DFI 等带宽管理技术处理网络流量的采集

  其他数据采集
方法
  对于企业生产经营数据或学科研究数据等保密要求高的数据,可通过与企业或研究机构合作,采用特定系统接口等相关方式采集
数据。
  ▌大数据采集平台
  
  最后给大家介绍几个应用广泛的大数据采集平台,供大家参考。
  1)阿帕奇水槽
  Flume是Apache下一个开源、高可靠、高扩展、易于管理、支持客户扩展的数据采集系统。Flume是使用JRuby构建的,所以它依赖于Java运行环境。
  2)流利
  Fluentd 是另一个开源数据采集
框架。Fluentd使用C/Ruby开发,使用JSON文件统一日志数据。其可插拔架构支持各种类型和格式的数据源和数据输出。最后,它还同时提供了高可靠性和良好的可扩展性。Treasure Data, Inc 为该产品提供支持和维护。
  3) 日志存储
  Logstash是著名的开源数据栈ELK(ElasticSearch、Logstash、Kibana)中的L。Logstash 使用 JRuby 开发,所有运行时都依赖于 JVM。
  4)Splunk转发器
  Splunk 是一个分布式机器数据平台,主要有三个角色: Search Head 负责数据的搜索和处理,提供搜索过程中的信息提取;Indexer负责数据的存储和索引;Forwarder负责数据的采集、清洗、变形,并发送给Indexer
  很多初学者对大数据的概念比较模糊。什么是大数据,它能做什么,什么时候学,应该走什么路线,学完后往哪里发展,想了解更多,想学习欢迎同学们加入大数据学习扣群:805127855,里面有海量干货(零基础进阶经典实战)分享给大家,更有清华毕业资深大数据讲师免费授课,分享国内最全。大数据高端实战实战学习流程体系

解决方案:一款基于AI算法的调查问卷:从产品运营,到技术研发全过程深度剖析

采集交流优采云 发表了文章 • 0 个评论 • 40 次浏览 • 2022-11-23 21:42 • 来自相关话题

  解决方案:一款基于AI算法的调查问卷:从产品运营,到技术研发全过程深度剖析
  我用最简单粗暴的形式,给大家讲讲一个横跨运营、产品、技术三个部门的问卷调查项目背后发生的事情。生命周期,并从代码层面展示了一套初级人工智能算法是如何挖掘用户数据的,那么这套算法对商城等线上产品有什么作用呢?简单来说,产品之间的相关性是通过算法计算出来的。下面我从运营、产品、技术三个维度带大家一步步做这个项目。
  项目总体步骤
  项目背景
  广电智能机顶盒覆盖率高达80%,覆盖数千万用户。我们的产品是基于广电内网智能机顶盒的网上超市业务。以新零售为切入点,用户在家用机顶盒下单,配送到社区附近的超市,双十二需要提前备货,库存准确与否直接影响成败本次活动的。商家希望能够预知某种商品的需求,提前备货。运营部门需要线上线下配合做好。活动,所以除了提前了解客户对不同产品的需求外,最重要的是做出准确的推荐,
  第一步:运营部门任务
  线下运营方案:线下运营的主要流程是先拿出一个线下的促销方案,然后市场部拿着这个方案和之前合作过的超市商谈促销细节,请他们提供场地支持和优惠券支持,并敲定具体的推广地点和时间,然后进入小区找小区物业或居委会协商在小区进行本地推送的时间和地点。由于是政府项目,居委会积极响应,活动进行得很顺利。后期,我们请当地的推送团队带上易拉宝和DM单,同时进入小区和周边超市进行预热宣传。由于本文主要讲解线上操作,所以这里不再赘述线下操作。我已经描述过了,我会发一篇后续文章来一步步指导你。
  在线新媒体运营计划: 关于在线新媒体运营部分,这里简单介绍一下。主要渠道为地方各大垂直领域的自媒体、报纸、地方电视媒体报道等。
  线上产品运营方案:这次主要讲线上产品运营。拿到这个项目只需要老板一句话。要做双12,销量一定要翻倍。自己找资源协调,自己想方案,运营工作就是这样。一开始,你无从下手,你不知道先做什么,然后你需要有强烈的目标感。迷茫的时候,想想源头。我为什么要这样做?对于这次活动,如果要做线上运营,第一步就是基础数据分析。那么有人会说,如果是冷启动阶段,没有数据怎么办。当然,还有其他的数据分析渠道。后面再说,先看下图,是双十一期间的销售数据。
  1.首先分析一下这次活动的目的
  基于这三个目的,我们不仅要做同比数据对比,还要关注双11期间的数据。上图是双11期间的后台统计。最后,我们从数据中分析出几款购买频率比较高的产品。发现米粉油等刚需品的购买频率最高,其次是酒水饮料,所以这些产品是本次问卷涉及的主要维度,并基于这些进行深度数据挖掘方面。
  2、要有一个稳定而强大的执行团队,团队协调也是一种运营
  只有有了产品,新媒体和本地推广才能介入。否则连问卷都没有,就去宣传预热,你的投入就白费了。
  
  事实上,产品部门和运营部门的主要矛盾在于工作内容的界限模糊。有些产品的工作其实离不开运维提出的建议,甚至有些运维人员还要为产品写需求文档。所以后期会出现一个现象,很明显就是运营人员的价值输出。产品经理会拿去给老板讨功劳,说这个产品的idea是自己的idea,会让运营人员很不爽。舒适,后期直接导致产品缺乏创意,如何才能取得好的运营效果?
  因此,更靠谱的方案是统一团队KPI。运营、产品、技术三个部门的KPI相互关联,利益共同体,优劣分明。唯一的入口和出口,项目经理的核心作用是降低团队内部和团队之间的沟通成本,克服项目中出现的问题。
  相信大家都遇到过那种,你有事问他,明明听不懂就假装不屑的回答,或者直接给你一个QQ号或者手机号,让你自己沟通低效的领导无形中增加了团队内部大量的沟通成本,导致项目成本居高不下,团队人员流失率增加。有了强大的团队,就到了设计产品的时候了。
  3.产品设计思路是做一个H5做的问卷
  H5问卷的最大优势是多平台适配,开发周期短,开发成本低。非常适合线上线下多渠道的推广活动。有人会说,这和普通的问卷没什么区别。常见的问卷都是这种形式,无非是让用户做一些选择题。其实问卷的背后是用户画像,这是一个很大的话题。那些普通的问卷缺乏用户参与感。一个很简单的例子,当你删除电脑软件的时候,他会问你为什么删除。有多少人真的会按照自己的意愿去选择,点右上角的关闭按钮就可以了。说到底,这种问卷缺乏参与感。
  问题一:如何解决问卷调查参与感低的问题
  那么如何解决以往调查没有参与感的问题呢?这很简单。我用倒计时十秒抢答,让用户有一种紧迫感,用户也不知道还剩下多少问题,总觉得下一次就是下一次。红包准备好了,就做到最后,但是不建议太多,10-15个左右就够了,保证1分钟内用户可以选择就可以了。
  问题二:如何解决用户身份与奖品绑定步骤问题,层次太深
  所谓的用户身份绑定步骤太深了,就是在问卷调查涉及到奖品的时候,需要给用户绑定奖品。手机号登录,用户需要操作的流程是输入手机号点击发送验证码--&gt;点击短信推送输入短信详情--&gt;记住验证码--&gt; 返回调查页面 --&gt; 输入验证码点击确定,我之前做过数据分析,每增加一个用户等级,用户流失率会增加20%,也就是之前的问卷调查法会流失80%以上的用户,那我给你算一下,你花1W用钱推,比如获客成本是2元,5,可吸引000人参与问卷调查。经过以上四步,每一步都会流失20%的用户,即最终流失5000*80%=4000人。也就是说,真正的获客成本从2元增加到了10元。如果你这次活动吸引了一万人,你的老板就要多花八万元。10万人呢,10万人,现在你能看出用户层级有多重要吗?
  所以要解决这个问题,我们需要尽可能的降低用户等级,能在一级解决的都在一级解决,所以我用服务器直接分配用户唯一优惠码并绑定它在后台奖励。用户只需要在最后一页点击保存优惠码图片,支付时直接使用即可。两个问题的解决方案如下图所示:
  4. 运营产品规划案例的交付、审核和分发
  至此,线上运营产品规划案例完成,采集
UE和问卷调查需要采集
的用户标签,下发给产品部。其实大家可以看到运营部门其实已经帮产品做了一部分工作,所以这就是刚才说的运营和产品工作内容界限模糊的原因。
  
  第二步:产品部任务一,编写需求文档
  需求文档的原则是将运营部门的用户需求转化为技术可以理解的功能需求,从控件的大小,组件颜色的颜色编号,到每个功能的细节,以及甚至一些技术选型。并且要体现数据交互策略,从而节省技术部门的沟通成本。由于本项目主要配合运营时间节点,适合采用敏捷开发方式。我直接把需求文档和UE图整合起来,效果如下。
  2. 产品资料交付技术部。开发说的“不可能”是真的吗?
  拿着需求文档和技术部开产品会,经常遇到的问题就是技术部会找各种借口说实现不了。最后为了保证基本功能,对产品进行妥协,对运营进行妥协,以保证按时上线。只是大家只能为惨不忍睹的PVUV买单,奖金什么的都别想了。真的不可能吗?技术部的人真的很懒吗?真的是技术部的人多报了工期?
  技术部和产品运营部性格最大的不同,一个是想一劳永逸,一个是不断想开发新玩法,不断提升用户体验。对于技术部门人员来说,他们认为最理想的系统是健壮的系统。技术部门提出什么要求,不需要改代码,告诉他们后台怎么配置就可以了。对于产品运营者来说,每一个活动都必须是不同的、不同的、有新数据的。埋了,所以就出现了上面的矛盾,那么怎么解决呢?
  1.先尽快提出需求,切记今天不要提出来,这种行为会让技术部门很反感。
  2、一切以运营部门的标准为准,因为运营部门是与市场关系最密切的部门,所以提出的建议和诉求是市场调研和数据分析的结果,确保满足需求运营部门是大前提。
  3. 如果现有需求与原有的技术选型和数据架构有太多冲突,只能深入探讨,抽丝剥茧,在保证运营需求的前提下,做一些适当的妥协。有时候技术解决不了的问题,可以通过优化交互设计来解决,比如列表页的点赞功能。如果每次都放like的话,服务器压力还是挺大的。如果数据库不用redis,服务器容易宕机,更换数据库成本太高。建一个项目太不现实了,所以通过优化交互设计,把点赞功能放多一些,评论功能放浅一些,
  4、产品操作人员多了解一些技术知识是非常有必要的。至少在和技术部门交涉的时候,他们可以知道自己是不是在夸大问题。,那就只能直接把需求文档设计稿发项目立项邮件@Boss@各部局长,从上到下分配任务。
  第三步:技术部任务 1. 获取需求文档并分配任务
  本次问卷调查项目,需要用到的技术岗位有web前端、测试工程师、java后端工程师、项目经理。这四个岗位的任务由项目经理根据要求分配到各个岗位,可以根据时间进度安排。开发完成,测试通过上线后,项目迭代结束。
  项目经理的工作职责:控制项目整体进度和成本,发现需求问题及时与其他部门沟通,编写接口文档,攻克技术难题。Java后台任务:完善接口文档,根据需求文档和接口文档搭建后台数据库,实现接口函数,实现相关算法函数。Web前端任务:实现问卷页面效果与后台接口对接,适配不同分辨率的设备。测试任务:根据需求文档编写测试用例,测试项目整体功能,做好适配测试和jmeter压力测试。2.专注于关联算法,最基础的人工智能,
  这种线上运营的本质之一就是利用关联算法来增加用户非理性购买的概率,达到提升消费转化的效果。那么什么是关联算法呢?最简单的例子,你去淘宝看一个包包,然后拉到页面底部,会有一个猜你喜欢的,里面的内容是根据关联算法计算出来的,然后精准推送给你,所以很多人说,我知道这个叫关联算法,但是作为运营商,你如何使用关联算法,作为技术人员开发关联算法应该从哪里入手呢?把我用java实现的关联算法代码拿出来给大家参考。
  技巧:自媒体实时热点工具分享,追热点的自媒体工具,不错过自媒体运营方法
  自媒体人想要在最短的时间内获得更多的流量,最好的捷径就是关注热点。追热点之后,很有可能制造出爆款文章。
  如何提高追热点的速度,首先你得有一个好的内容源,也就是说有热点你要及时知道,还得能快速搜索素材. 这个一般需要借助工具,下面就给大家推荐一下。几个让你更好关注热点的自媒体工具:
  一、今日头条:热词分析
  打开今日头条作者首页,点击功能实验室,会看到一个热词分析工具,点击进入分析页面。
  
  热词分析工具:会有最新的实时热点文章,关键词和具体的热点情况。您可以随时了解热门事件,也可以搜索关键词查看相关热度。
  2、编写简单——实时热点监控
  打开易转,进入数据研究院,右侧会有实时热点监测页面,里面有今天的热词,明天的发现,还有今天的热点图。在实时热点栏目中,可以看到百度热搜、微博热搜、各自媒体平台的热搜。掌握。
  
  3.微博热搜榜
  这应该是大家最常用的平台了。微博用户多,信息流通速度快。是追热点必不可少的工具。
  不过,微博的一大优势就是可以帮助你及时掌握实时热点。缺点是微博内容比较混乱,不利于采集
信息。过滤信息需要时间。
  好吧,这里有一些重要的工具,我今天要告诉你,以帮助大家加快速度。 查看全部

  解决方案:一款基于AI算法的调查问卷:从产品运营,到技术研发全过程深度剖析
  我用最简单粗暴的形式,给大家讲讲一个横跨运营、产品、技术三个部门的问卷调查项目背后发生的事情。生命周期,并从代码层面展示了一套初级人工智能算法是如何挖掘用户数据的,那么这套算法对商城等线上产品有什么作用呢?简单来说,产品之间的相关性是通过算法计算出来的。下面我从运营、产品、技术三个维度带大家一步步做这个项目。
  项目总体步骤
  项目背景
  广电智能机顶盒覆盖率高达80%,覆盖数千万用户。我们的产品是基于广电内网智能机顶盒的网上超市业务。以新零售为切入点,用户在家用机顶盒下单,配送到社区附近的超市,双十二需要提前备货,库存准确与否直接影响成败本次活动的。商家希望能够预知某种商品的需求,提前备货。运营部门需要线上线下配合做好。活动,所以除了提前了解客户对不同产品的需求外,最重要的是做出准确的推荐,
  第一步:运营部门任务
  线下运营方案:线下运营的主要流程是先拿出一个线下的促销方案,然后市场部拿着这个方案和之前合作过的超市商谈促销细节,请他们提供场地支持和优惠券支持,并敲定具体的推广地点和时间,然后进入小区找小区物业或居委会协商在小区进行本地推送的时间和地点。由于是政府项目,居委会积极响应,活动进行得很顺利。后期,我们请当地的推送团队带上易拉宝和DM单,同时进入小区和周边超市进行预热宣传。由于本文主要讲解线上操作,所以这里不再赘述线下操作。我已经描述过了,我会发一篇后续文章来一步步指导你。
  在线新媒体运营计划: 关于在线新媒体运营部分,这里简单介绍一下。主要渠道为地方各大垂直领域的自媒体、报纸、地方电视媒体报道等。
  线上产品运营方案:这次主要讲线上产品运营。拿到这个项目只需要老板一句话。要做双12,销量一定要翻倍。自己找资源协调,自己想方案,运营工作就是这样。一开始,你无从下手,你不知道先做什么,然后你需要有强烈的目标感。迷茫的时候,想想源头。我为什么要这样做?对于这次活动,如果要做线上运营,第一步就是基础数据分析。那么有人会说,如果是冷启动阶段,没有数据怎么办。当然,还有其他的数据分析渠道。后面再说,先看下图,是双十一期间的销售数据。
  1.首先分析一下这次活动的目的
  基于这三个目的,我们不仅要做同比数据对比,还要关注双11期间的数据。上图是双11期间的后台统计。最后,我们从数据中分析出几款购买频率比较高的产品。发现米粉油等刚需品的购买频率最高,其次是酒水饮料,所以这些产品是本次问卷涉及的主要维度,并基于这些进行深度数据挖掘方面。
  2、要有一个稳定而强大的执行团队,团队协调也是一种运营
  只有有了产品,新媒体和本地推广才能介入。否则连问卷都没有,就去宣传预热,你的投入就白费了。
  
  事实上,产品部门和运营部门的主要矛盾在于工作内容的界限模糊。有些产品的工作其实离不开运维提出的建议,甚至有些运维人员还要为产品写需求文档。所以后期会出现一个现象,很明显就是运营人员的价值输出。产品经理会拿去给老板讨功劳,说这个产品的idea是自己的idea,会让运营人员很不爽。舒适,后期直接导致产品缺乏创意,如何才能取得好的运营效果?
  因此,更靠谱的方案是统一团队KPI。运营、产品、技术三个部门的KPI相互关联,利益共同体,优劣分明。唯一的入口和出口,项目经理的核心作用是降低团队内部和团队之间的沟通成本,克服项目中出现的问题。
  相信大家都遇到过那种,你有事问他,明明听不懂就假装不屑的回答,或者直接给你一个QQ号或者手机号,让你自己沟通低效的领导无形中增加了团队内部大量的沟通成本,导致项目成本居高不下,团队人员流失率增加。有了强大的团队,就到了设计产品的时候了。
  3.产品设计思路是做一个H5做的问卷
  H5问卷的最大优势是多平台适配,开发周期短,开发成本低。非常适合线上线下多渠道的推广活动。有人会说,这和普通的问卷没什么区别。常见的问卷都是这种形式,无非是让用户做一些选择题。其实问卷的背后是用户画像,这是一个很大的话题。那些普通的问卷缺乏用户参与感。一个很简单的例子,当你删除电脑软件的时候,他会问你为什么删除。有多少人真的会按照自己的意愿去选择,点右上角的关闭按钮就可以了。说到底,这种问卷缺乏参与感。
  问题一:如何解决问卷调查参与感低的问题
  那么如何解决以往调查没有参与感的问题呢?这很简单。我用倒计时十秒抢答,让用户有一种紧迫感,用户也不知道还剩下多少问题,总觉得下一次就是下一次。红包准备好了,就做到最后,但是不建议太多,10-15个左右就够了,保证1分钟内用户可以选择就可以了。
  问题二:如何解决用户身份与奖品绑定步骤问题,层次太深
  所谓的用户身份绑定步骤太深了,就是在问卷调查涉及到奖品的时候,需要给用户绑定奖品。手机号登录,用户需要操作的流程是输入手机号点击发送验证码--&gt;点击短信推送输入短信详情--&gt;记住验证码--&gt; 返回调查页面 --&gt; 输入验证码点击确定,我之前做过数据分析,每增加一个用户等级,用户流失率会增加20%,也就是之前的问卷调查法会流失80%以上的用户,那我给你算一下,你花1W用钱推,比如获客成本是2元,5,可吸引000人参与问卷调查。经过以上四步,每一步都会流失20%的用户,即最终流失5000*80%=4000人。也就是说,真正的获客成本从2元增加到了10元。如果你这次活动吸引了一万人,你的老板就要多花八万元。10万人呢,10万人,现在你能看出用户层级有多重要吗?
  所以要解决这个问题,我们需要尽可能的降低用户等级,能在一级解决的都在一级解决,所以我用服务器直接分配用户唯一优惠码并绑定它在后台奖励。用户只需要在最后一页点击保存优惠码图片,支付时直接使用即可。两个问题的解决方案如下图所示:
  4. 运营产品规划案例的交付、审核和分发
  至此,线上运营产品规划案例完成,采集
UE和问卷调查需要采集
的用户标签,下发给产品部。其实大家可以看到运营部门其实已经帮产品做了一部分工作,所以这就是刚才说的运营和产品工作内容界限模糊的原因。
  
  第二步:产品部任务一,编写需求文档
  需求文档的原则是将运营部门的用户需求转化为技术可以理解的功能需求,从控件的大小,组件颜色的颜色编号,到每个功能的细节,以及甚至一些技术选型。并且要体现数据交互策略,从而节省技术部门的沟通成本。由于本项目主要配合运营时间节点,适合采用敏捷开发方式。我直接把需求文档和UE图整合起来,效果如下。
  2. 产品资料交付技术部。开发说的“不可能”是真的吗?
  拿着需求文档和技术部开产品会,经常遇到的问题就是技术部会找各种借口说实现不了。最后为了保证基本功能,对产品进行妥协,对运营进行妥协,以保证按时上线。只是大家只能为惨不忍睹的PVUV买单,奖金什么的都别想了。真的不可能吗?技术部的人真的很懒吗?真的是技术部的人多报了工期?
  技术部和产品运营部性格最大的不同,一个是想一劳永逸,一个是不断想开发新玩法,不断提升用户体验。对于技术部门人员来说,他们认为最理想的系统是健壮的系统。技术部门提出什么要求,不需要改代码,告诉他们后台怎么配置就可以了。对于产品运营者来说,每一个活动都必须是不同的、不同的、有新数据的。埋了,所以就出现了上面的矛盾,那么怎么解决呢?
  1.先尽快提出需求,切记今天不要提出来,这种行为会让技术部门很反感。
  2、一切以运营部门的标准为准,因为运营部门是与市场关系最密切的部门,所以提出的建议和诉求是市场调研和数据分析的结果,确保满足需求运营部门是大前提。
  3. 如果现有需求与原有的技术选型和数据架构有太多冲突,只能深入探讨,抽丝剥茧,在保证运营需求的前提下,做一些适当的妥协。有时候技术解决不了的问题,可以通过优化交互设计来解决,比如列表页的点赞功能。如果每次都放like的话,服务器压力还是挺大的。如果数据库不用redis,服务器容易宕机,更换数据库成本太高。建一个项目太不现实了,所以通过优化交互设计,把点赞功能放多一些,评论功能放浅一些,
  4、产品操作人员多了解一些技术知识是非常有必要的。至少在和技术部门交涉的时候,他们可以知道自己是不是在夸大问题。,那就只能直接把需求文档设计稿发项目立项邮件@Boss@各部局长,从上到下分配任务。
  第三步:技术部任务 1. 获取需求文档并分配任务
  本次问卷调查项目,需要用到的技术岗位有web前端、测试工程师、java后端工程师、项目经理。这四个岗位的任务由项目经理根据要求分配到各个岗位,可以根据时间进度安排。开发完成,测试通过上线后,项目迭代结束。
  项目经理的工作职责:控制项目整体进度和成本,发现需求问题及时与其他部门沟通,编写接口文档,攻克技术难题。Java后台任务:完善接口文档,根据需求文档和接口文档搭建后台数据库,实现接口函数,实现相关算法函数。Web前端任务:实现问卷页面效果与后台接口对接,适配不同分辨率的设备。测试任务:根据需求文档编写测试用例,测试项目整体功能,做好适配测试和jmeter压力测试。2.专注于关联算法,最基础的人工智能,
  这种线上运营的本质之一就是利用关联算法来增加用户非理性购买的概率,达到提升消费转化的效果。那么什么是关联算法呢?最简单的例子,你去淘宝看一个包包,然后拉到页面底部,会有一个猜你喜欢的,里面的内容是根据关联算法计算出来的,然后精准推送给你,所以很多人说,我知道这个叫关联算法,但是作为运营商,你如何使用关联算法,作为技术人员开发关联算法应该从哪里入手呢?把我用java实现的关联算法代码拿出来给大家参考。
  技巧:自媒体实时热点工具分享,追热点的自媒体工具,不错过自媒体运营方法
  自媒体人想要在最短的时间内获得更多的流量,最好的捷径就是关注热点。追热点之后,很有可能制造出爆款文章。
  如何提高追热点的速度,首先你得有一个好的内容源,也就是说有热点你要及时知道,还得能快速搜索素材. 这个一般需要借助工具,下面就给大家推荐一下。几个让你更好关注热点的自媒体工具:
  一、今日头条:热词分析
  打开今日头条作者首页,点击功能实验室,会看到一个热词分析工具,点击进入分析页面。
  
  热词分析工具:会有最新的实时热点文章,关键词和具体的热点情况。您可以随时了解热门事件,也可以搜索关键词查看相关热度。
  2、编写简单——实时热点监控
  打开易转,进入数据研究院,右侧会有实时热点监测页面,里面有今天的热词,明天的发现,还有今天的热点图。在实时热点栏目中,可以看到百度热搜、微博热搜、各自媒体平台的热搜。掌握。
  
  3.微博热搜榜
  这应该是大家最常用的平台了。微博用户多,信息流通速度快。是追热点必不可少的工具。
  不过,微博的一大优势就是可以帮助你及时掌握实时热点。缺点是微博内容比较混乱,不利于采集
信息。过滤信息需要时间。
  好吧,这里有一些重要的工具,我今天要告诉你,以帮助大家加快速度。

解决方案:【机器学习】一文彻底搞懂自动机器学习AutoML:Auto-Sklearn

采集交流优采云 发表了文章 • 0 个评论 • 70 次浏览 • 2022-11-22 05:18 • 来自相关话题

  解决方案:【机器学习】一文彻底搞懂自动机器学习AutoML:Auto-Sklearn
  本文将系统全面地介绍自动机器学习常用的框架之一:Auto-Sklearn,介绍安装使用,分类回归小案例,介绍一些使用手册。自动机器学习
  自动化机器学习 AutoML 是机器学习中一个相对较新的领域。它主要自动化机器学习中所有耗时的过程,例如数据预处理、最优算法选择、超参数调优等,可以节省大量构建机器的时间。在学习模型的过程中。
  Automatic Machine Learning AutoML:对于,让表示特征向量,表示相应的目标值。给定训练数据集和从与其相同的数据分布中提取的测试数据集的特征向量,以及资源预算和损失度量,AutoML 问题是自动为测试集生成预测,而 AutoML 问题的解决方案损失值。
  AutoML 是为数据集的数据转换、模型和模型配置发现性能最佳的管道的过程。
  AutoML 通常涉及使用复杂的优化算法(例如贝叶斯优化)来有效地导航可能模型和模型配置的空间,并快速发现对给定预测建模任务最有效的算法。它允许非专业的机器学习从业者快速轻松地发现对给定数据集有效甚至最佳的方法,几乎​​不需要技术背景或直接输入。
  如果你用过sklearn,应该不难理解上面的定义。下面结合一张流程图来进一步理解。
  Auto-Sklearn 系统概述Auto-Sklearn
  Auto-Sklearn 是一个开源库,用于在 Python 中执行 AutoML。它利用流行的 Scikit-Learn 机器学习库进行数据转换和机器学习算法。
  它是由 Matthias Feurer 等人开发的。并在他们 2015 年题为“高效且稳健的自动化机器学习 [1]”的论文中进行了描述。
  …我们引入了一个基于 scikit-learn 的强大的新 AutoML 系统(使用 15 个分类器、14 种特征预处理方法和 4 种数据预处理方法,产生具有 110 个超参数的结构化假设空间)
  我们介绍了一个基于 scikit-learn 的强大的新 AutoML 系统(使用 15 个分类器、14 种特征预处理方法和 4 种数据预处理方法,产生了一个具有 110 个超参数的结构化假设空间)。
  Auto-Sklearn 的好处是,除了发现数据预处理和模型来为数据集执行之外,它还能够从在类似数据集上表现良好的模型中学习,并可以自动创建性能最佳的集成作为优化过程的一部分找到的模型。
  这个系统,我们称之为 AUTO-SKLEARN,通过自动考虑过去在类似数据集上的表现,并通过在优化期间评估的模型构建集成,改进了现有的 AutoML 方法。
  我们称之为 AUTO-SKLEARN 的这个系统通过自动考虑过去在类似数据集上的表现并通过优化期间评估的模型构建集成来改进现有的 AutoML 方法。
  Auto-Sklearn 是对通用 AutoML 方法的改进。自动机器学习框架采用贝叶斯超参数优化方法来有效地发现给定数据集的最佳性能模型管道。
  这里添加了两个额外的组件:
  这种元学习方法是对用于优化 ML 框架的贝叶斯优化的补充。对于与整个 ML 框架一样大的超参数空间,贝叶斯优化起步缓慢。选择了几种配置用于基于元学习的种子贝叶斯优化。这种通过元学习的方法可以称为热启动优化方法。再加上多模型自动集成的方式,整个机器学习过程高度自动化,将大大节省用户的时间。从这个过程来看,机器学习用户可以有更多的时间来选择数据和思考要处理的问题。
  贝叶斯优化
  贝叶斯优化的原理是利用已有样本在优化目标函数方面的表现来构建后验模型。后验模型上的每个点都是高斯分布,具有均值和方差。如果该点是已有的样本点,均值为优化目标函数在该点的值,方差为0。其他未知样本点的均值和方差由后验概率拟合,不一定接近真正的价值。然后用一个采集函数不断测试这些未知样本点对应的优化目标函数值,不断更新后验概率模型。由于采集函数可以兼顾Explore/Exploit,将选择更多具有良好性能和高潜力的点。因此,当资源预算耗尽时,往往可以得到很好的优化结果。即寻找优化目标函数中的局部最优参数。
  贝叶斯优化
  上图是贝叶斯优化应用于简单一维问题的实验图。这些图显示了四次迭代后高斯过程对目标函数的逼近。下面以t=3为例介绍图中各部分的作用。
  上图中的两个评价黑点和一个红色评价是备选模型经过三次评价后的初始值估计,会影响下一个点的选择,可以画出很多通过这三个点的曲线。黑色虚线曲线是实际的真实目标函数(通常是未知的)。黑色实线是代理模型目标函数的平均值。紫色区域是代理模型目标函数的方差。绿色阴影部分是指采集函数的值,取最大值的点作为下一个采样点。只有三个点,拟合效果稍差。黑点越多,黑色实线和黑色虚线之间的面积越小,误差越小,
  安装和使用 Auto-Sklearn
  Auto-sklearn 提供开箱即用的监督式自动机器学习。从名字就可以看出,auto-sklearn是基于机器学习库scikit-learn构建的,可以自动搜索新数据集的学习算法,并优化其超参数。因此,它将机器学习用户从繁琐的任务中解放出来,让他们有更多时间专注于实际问题。
  这里可以参考auto-sklearn官方文档[2]。
  Ubuntu
  >>> sudo apt-get install build-essential swig<br />>>> conda install gxx_linux-64 gcc_linux-64 swig<br />>>> curl `https://raw.githubusercontent. ... s.txt` | xargs -n 1 -L 1 pip install<br />>>> pip install auto-sklearn<br />
  蟒蛇
  pip install auto-sklearn<br />
  安装后,我们可以导入库并打印版本号以确认安装成功:
  # print autosklearn version<br />import autosklearn<br />print('autosklearn: %s' % autosklearn.__version__)<br />
  您的版本号应该相同或更高。
  autosklearn: 0.6.0<br />
  根据预测任务,无论是分类还是回归,都可以创建和配置 AutoSklearnClassifier[3] 或 AutoSklearnRegressor[4] 类的实例,将其拟合到数据集,仅此而已。然后可以直接使用生成的模型进行预测或保存到文件(使用 pickle)供以后使用。
  AutoSklearn 类参数
  AutoSklearn 类提供了大量的配置选项作为参数。
  默认情况下,搜索将在搜索过程中使用数据集的训练测试拆分,为了速度和简单性,这里建议使用默认值。
  参数n_jobs可以设置为系统的核心数,如果有8个核心,则n_jobs=8。
  通常,优化过程会连续运行并以分钟为单位。默认情况下,它将运行一小时。
  这里建议将time_left_for_this_task参数设置为这个任务的最大时间(你希望进程运行的秒数)。例如,对于许多小型预测建模任务(行数少于 1,000 的数据集)来说,不到 5-10 分钟就足够了。如果不指定该参数,进程将连续运行,以分钟计,进程运行一小时,即60分钟。此示例通过 per_run_time_limit 参数将分配给每个模型评估的时间限制为 30 秒。例如:
  # define search<br />model = AutoSklearnClassifier(time_left_for_this_task=5*60, <br />                              per_run_time_limit=30,<br />                              n_jobs=8)<br />
  还有其他参数,如 ensemble_size、initial_configurations_via_metallearning 可用于微调分类器。默认情况下,上述搜索命令会创建一组性能最佳的模型。为了避免过度拟合,我们可以通过更改设置 ensemble_size = 1 和 initial_configurations_via_metallearning = 0 来禁用它。我们在设置分类器时排除了这些以保持方法简单。
  在运行结束时,可以访问模型列表以及其他详细信息。sprint_statistics() 函数总结了最终模型的搜索和性能。
  # summarize performance<br />print(model.sprint_statistics())<br />
  分类任务
  在本节中,我们将使用 Auto-Sklearn 来发现 Sonar 数据集的模型。
  
  Sonar 数据集 [5] 是一个标准的机器学习数据集,由 208 行数据和 60 个数字输入变量和一个具有两个类值的目标变量组成,例如二分类。
  使用重复分层 10 折交叉验证的测试框架,重复 3 次,朴素模型可以达到约 53% 的准确度。性能最好的模型在相同的测试框架上达到了大约 88% 的准确率。这为该数据集提供了预期的性能范围。
  该数据集涉及预测声纳返回是指示岩石还是模拟地雷。
  # summarize the sonar dataset<br />from pandas import read_csv<br /># load dataset<br />dataframe = read_csv(data, header=None)<br /># split into input and output elements<br />data = dataframe.values<br />X, y = data[:, :-1], data[:, -1]<br />print(X.shape, y.shape)<br />
  运行该示例会下载数据集并将其拆分为输入和输出元素。您可以看到具有 60 个输入变量的 208 行数据。
  (208, 60) (208,)<br />
  首先,将数据集分为训练集和测试集,目标是在训练集上找到一个好的模型,然后评估在 holdout 测试集上找到的模型的性能。
  # split into train and test sets<br />X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1)<br />
  使用以下命令从 autosklearn 导入分类模型。
  from autosklearn.classification import AutoSklearnClassifier<br />
  AutoSklearnClassifier 配置为使用 8 个内核运行 5 分钟,并将每个模型评估限制为 30 秒。
  # define search<br />model = AutoSklearnClassifier(time_left_for_this_task=5*60,<br />                              per_run_time_limit=30, n_jobs=8,<br />                              tmp_folder='/temp/autosklearn_classification_example_tmp')<br />
  这里提供了一个临时的日志保存路径,方便我们后面打印运行明细。
  然后在训练数据集上执行搜索。
  # perform the search<br />model.fit(X_train, y_train)<br />
  报告搜索摘要和最佳性能模型。
  # summarize<br />print(model.sprint_statistics())<br />
  可以使用以下命令为搜索考虑的所有模型打印排行榜。
  # leaderboard<br />print(model.leaderboard())<br />
  可以使用以下命令打印有关所考虑模型的信息。
  print(model.show_models())<br />
  我们还可以使用SMOTE、集成学习(bagging、boosting)、NearMiss算法等技术来解决数据集中的不平衡问题。
  最后评估模型在测试数据集上的性能。
  # evaluate best model<br />y_pred = model.predict(X_test)<br />acc = accuracy_score(y_test, y_pred)<br />print("Accuracy: %.3f" % acc)<br />
  也可以打印集成的最终分数和混淆矩阵。
  # Score of the final ensemble<br />from sklearn.metrics import accuracy_score<br />m1_acc_score= accuracy_score(y_test, y_pred)<br />m1_acc_score<br />from sklearn.metrics import confusion_matrix, accuracy_score<br />y_pred= model.predict(X_test)<br />conf_matrix= confusion_matrix(y_pred, y_test)<br />sns.heatmap(conf_matrix, annot=True)<br />
  运行结束时,打印的摘要显示评估了 1,054 个模型,最终模型的估计性能为 91%。
  auto-sklearn results:<br />Dataset name: f4c282bd4b56d4db7e5f7fe1a6a8edeb<br />Metric: accuracy<br />Best validation score: 0.913043<br />Number of target algorithm runs: 1054<br />Number of successful target algorithm runs: 952<br />Number of crashed target algorithm runs: 94<br />Number of target algorithms that exceeded the time limit: 8<br />Number of target algorithms that exceeded the memory limit: 0<br />
  然后在 holdout 数据集上对该模型进行评估,发现其分类准确率达到 81.2%,相当熟练。
  Accuracy: 0.812<br />
  返回任务
  在本节中,Auto-Sklearn 用于挖掘汽车保险数据集的模型。
  汽车保险数据集 [6] 是一个标准的机器学习数据集,由 63 行数据、一个数字输入变量和一个数字目标变量组成。
  使用具有重复分层 10 折交叉验证和三个重复的测试框架,朴素模型实现了大约 66 的平均绝对误差 (MAE)。性能最佳的模型在同一测试框架上实现了大约 28 的 MAE。这为该数据集提供了预期的性能限制。
  该数据集涉及根据不同地理区域的索赔数量预测索赔总额(千瑞典克朗)。
  可以使用与上一节中相同的过程,尽管我们将使用 AutoSklearnRegressor 类而不是 AutoSklearnClassifier。
  默认情况下,回归器将优化指标。如果需要使用均值绝对误差或MAE,可以在调用fit()函数时通过metric参数指定。
  # example of auto-sklearn for the insurance regression dataset<br />from pandas import read_csv<br />from sklearn.model_selection import train_test_split<br />from sklearn.metrics import mean_absolute_error<br />from autosklearn.regression import AutoSklearnRegressor<br />from autosklearn.metrics import mean_absolute_error as auto_mean_absolute_error<br /># load dataset<br />dataframe = read_csv(data, header=None)<br /># split into input and output elements<br />data = dataframe.values<br />data = data.astype('float32')<br />X, y = data[:, :-1], data[:, -1]<br /># split into train and test sets<br />X_train, X_test, y_train, y_test = train_test_split(X, y, <br />                                                    test_size=0.33, <br />                                                    random_state=1)<br /># define search<br />model = AutoSklearnRegressor(time_left_for_this_task=5*60, <br />                             per_run_time_limit=30, n_jobs=8)<br /># perform the search<br />model.fit(X_train, y_train, metric=auto_mean_absolute_error)<br /># summarize<br />print(model.sprint_statistics())<br /># evaluate best model<br />y_hat = model.predict(X_test)<br />mae = mean_absolute_error(y_test, y_hat)<br />print("MAE: %.3f" % mae)<br />
  运行结束时,打印的摘要显示评估了 1,759 个模型,最终模型的估计性能为 29 MAE。
  auto-sklearn results:<br />Dataset name: ff51291d93f33237099d48c48ee0f9ad<br />Metric: mean_absolute_error<br />Best validation score: 29.911203<br />Number of target algorithm runs: 1759<br />Number of successful target algorithm runs: 1362<br />Number of crashed target algorithm runs: 394<br />Number of target algorithms that exceeded the time limit: 3<br />Number of target algorithms that exceeded the memory limit: 0<br />
  保存训练好的模型
  上面训练的分类和回归模型可以使用python包Pickle和JobLib保存。然后可以使用这些保存的模型直接对新数据进行预测。我们可以将模型保存为:
  1.泡菜
  import pickle<br /># save the model <br />filename = 'final_model.sav' <br />pickle.dump(model, open(filename, 'wb'))<br />
  这里的“wb”参数表示我们正在以二进制方式将文件写入磁盘。此外,我们可以将这个保存的模型加载为:
  #load the model<br />loaded_model = pickle.load(open(filename, 'rb'))<br />result = loaded_model.score(X_test, Y_test)<br />print(result)<br />
  这里的“rb”命令意味着我们正在以二进制模式读取文件
  2. 工作库
  同样,我们可以使用以下命令将训练好的模型保存在 JobLib 中。
  
  import joblib<br /># save the model <br />filename = 'final_model.sav'<br />joblib.dump(model, filename)<br />
  我们也可以稍后重新加载这些保存的模型来预测新数据。
  # load the model from disk<br />load_model = joblib.load(filename)<br />result = load_model.score(X_test, Y_test)<br />print(result)<br />
  用户手册地址
  让我们从几个方面解读用户手册[7]。
  时间和内存限制
  auto-sklearn 的一个关键特性是限制允许 scikit-learn 算法使用的资源(内存和时间)。特别是对于大型数据集(算法可能需要数小时和机器交换),一定要在一段时间后停止评估,以便在合理的时间内取得进展。因此,设置资源限制是优化时间和可测试模型数量之间的权衡。
  虽然 auto-sklearn 减轻了手动超参数调整的速度,但用户仍然需要设置内存和时间限制。大多数现代计算机上的 3GB 或 6GB 内存限制对于大多数数据集来说已经足够了。由于时间紧迫,很难给出明确的指导方针。如果可能,一个好的默认设置是总时间限制为一天,单次运行时间限制为 30 分钟。
  更多指南可以在 auto-sklearn/issues/142[8] 中找到。
  限制搜索空间
  除了使用所有可用的估计器之外,还可以限制 auto-sklearn 的搜索空间。以下示例显示如何排除所有预处理方法并将配置空间限制为仅使用随机森林。
  import autosklearn.classification<br /><br />automl = autosklearn.classification.AutoSklearnClassifier(<br />    include_estimators=["random_forest",], <br />   exclude_estimators=None,<br />    include_preprocessors=["no_preprocessing", ], <br />    exclude_preprocessors=None)<br /><br />automl.fit(X_train, y_train)<br />predictions = automl.predict(X_test)<br />
  注意:用于标识估计器和预处理器的字符串是不带 .py 的文件名。
  关闭预处理
  auto-sklearn中的预处理分为数据预处理和特征预处理。数据预处理包括分类特征的单热编码、缺失值的插补以及特征或样本的归一化。目前无法关闭这些步骤。特征预处理是一个单一的特征转换器,可以实现例如特征选择或将特征转换到不同的空间(如 PCA)。如上例所示,可以通过设置 include_preprocessors=["no_preprocessing"] 来关闭特征预处理。
  重采样策略
  可以在 auto-sklearn/examples/ 中找到使用 holdout 数据集和交叉验证的示例。
  结果检查
  Auto-sklearn 允许用户检查训练结果并查看相关统计数据。以下示例显示如何打印不同的统计信息以进行相应检查。
  import autosklearn.classification<br /><br />automl = autosklearn.classification.AutoSklearnClassifier()<br />automl.fit(X_train, y_train)<br />automl.cv_results_<br />automl.sprint_statistics()<br />automl.show_models()<br />
  并行计算
  auto-sklearn 通过共享文件系统上的数据共享支持并行执行。在这种模式下,SMAC 算法通过在每次迭代后将其训练数据写入磁盘来共享其模型的训练数据。在每次迭代开始时,SMAC 加载所有新发现的数据点。我们提供了一个实现 scikit-learn 的 n_jobs 功能的示例,以及一个关于如何手动启动多个 auto-sklearn 实例的示例。
  在默认模式下,auto-sklearn 已经使用了两个内核。第一个用于模型构建,第二个用于在每次新的机器学习模型完成训练时构建集成。序列示例显示了如何一次只使用一个内核按顺序运行这些任务。
  此外,根据 scikit-learn 和 numpy 安装,模型构建过程最多可以使用所有内核。这种行为是 auto-sklearn 所不希望的,很可能是由于从 pypi 安装 numpy 作为二进制轮(参见此处)。做 export OPENBLAS_NUM_THREADS=1 应该禁用此行为并使 numpy 一次只使用一个核心。
  香草自动sklearn
  auto-sklearn主要基于scikit-learn的封装。因此,可以遵循 scikit-learn 中的持久性示例。
  要在高效且稳健的自动机器学习材料中使用 vanilla auto-sklearn,请设置 ensemble_size=1 和 initial_configurations_via_metallearning=0。
  import autosklearn.classification<br />automl = autosklearn.classification.AutoSklearnClassifier(<br />    ensemble_size=1, initial_configurations_via_metalearning=0)<br />
  整体大小为 1 将导致始终选择在验证集上具有最佳测试性能的单个模型。将初始配置 meta-learn 设置为 0 将使 auto-sklearn 使用常规 SMAC 算法来设置新的超参数配置。
  参考文献[1]
  高效且强大的自动化机器学习:
  [2]
  Auto-sklearn官方文档:
  [3]
  AutoSklearnClassifier:#classification
  [4]
  AutoSklearnRegressor:#regression
  [5]
  声纳数据集:
  [6]
  汽车保险数据集:
  [7]
  用户手册:#manual
  [8]
  自动学习/问题/142:
  [9]
  [10]
  往期精彩回顾<br data-darkmode-bgcolor-16019459903493="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16019459903493="rgb(255, 255, 255)" data-darkmode-color-16019459903493="rgb(163, 163, 163)" data-darkmode-original-color-16019459903493="rgb(0, 0, 0)" data-darkmode-bgcolor-16359090834904="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16359090834904="#fff|rgb(255, 255, 255)" data-darkmode-color-16359090834904="rgb(163, 163, 163)" data-darkmode-original-color-16359090834904="#fff|rgb(0, 0, 0)|rgb(62, 62, 62)|rgb(0, 0, 0)|rgb(51, 141, 175)|rgb(0, 0, 0)" style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br data-darkmode-bgcolor-16019459903493="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16019459903493="rgb(255, 255, 255)" data-darkmode-color-16019459903493="rgb(163, 163, 163)" data-darkmode-original-color-16019459903493="rgb(0, 0, 0)" data-darkmode-bgcolor-16359090834904="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16359090834904="#fff|rgb(255, 255, 255)" data-darkmode-color-16359090834904="rgb(163, 163, 163)" data-darkmode-original-color-16359090834904="#fff|rgb(0, 0, 0)|rgb(62, 62, 62)|rgb(0, 0, 0)|rgb(51, 141, 175)|rgb(0, 0, 0)" style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br data-darkmode-bgcolor-16019459903493="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16019459903493="rgb(255, 255, 255)" data-darkmode-color-16019459903493="rgb(163, 163, 163)" data-darkmode-original-color-16019459903493="rgb(0, 0, 0)" data-darkmode-bgcolor-16359090834904="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16359090834904="#fff|rgb(255, 255, 255)" data-darkmode-color-16359090834904="rgb(163, 163, 163)" data-darkmode-original-color-16359090834904="#fff|rgb(0, 0, 0)|rgb(62, 62, 62)|rgb(0, 0, 0)|rgb(51, 141, 175)|rgb(0, 0, 0)" style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br data-darkmode-bgcolor-16019459903493="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16019459903493="rgb(255, 255, 255)" data-darkmode-color-16019459903493="rgb(163, 163, 163)" data-darkmode-original-color-16019459903493="rgb(0, 0, 0)" data-darkmode-bgcolor-16359090834904="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16359090834904="#fff|rgb(255, 255, 255)" data-darkmode-color-16359090834904="rgb(163, 163, 163)" data-darkmode-original-color-16359090834904="#fff|rgb(0, 0, 0)|rgb(62, 62, 62)|rgb(0, 0, 0)|rgb(51, 141, 175)|rgb(0, 0, 0)" style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载中国大学慕课《机器学习》(黄海广主讲)机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑<br data-darkmode-bgcolor-16019459903493="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16019459903493="rgb(255, 255, 255)" data-darkmode-color-16019459903493="rgb(39, 84, 255)" data-darkmode-original-color-16019459903493="rgb(2, 30, 170)" data-darkmode-bgcolor-16359090834904="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16359090834904="#fff|rgb(255, 255, 255)" data-darkmode-color-16359090834904="rgb(39, 84, 255)" data-darkmode-original-color-16359090834904="#fff|rgb(0, 0, 0)|rgb(62, 62, 62)|rgb(0, 0, 0)|rgb(51, 141, 175)|rgb(0, 0, 0)|rgb(2, 30, 170)" style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />AI基础下载机器学习交流qq群955171419,加入微信群请扫码:
  核心方法:网站标题seo怎么写?网站标题关键词写法规范-网站SEO标题分析工具
  网站标题seo,网站标题怎么写?网站标题的作用是什么?网站的标题决定了你网站的排名,为什么这么说呢。因为搜索引擎通过识别标题来识别你网站的主题和你网站的类型。同样,如果用户看到您的标题没有焦点,他们也不会点击进入。所以现在你知道标题的重要性了。
  常规标题写作技巧:
  1.标题核心词-标题核心词2-标题核心词3-品牌词
  2、标题核心词-吸引用户的词-品牌词
  为什么我的标题区间符号是:“-” 因为百度官方说统计区间符号是单杠。这是一个关于如何写标题的教程。使用这个免费的SEO工具,你只需要输入一个标题词,自动采集
页面排名的所有标题。我们只需要将这些数据导出到表中,进行分析,创建自己的标题写法即可。(注意:标题一般不要超过30个字符)
  一个新站想快速对其网站进行排名。方法其实很简单。只要认真按照我的方法去做,一定会有效果的。那到底是什么方法这么厉害呢?
  
  网站处于什么阶段?
  想要做好网站关键词排名,就像病人去看病一样。如果医生不明白他的病人怎么了,他就开药,有意识地打针。会发生什么?影响?连我们自己都不了解我们的网站,它现在是一个什么样的状态,我们该如何优化呢?因此,在前期,我们需要对网站进行阶段性判断。首先简单定位一下,可以分为初级、中期、高级3个阶段。阶段制定不同阶段的优化方法)。
  新站的优化方法应该在什么阶段?有基础的朋友,新站应该知道属于前期,也就是初期优化阶段。我们应该如何开始这个初级优化阶段?为了让更多的朋友看得清楚,李勇简单地将这个初步的优化过程分成了4个小部分给大家。请继续仔细阅读。
  1、分析新站的用户群体
  做网站首先要知道谁会访问我们的网站?他们为什么访问我们的网站?只有在你对你的网站用户有了详细的了解之后,你才能进行下一步,为他们提供有价值的内容。比如李勇的SEO博客访问者一般都是站长或者研究SEO的人,或者是做营销推广的人。他们为什么来访问李勇的SEO博客?因为这个博客上有他们需要的内容!
  2. 选择网站所有者 关键词
  
  一个网站主机关键词就相当于我们的名字,关键词的索引就相当于我们的人气,所以我们尽量选择最热门的,选择那个主机关键词我们确定(可以排名的是关键词),就像我的博客一样,主关键词是李勇SEO博客,因为我是做个人品牌的,所以你懂的,辅助的关键词包括合肥seo、合肥网站优化、合肥seo培训等,选择网站关键词可以说是看你提供的服务。如果你想做品牌,那没关系,主关键词就写你的品牌,如果你不是品牌,纯粹为了流量,建议选主关键词 有交通。
  3.定位网站栏目分类
  当用户进入你的网站时,他们基本上会查看你网站上的栏目,看是否有他们想看的内容,内容应该在那个栏目中。比如你去超市,如果你是买菜的话,你会直接去卖菜的地方。如果是买日用品,应该到卖日用品的地方去。网站栏目的分类我们要根据用户的需求来定位。
  仍然需要充分理解基本理论。这里需要注意的是,学习SEO优化方法需要与时俱进,紧跟搜索引擎的脚步。网上很多理论都与百度的算法渐行渐远。如果你认为自己已经掌握了 SEO 而停滞不前,你就会落后于“时间”。另外,我们需要找到最好的seo学习网站,这个怎么说呢?很多时候seo是一件很随意的事情,大家可以谈一谈,哪些是有根据的,哪些是典型的seo谬论,需要仔细甄别。高效学习SEO的精髓也在这里。
  关键词 是网站必不可少的东西。首先分析关键词的竞争力和搜索热度,准确识别长尾关键词。通常有两种新手。思路是专注于关键词,比如线上推广关键词,直接优化线上推广关键词。为什么?因为这个词有很多搜索量,但是有这样的想法。对于初学者来说,我想说的是,搜索量越大的关键词会更有竞争力,也更难优化,无法以吸引准确的客户,这些客户通常是长期搜索者。来自于结尾关键词,比如在前面加一个地区名“中山网络推广外包”,另一个想法是优化那些没有搜索量的词,为什么?因为这个词没有竞争力,每分钟都是优化的第一名,但是对于有这种想法的新手,我只想说,如果餐厅建在没有人的山顶上,还会有客人吗来吃饭?没有竞争力,没有搜索量,白费那么多力气做什么? 查看全部

  解决方案:【机器学习】一文彻底搞懂自动机器学习AutoML:Auto-Sklearn
  本文将系统全面地介绍自动机器学习常用的框架之一:Auto-Sklearn,介绍安装使用,分类回归小案例,介绍一些使用手册。自动机器学习
  自动化机器学习 AutoML 是机器学习中一个相对较新的领域。它主要自动化机器学习中所有耗时的过程,例如数据预处理、最优算法选择、超参数调优等,可以节省大量构建机器的时间。在学习模型的过程中。
  Automatic Machine Learning AutoML:对于,让表示特征向量,表示相应的目标值。给定训练数据集和从与其相同的数据分布中提取的测试数据集的特征向量,以及资源预算和损失度量,AutoML 问题是自动为测试集生成预测,而 AutoML 问题的解决方案损失值。
  AutoML 是为数据集的数据转换、模型和模型配置发现性能最佳的管道的过程。
  AutoML 通常涉及使用复杂的优化算法(例如贝叶斯优化)来有效地导航可能模型和模型配置的空间,并快速发现对给定预测建模任务最有效的算法。它允许非专业的机器学习从业者快速轻松地发现对给定数据集有效甚至最佳的方法,几乎​​不需要技术背景或直接输入。
  如果你用过sklearn,应该不难理解上面的定义。下面结合一张流程图来进一步理解。
  Auto-Sklearn 系统概述Auto-Sklearn
  Auto-Sklearn 是一个开源库,用于在 Python 中执行 AutoML。它利用流行的 Scikit-Learn 机器学习库进行数据转换和机器学习算法。
  它是由 Matthias Feurer 等人开发的。并在他们 2015 年题为“高效且稳健的自动化机器学习 [1]”的论文中进行了描述。
  …我们引入了一个基于 scikit-learn 的强大的新 AutoML 系统(使用 15 个分类器、14 种特征预处理方法和 4 种数据预处理方法,产生具有 110 个超参数的结构化假设空间)
  我们介绍了一个基于 scikit-learn 的强大的新 AutoML 系统(使用 15 个分类器、14 种特征预处理方法和 4 种数据预处理方法,产生了一个具有 110 个超参数的结构化假设空间)。
  Auto-Sklearn 的好处是,除了发现数据预处理和模型来为数据集执行之外,它还能够从在类似数据集上表现良好的模型中学习,并可以自动创建性能最佳的集成作为优化过程的一部分找到的模型。
  这个系统,我们称之为 AUTO-SKLEARN,通过自动考虑过去在类似数据集上的表现,并通过在优化期间评估的模型构建集成,改进了现有的 AutoML 方法。
  我们称之为 AUTO-SKLEARN 的这个系统通过自动考虑过去在类似数据集上的表现并通过优化期间评估的模型构建集成来改进现有的 AutoML 方法。
  Auto-Sklearn 是对通用 AutoML 方法的改进。自动机器学习框架采用贝叶斯超参数优化方法来有效地发现给定数据集的最佳性能模型管道。
  这里添加了两个额外的组件:
  这种元学习方法是对用于优化 ML 框架的贝叶斯优化的补充。对于与整个 ML 框架一样大的超参数空间,贝叶斯优化起步缓慢。选择了几种配置用于基于元学习的种子贝叶斯优化。这种通过元学习的方法可以称为热启动优化方法。再加上多模型自动集成的方式,整个机器学习过程高度自动化,将大大节省用户的时间。从这个过程来看,机器学习用户可以有更多的时间来选择数据和思考要处理的问题。
  贝叶斯优化
  贝叶斯优化的原理是利用已有样本在优化目标函数方面的表现来构建后验模型。后验模型上的每个点都是高斯分布,具有均值和方差。如果该点是已有的样本点,均值为优化目标函数在该点的值,方差为0。其他未知样本点的均值和方差由后验概率拟合,不一定接近真正的价值。然后用一个采集函数不断测试这些未知样本点对应的优化目标函数值,不断更新后验概率模型。由于采集函数可以兼顾Explore/Exploit,将选择更多具有良好性能和高潜力的点。因此,当资源预算耗尽时,往往可以得到很好的优化结果。即寻找优化目标函数中的局部最优参数。
  贝叶斯优化
  上图是贝叶斯优化应用于简单一维问题的实验图。这些图显示了四次迭代后高斯过程对目标函数的逼近。下面以t=3为例介绍图中各部分的作用。
  上图中的两个评价黑点和一个红色评价是备选模型经过三次评价后的初始值估计,会影响下一个点的选择,可以画出很多通过这三个点的曲线。黑色虚线曲线是实际的真实目标函数(通常是未知的)。黑色实线是代理模型目标函数的平均值。紫色区域是代理模型目标函数的方差。绿色阴影部分是指采集函数的值,取最大值的点作为下一个采样点。只有三个点,拟合效果稍差。黑点越多,黑色实线和黑色虚线之间的面积越小,误差越小,
  安装和使用 Auto-Sklearn
  Auto-sklearn 提供开箱即用的监督式自动机器学习。从名字就可以看出,auto-sklearn是基于机器学习库scikit-learn构建的,可以自动搜索新数据集的学习算法,并优化其超参数。因此,它将机器学习用户从繁琐的任务中解放出来,让他们有更多时间专注于实际问题。
  这里可以参考auto-sklearn官方文档[2]。
  Ubuntu
  >>> sudo apt-get install build-essential swig<br />>>> conda install gxx_linux-64 gcc_linux-64 swig<br />>>> curl `https://raw.githubusercontent. ... s.txt` | xargs -n 1 -L 1 pip install<br />>>> pip install auto-sklearn<br />
  蟒蛇
  pip install auto-sklearn<br />
  安装后,我们可以导入库并打印版本号以确认安装成功:
  # print autosklearn version<br />import autosklearn<br />print('autosklearn: %s' % autosklearn.__version__)<br />
  您的版本号应该相同或更高。
  autosklearn: 0.6.0<br />
  根据预测任务,无论是分类还是回归,都可以创建和配置 AutoSklearnClassifier[3] 或 AutoSklearnRegressor[4] 类的实例,将其拟合到数据集,仅此而已。然后可以直接使用生成的模型进行预测或保存到文件(使用 pickle)供以后使用。
  AutoSklearn 类参数
  AutoSklearn 类提供了大量的配置选项作为参数。
  默认情况下,搜索将在搜索过程中使用数据集的训练测试拆分,为了速度和简单性,这里建议使用默认值。
  参数n_jobs可以设置为系统的核心数,如果有8个核心,则n_jobs=8。
  通常,优化过程会连续运行并以分钟为单位。默认情况下,它将运行一小时。
  这里建议将time_left_for_this_task参数设置为这个任务的最大时间(你希望进程运行的秒数)。例如,对于许多小型预测建模任务(行数少于 1,000 的数据集)来说,不到 5-10 分钟就足够了。如果不指定该参数,进程将连续运行,以分钟计,进程运行一小时,即60分钟。此示例通过 per_run_time_limit 参数将分配给每个模型评估的时间限制为 30 秒。例如:
  # define search<br />model = AutoSklearnClassifier(time_left_for_this_task=5*60, <br />                              per_run_time_limit=30,<br />                              n_jobs=8)<br />
  还有其他参数,如 ensemble_size、initial_configurations_via_metallearning 可用于微调分类器。默认情况下,上述搜索命令会创建一组性能最佳的模型。为了避免过度拟合,我们可以通过更改设置 ensemble_size = 1 和 initial_configurations_via_metallearning = 0 来禁用它。我们在设置分类器时排除了这些以保持方法简单。
  在运行结束时,可以访问模型列表以及其他详细信息。sprint_statistics() 函数总结了最终模型的搜索和性能。
  # summarize performance<br />print(model.sprint_statistics())<br />
  分类任务
  在本节中,我们将使用 Auto-Sklearn 来发现 Sonar 数据集的模型。
  
  Sonar 数据集 [5] 是一个标准的机器学习数据集,由 208 行数据和 60 个数字输入变量和一个具有两个类值的目标变量组成,例如二分类。
  使用重复分层 10 折交叉验证的测试框架,重复 3 次,朴素模型可以达到约 53% 的准确度。性能最好的模型在相同的测试框架上达到了大约 88% 的准确率。这为该数据集提供了预期的性能范围。
  该数据集涉及预测声纳返回是指示岩石还是模拟地雷。
  # summarize the sonar dataset<br />from pandas import read_csv<br /># load dataset<br />dataframe = read_csv(data, header=None)<br /># split into input and output elements<br />data = dataframe.values<br />X, y = data[:, :-1], data[:, -1]<br />print(X.shape, y.shape)<br />
  运行该示例会下载数据集并将其拆分为输入和输出元素。您可以看到具有 60 个输入变量的 208 行数据。
  (208, 60) (208,)<br />
  首先,将数据集分为训练集和测试集,目标是在训练集上找到一个好的模型,然后评估在 holdout 测试集上找到的模型的性能。
  # split into train and test sets<br />X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1)<br />
  使用以下命令从 autosklearn 导入分类模型。
  from autosklearn.classification import AutoSklearnClassifier<br />
  AutoSklearnClassifier 配置为使用 8 个内核运行 5 分钟,并将每个模型评估限制为 30 秒。
  # define search<br />model = AutoSklearnClassifier(time_left_for_this_task=5*60,<br />                              per_run_time_limit=30, n_jobs=8,<br />                              tmp_folder='/temp/autosklearn_classification_example_tmp')<br />
  这里提供了一个临时的日志保存路径,方便我们后面打印运行明细。
  然后在训练数据集上执行搜索。
  # perform the search<br />model.fit(X_train, y_train)<br />
  报告搜索摘要和最佳性能模型。
  # summarize<br />print(model.sprint_statistics())<br />
  可以使用以下命令为搜索考虑的所有模型打印排行榜。
  # leaderboard<br />print(model.leaderboard())<br />
  可以使用以下命令打印有关所考虑模型的信息。
  print(model.show_models())<br />
  我们还可以使用SMOTE、集成学习(bagging、boosting)、NearMiss算法等技术来解决数据集中的不平衡问题。
  最后评估模型在测试数据集上的性能。
  # evaluate best model<br />y_pred = model.predict(X_test)<br />acc = accuracy_score(y_test, y_pred)<br />print("Accuracy: %.3f" % acc)<br />
  也可以打印集成的最终分数和混淆矩阵。
  # Score of the final ensemble<br />from sklearn.metrics import accuracy_score<br />m1_acc_score= accuracy_score(y_test, y_pred)<br />m1_acc_score<br />from sklearn.metrics import confusion_matrix, accuracy_score<br />y_pred= model.predict(X_test)<br />conf_matrix= confusion_matrix(y_pred, y_test)<br />sns.heatmap(conf_matrix, annot=True)<br />
  运行结束时,打印的摘要显示评估了 1,054 个模型,最终模型的估计性能为 91%。
  auto-sklearn results:<br />Dataset name: f4c282bd4b56d4db7e5f7fe1a6a8edeb<br />Metric: accuracy<br />Best validation score: 0.913043<br />Number of target algorithm runs: 1054<br />Number of successful target algorithm runs: 952<br />Number of crashed target algorithm runs: 94<br />Number of target algorithms that exceeded the time limit: 8<br />Number of target algorithms that exceeded the memory limit: 0<br />
  然后在 holdout 数据集上对该模型进行评估,发现其分类准确率达到 81.2%,相当熟练。
  Accuracy: 0.812<br />
  返回任务
  在本节中,Auto-Sklearn 用于挖掘汽车保险数据集的模型。
  汽车保险数据集 [6] 是一个标准的机器学习数据集,由 63 行数据、一个数字输入变量和一个数字目标变量组成。
  使用具有重复分层 10 折交叉验证和三个重复的测试框架,朴素模型实现了大约 66 的平均绝对误差 (MAE)。性能最佳的模型在同一测试框架上实现了大约 28 的 MAE。这为该数据集提供了预期的性能限制。
  该数据集涉及根据不同地理区域的索赔数量预测索赔总额(千瑞典克朗)。
  可以使用与上一节中相同的过程,尽管我们将使用 AutoSklearnRegressor 类而不是 AutoSklearnClassifier。
  默认情况下,回归器将优化指标。如果需要使用均值绝对误差或MAE,可以在调用fit()函数时通过metric参数指定。
  # example of auto-sklearn for the insurance regression dataset<br />from pandas import read_csv<br />from sklearn.model_selection import train_test_split<br />from sklearn.metrics import mean_absolute_error<br />from autosklearn.regression import AutoSklearnRegressor<br />from autosklearn.metrics import mean_absolute_error as auto_mean_absolute_error<br /># load dataset<br />dataframe = read_csv(data, header=None)<br /># split into input and output elements<br />data = dataframe.values<br />data = data.astype('float32')<br />X, y = data[:, :-1], data[:, -1]<br /># split into train and test sets<br />X_train, X_test, y_train, y_test = train_test_split(X, y, <br />                                                    test_size=0.33, <br />                                                    random_state=1)<br /># define search<br />model = AutoSklearnRegressor(time_left_for_this_task=5*60, <br />                             per_run_time_limit=30, n_jobs=8)<br /># perform the search<br />model.fit(X_train, y_train, metric=auto_mean_absolute_error)<br /># summarize<br />print(model.sprint_statistics())<br /># evaluate best model<br />y_hat = model.predict(X_test)<br />mae = mean_absolute_error(y_test, y_hat)<br />print("MAE: %.3f" % mae)<br />
  运行结束时,打印的摘要显示评估了 1,759 个模型,最终模型的估计性能为 29 MAE。
  auto-sklearn results:<br />Dataset name: ff51291d93f33237099d48c48ee0f9ad<br />Metric: mean_absolute_error<br />Best validation score: 29.911203<br />Number of target algorithm runs: 1759<br />Number of successful target algorithm runs: 1362<br />Number of crashed target algorithm runs: 394<br />Number of target algorithms that exceeded the time limit: 3<br />Number of target algorithms that exceeded the memory limit: 0<br />
  保存训练好的模型
  上面训练的分类和回归模型可以使用python包Pickle和JobLib保存。然后可以使用这些保存的模型直接对新数据进行预测。我们可以将模型保存为:
  1.泡菜
  import pickle<br /># save the model <br />filename = 'final_model.sav' <br />pickle.dump(model, open(filename, 'wb'))<br />
  这里的“wb”参数表示我们正在以二进制方式将文件写入磁盘。此外,我们可以将这个保存的模型加载为:
  #load the model<br />loaded_model = pickle.load(open(filename, 'rb'))<br />result = loaded_model.score(X_test, Y_test)<br />print(result)<br />
  这里的“rb”命令意味着我们正在以二进制模式读取文件
  2. 工作库
  同样,我们可以使用以下命令将训练好的模型保存在 JobLib 中。
  
  import joblib<br /># save the model <br />filename = 'final_model.sav'<br />joblib.dump(model, filename)<br />
  我们也可以稍后重新加载这些保存的模型来预测新数据。
  # load the model from disk<br />load_model = joblib.load(filename)<br />result = load_model.score(X_test, Y_test)<br />print(result)<br />
  用户手册地址
  让我们从几个方面解读用户手册[7]。
  时间和内存限制
  auto-sklearn 的一个关键特性是限制允许 scikit-learn 算法使用的资源(内存和时间)。特别是对于大型数据集(算法可能需要数小时和机器交换),一定要在一段时间后停止评估,以便在合理的时间内取得进展。因此,设置资源限制是优化时间和可测试模型数量之间的权衡。
  虽然 auto-sklearn 减轻了手动超参数调整的速度,但用户仍然需要设置内存和时间限制。大多数现代计算机上的 3GB 或 6GB 内存限制对于大多数数据集来说已经足够了。由于时间紧迫,很难给出明确的指导方针。如果可能,一个好的默认设置是总时间限制为一天,单次运行时间限制为 30 分钟。
  更多指南可以在 auto-sklearn/issues/142[8] 中找到。
  限制搜索空间
  除了使用所有可用的估计器之外,还可以限制 auto-sklearn 的搜索空间。以下示例显示如何排除所有预处理方法并将配置空间限制为仅使用随机森林。
  import autosklearn.classification<br /><br />automl = autosklearn.classification.AutoSklearnClassifier(<br />    include_estimators=["random_forest",], <br />   exclude_estimators=None,<br />    include_preprocessors=["no_preprocessing", ], <br />    exclude_preprocessors=None)<br /><br />automl.fit(X_train, y_train)<br />predictions = automl.predict(X_test)<br />
  注意:用于标识估计器和预处理器的字符串是不带 .py 的文件名。
  关闭预处理
  auto-sklearn中的预处理分为数据预处理和特征预处理。数据预处理包括分类特征的单热编码、缺失值的插补以及特征或样本的归一化。目前无法关闭这些步骤。特征预处理是一个单一的特征转换器,可以实现例如特征选择或将特征转换到不同的空间(如 PCA)。如上例所示,可以通过设置 include_preprocessors=["no_preprocessing"] 来关闭特征预处理。
  重采样策略
  可以在 auto-sklearn/examples/ 中找到使用 holdout 数据集和交叉验证的示例。
  结果检查
  Auto-sklearn 允许用户检查训练结果并查看相关统计数据。以下示例显示如何打印不同的统计信息以进行相应检查。
  import autosklearn.classification<br /><br />automl = autosklearn.classification.AutoSklearnClassifier()<br />automl.fit(X_train, y_train)<br />automl.cv_results_<br />automl.sprint_statistics()<br />automl.show_models()<br />
  并行计算
  auto-sklearn 通过共享文件系统上的数据共享支持并行执行。在这种模式下,SMAC 算法通过在每次迭代后将其训练数据写入磁盘来共享其模型的训练数据。在每次迭代开始时,SMAC 加载所有新发现的数据点。我们提供了一个实现 scikit-learn 的 n_jobs 功能的示例,以及一个关于如何手动启动多个 auto-sklearn 实例的示例。
  在默认模式下,auto-sklearn 已经使用了两个内核。第一个用于模型构建,第二个用于在每次新的机器学习模型完成训练时构建集成。序列示例显示了如何一次只使用一个内核按顺序运行这些任务。
  此外,根据 scikit-learn 和 numpy 安装,模型构建过程最多可以使用所有内核。这种行为是 auto-sklearn 所不希望的,很可能是由于从 pypi 安装 numpy 作为二进制轮(参见此处)。做 export OPENBLAS_NUM_THREADS=1 应该禁用此行为并使 numpy 一次只使用一个核心。
  香草自动sklearn
  auto-sklearn主要基于scikit-learn的封装。因此,可以遵循 scikit-learn 中的持久性示例。
  要在高效且稳健的自动机器学习材料中使用 vanilla auto-sklearn,请设置 ensemble_size=1 和 initial_configurations_via_metallearning=0。
  import autosklearn.classification<br />automl = autosklearn.classification.AutoSklearnClassifier(<br />    ensemble_size=1, initial_configurations_via_metalearning=0)<br />
  整体大小为 1 将导致始终选择在验证集上具有最佳测试性能的单个模型。将初始配置 meta-learn 设置为 0 将使 auto-sklearn 使用常规 SMAC 算法来设置新的超参数配置。
  参考文献[1]
  高效且强大的自动化机器学习:
  [2]
  Auto-sklearn官方文档:
  [3]
  AutoSklearnClassifier:#classification
  [4]
  AutoSklearnRegressor:#regression
  [5]
  声纳数据集:
  [6]
  汽车保险数据集:
  [7]
  用户手册:#manual
  [8]
  自动学习/问题/142:
  [9]
  [10]
  往期精彩回顾<br data-darkmode-bgcolor-16019459903493="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16019459903493="rgb(255, 255, 255)" data-darkmode-color-16019459903493="rgb(163, 163, 163)" data-darkmode-original-color-16019459903493="rgb(0, 0, 0)" data-darkmode-bgcolor-16359090834904="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16359090834904="#fff|rgb(255, 255, 255)" data-darkmode-color-16359090834904="rgb(163, 163, 163)" data-darkmode-original-color-16359090834904="#fff|rgb(0, 0, 0)|rgb(62, 62, 62)|rgb(0, 0, 0)|rgb(51, 141, 175)|rgb(0, 0, 0)" style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br data-darkmode-bgcolor-16019459903493="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16019459903493="rgb(255, 255, 255)" data-darkmode-color-16019459903493="rgb(163, 163, 163)" data-darkmode-original-color-16019459903493="rgb(0, 0, 0)" data-darkmode-bgcolor-16359090834904="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16359090834904="#fff|rgb(255, 255, 255)" data-darkmode-color-16359090834904="rgb(163, 163, 163)" data-darkmode-original-color-16359090834904="#fff|rgb(0, 0, 0)|rgb(62, 62, 62)|rgb(0, 0, 0)|rgb(51, 141, 175)|rgb(0, 0, 0)" style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br data-darkmode-bgcolor-16019459903493="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16019459903493="rgb(255, 255, 255)" data-darkmode-color-16019459903493="rgb(163, 163, 163)" data-darkmode-original-color-16019459903493="rgb(0, 0, 0)" data-darkmode-bgcolor-16359090834904="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16359090834904="#fff|rgb(255, 255, 255)" data-darkmode-color-16359090834904="rgb(163, 163, 163)" data-darkmode-original-color-16359090834904="#fff|rgb(0, 0, 0)|rgb(62, 62, 62)|rgb(0, 0, 0)|rgb(51, 141, 175)|rgb(0, 0, 0)" style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br data-darkmode-bgcolor-16019459903493="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16019459903493="rgb(255, 255, 255)" data-darkmode-color-16019459903493="rgb(163, 163, 163)" data-darkmode-original-color-16019459903493="rgb(0, 0, 0)" data-darkmode-bgcolor-16359090834904="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16359090834904="#fff|rgb(255, 255, 255)" data-darkmode-color-16359090834904="rgb(163, 163, 163)" data-darkmode-original-color-16359090834904="#fff|rgb(0, 0, 0)|rgb(62, 62, 62)|rgb(0, 0, 0)|rgb(51, 141, 175)|rgb(0, 0, 0)" style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载中国大学慕课《机器学习》(黄海广主讲)机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑<br data-darkmode-bgcolor-16019459903493="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16019459903493="rgb(255, 255, 255)" data-darkmode-color-16019459903493="rgb(39, 84, 255)" data-darkmode-original-color-16019459903493="rgb(2, 30, 170)" data-darkmode-bgcolor-16359090834904="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16359090834904="#fff|rgb(255, 255, 255)" data-darkmode-color-16359090834904="rgb(39, 84, 255)" data-darkmode-original-color-16359090834904="#fff|rgb(0, 0, 0)|rgb(62, 62, 62)|rgb(0, 0, 0)|rgb(51, 141, 175)|rgb(0, 0, 0)|rgb(2, 30, 170)" style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />AI基础下载机器学习交流qq群955171419,加入微信群请扫码:
  核心方法:网站标题seo怎么写?网站标题关键词写法规范-网站SEO标题分析工具
  网站标题seo,网站标题怎么写?网站标题的作用是什么?网站的标题决定了你网站的排名,为什么这么说呢。因为搜索引擎通过识别标题来识别你网站的主题和你网站的类型。同样,如果用户看到您的标题没有焦点,他们也不会点击进入。所以现在你知道标题的重要性了。
  常规标题写作技巧:
  1.标题核心词-标题核心词2-标题核心词3-品牌词
  2、标题核心词-吸引用户的词-品牌词
  为什么我的标题区间符号是:“-” 因为百度官方说统计区间符号是单杠。这是一个关于如何写标题的教程。使用这个免费的SEO工具,你只需要输入一个标题词,自动采集
页面排名的所有标题。我们只需要将这些数据导出到表中,进行分析,创建自己的标题写法即可。(注意:标题一般不要超过30个字符)
  一个新站想快速对其网站进行排名。方法其实很简单。只要认真按照我的方法去做,一定会有效果的。那到底是什么方法这么厉害呢?
  
  网站处于什么阶段?
  想要做好网站关键词排名,就像病人去看病一样。如果医生不明白他的病人怎么了,他就开药,有意识地打针。会发生什么?影响?连我们自己都不了解我们的网站,它现在是一个什么样的状态,我们该如何优化呢?因此,在前期,我们需要对网站进行阶段性判断。首先简单定位一下,可以分为初级、中期、高级3个阶段。阶段制定不同阶段的优化方法)。
  新站的优化方法应该在什么阶段?有基础的朋友,新站应该知道属于前期,也就是初期优化阶段。我们应该如何开始这个初级优化阶段?为了让更多的朋友看得清楚,李勇简单地将这个初步的优化过程分成了4个小部分给大家。请继续仔细阅读。
  1、分析新站的用户群体
  做网站首先要知道谁会访问我们的网站?他们为什么访问我们的网站?只有在你对你的网站用户有了详细的了解之后,你才能进行下一步,为他们提供有价值的内容。比如李勇的SEO博客访问者一般都是站长或者研究SEO的人,或者是做营销推广的人。他们为什么来访问李勇的SEO博客?因为这个博客上有他们需要的内容!
  2. 选择网站所有者 关键词
  
  一个网站主机关键词就相当于我们的名字,关键词的索引就相当于我们的人气,所以我们尽量选择最热门的,选择那个主机关键词我们确定(可以排名的是关键词),就像我的博客一样,主关键词是李勇SEO博客,因为我是做个人品牌的,所以你懂的,辅助的关键词包括合肥seo、合肥网站优化、合肥seo培训等,选择网站关键词可以说是看你提供的服务。如果你想做品牌,那没关系,主关键词就写你的品牌,如果你不是品牌,纯粹为了流量,建议选主关键词 有交通。
  3.定位网站栏目分类
  当用户进入你的网站时,他们基本上会查看你网站上的栏目,看是否有他们想看的内容,内容应该在那个栏目中。比如你去超市,如果你是买菜的话,你会直接去卖菜的地方。如果是买日用品,应该到卖日用品的地方去。网站栏目的分类我们要根据用户的需求来定位。
  仍然需要充分理解基本理论。这里需要注意的是,学习SEO优化方法需要与时俱进,紧跟搜索引擎的脚步。网上很多理论都与百度的算法渐行渐远。如果你认为自己已经掌握了 SEO 而停滞不前,你就会落后于“时间”。另外,我们需要找到最好的seo学习网站,这个怎么说呢?很多时候seo是一件很随意的事情,大家可以谈一谈,哪些是有根据的,哪些是典型的seo谬论,需要仔细甄别。高效学习SEO的精髓也在这里。
  关键词 是网站必不可少的东西。首先分析关键词的竞争力和搜索热度,准确识别长尾关键词。通常有两种新手。思路是专注于关键词,比如线上推广关键词,直接优化线上推广关键词。为什么?因为这个词有很多搜索量,但是有这样的想法。对于初学者来说,我想说的是,搜索量越大的关键词会更有竞争力,也更难优化,无法以吸引准确的客户,这些客户通常是长期搜索者。来自于结尾关键词,比如在前面加一个地区名“中山网络推广外包”,另一个想法是优化那些没有搜索量的词,为什么?因为这个词没有竞争力,每分钟都是优化的第一名,但是对于有这种想法的新手,我只想说,如果餐厅建在没有人的山顶上,还会有客人吗来吃饭?没有竞争力,没有搜索量,白费那么多力气做什么?

汇总:分页列表详细信息采集 | 2个月精通优采云 第1课

采集交流优采云 发表了文章 • 0 个评论 • 76 次浏览 • 2022-11-21 19:29 • 来自相关话题

  汇总:分页列表详细信息采集 | 2个月精通优采云
第1课
  在之前的教程中,我们以赶集网店铺数据采集和携程旅行数据为例,体验了一波优采云
采集数据的常(li)正(hai)操作。
  嗯?在这两个实战案例中,规则配置看起来很相似,采集过程也有点相似?
  来吧,是时候追本溯源,透过现象看本质了。
  网页内容由相似的块组成。需要点击“下一页”翻页,然后点击各个链接进入详情页采集数据。
  本文示例网站地址为:
  在开始采集之前,需要观察网页的结构,明确采集的内容。以示例URL为例,内容有4页,每页有3个电影链接。我们需要点击每部电影的链接,进入电影详情页,采集
电影的剧情、上映时间等字段。
  优采云
基于Firefox核心浏览器,通过模拟人的思维和操作,全自动提取网页内容。以示例 URL 为例。在优采云
中打开后,需要创建一个翻页循环,点击“下一页”,然后点击“下一页”自动翻页。然后建立一个电影链接列表循环,打开每部电影的链接,进入电影详情页。然后采集电影详情页的数据。
  1打开网页
  1) 登录优采云
7.0采集器,点击新建任务,选择“自定义采集”。进入任务配置页面
  2) 输入要采集的网址,点击“保存网址”。系统会进入流程设计页面,自动打开之前输入的网址
  2 创建翻页循环
  1) 用鼠标单击“下一页”按钮,在弹出的操作提示框中选择“循环单击下一页”。这一步会模拟手动,自动点击翻页
  
  3 创建循环列表
  1) 点击下图中第一部电影“教父2”的链接,该链接将被选中并标有绿色框
  2) 优采云
的智能算法会自动检测其他相似元素(在这种情况下,链接到其他两个电影标题)。在操作提示框中选择“全选”,优采云
会自动选择所有电影链接
  3) 选择“循环点击每个链接”,优采云
会自动逐一点击每个电影链接,进入电影详情页面
  4 提取数据
  1)在页面点击要提取的电影的title字段,title字段会被选中,选中后用红框标注
  2)在弹出的提示框中,选择“采集
该元素的文本”,表示要采集
页面中的文本数据
  3)同理,点击要采集的其他段,然后选择“采集该元素的文本”
  5 修改字段名称
  1) 点击“流程”按钮,显示“流程设计器”和“自定义当前操作”两个版块。(规则配置过程中可随时打开“流程”)
  2) 在如下界面中,修改字段名称。这里的字段名相当于表头,方便采集时区分各个字段类别。修改完成后点击“确定”保存
  
  6 开始采集
  1) 点击“保存并开始”,在弹出的对话框中选择“开始本地采集”。系统会在本地电脑上启动采集任务,采集数据
  2)任务采集完成后会弹出采集结束的提示,然后选择导出数据,这里以选择导出excel2007为例,然后点击确定
  3)选择文件存放路径,然后点击保存
  然后,我们在几分钟内得到了这样的数据
  动画模式是否让学习更愉快?
  如果您有任何建议或问题,请在 biubiubiu 给我留言!
  给大家的忠告
  学会了分页列表详情的采集
  趁热打铁
  更多实用教程
  汇总:文章采集软件大全
  推荐一:emlog文章自动采集
插件v5.3.1
  简介:从事网站编辑工作的朋友可能需要采集其他网站的内容。如果想快速采集
需要的文章,可以试试小编带来的这款emlog文章自动采集
插件。这是一款简单方便的文章采集
工具,可以帮助用户快速采集
网站上的文章发布到自己的博客中,还可以选择标签和分类。使用方法 1.设置采集时间 2.输入采集链接。如果需要分批,可以设置为txt文件 3.点击Analysis采集
文章信息 更新功能 1:新增用法...
  推荐二:小白短句 v1.1
  简介:向大家推荐一款简单易用的采集
软件“小白短句”。这个软件的界面非常清爽,没有任何捆绑和插件。用户可以使用本软件从网上随机搜集短句,找到你喜欢的句子提供全面精美的句子,使用起来非常方便,阅读效果也很好。欢迎大家下载使用~ 使用方法 运行软件,点击开始欣赏不一样的短句。每次点击都会获得新的短句 亮点 小优点...
  推荐三:zblog采集软件v1.1
  简介:zblog是一个基于Java语言编写的博客系统。很多朋友喜欢在上面发布或者浏览一些信息。今天小编带来的zblog采集
软件就是为本博客平台打造的采集
工具。是一个简单的小程序,具有采集
文章的功能。通过该软件,用户可以快速采集
其他网站的文章并发布到支持自定义采集
的zblog博客。软件功能 支持自动采集对方图片到你的网站 支持发布文章到标签栏 支持任意用户发布文章 支持采集内容,快速过滤内容 支持定时...
  emlog采集
器(自定义采集
规则)v1.3.2:
  简介:emlog采集器是一款为网站内容运营者开发的采集发布工具。它可以将规则导入软件集合。压缩包内附有采集规则样例,供参考。不会使用的朋友可以先看看,然后自己使用 编辑需要的采集
规则,采集
的文章可以在软件界面预览,支持一键发布多篇文章。软件特点 1.emlog采集器采集流程简单,自定义采集规则 2.软件采集可以导入规则,可以在TXT中预先编辑采集规则 3.新用户可以在里面设置新规则软件,然后保存起来以备下次使用 4....
  获取各平台今日热门文章v1.1:
  简介:想要快速获取最新的热点新闻文章,就试试这款获取各平台今日热搜文章的工具吧!本软件为用户提供了互联网上的热搜和采集
功能。它非常强大且易于使用。支持知乎、微博、百度、虎嗅、豆瓣等大家喜欢看的各种平台,让用户轻松上网。网络热点内容,快速查看最新消息!软件开发各平台今日热搜、热文采集,让你一览天下!在信息飞速传播的今天,流量为王,信息孤岛形成。有时我们不得不浏览各种平台和网站来查看最新消息。. . 第二...
  微信文章下载助手v1.1:
  简介:很多朋友平时喜欢在微信平台上浏览一些公众号的文章。如果看到自己需要的内容,想要保存下载,可以使用小编带来的这款微信文章下载助手。软件简单实用,功能强大。,可以帮助用户快速获取微信公众号发布的文章内容,支持抓取指定关键词或段落,保存在本地,方便后续操作。软件开发 经过一个月左右的断断续续的学习和两天的开发,已经实现了Go语言版的微信文章下载助手!它移植了我自己的同名Java项目,纯命令行操作,可以...
  zblog采集
插件v1.0.1:
  简介:zblog采集
插件是论坛网友制作的一款易语言小程序。它的主要功能是帮助用户从其他网站采集
文章资源,然后发布到指定的zblog博客上获得点击率。您可以自由自定义集合对象。收款规则定了,收款效率也很稳定。但是,由于该程序是用一种简单的语言编写的,因此在使用时需要添加信任。插件功能可以采集
其他网站的文章,发布到你的zblog博客上。
  伪原创文章采集
工具v1.1:
  简介:伪原创文章收录工具是一款简单易用的文章自动收录和优化小站长工具。您可以使用它来自动采集
目标站的文本。软件提供相似词替换功能,还支持用户自定义关键词替换,可以有效改善文章的虚假原创,使用方法也非常简单。只需三步即可完成。软件特色 自动采集目标站文章,重新制作伪原创。这个工具可以优化文章,让伪原创更好。自己选择...
  通用文章文本提取系统v1.0.0.2:
  简介:万能文章文本提取系统可以自动提取网站上的文章,非常方便。当我们在网上看到自己喜欢或需要的文章内容时,就可以使用本软件进行获取,全自动运行,使用非常简单,用户只需要输入文章地址即可实现一-点击提取,比复制更快更简单,支持批量操作!软件功能 1、软件无需编写规则,支持全自动采集 2、采集前,检查软件目录下是否有“采集存储配置.ini”和“采集链接.txt”两个文件。
  热门博客外推软件v1.3:
  简介:大众博客外推软件现有20000个采集模块,提供四种不同的更新模式,打破传统手动更新网站的方式,直接帮你批量采集其他博客和网站的内容,获取的数据你可以处理并发布,或导出为任意格式,省心省事,让您花最少的精力管理最多的网站。软件特色 现有20,000个采集模块 模块市场有20,000个采集模块,涵盖各种大型博客、新闻、论坛和门户网站。您可以随时使用这些模块或制作您需要的捕获模块。任何格式导入指南...
  
  emlog采集发布插件v1.1.0.1:
  简介:emlog采集发布插件非常智能,可以帮助用户快速采集网站文章内容。通过该软件可以自动采集网站整页文章的图文,并支持对采集内容进行二次编辑发布。当目标网站有文章更新时,还可以提醒用户,方便实用。软件特性支持显示效果设置标题样式文章自动采集HTML5代码编辑一键登录发布文章软件特性标签列表:使用自动标签后,如果列表中的文章收录
关键词,将自动添加标签文章发布...
  AI智能文章采集软件v1.4:
  简介:AI智能文章采集软件对于从事自媒体或者软文的朋友来说,一定是一款非常实用的文章采集加工神器。本软件不仅可以帮助用户采集
好文章,还可以进行伪原创加工,一键发布,加工后的文章原创率和收录率都在80%以上,大大提高了营销效果。我推荐大家尝试一下。相信你会喜欢的~ 软件特色 一篇好文章不仅可以收录你的软文,排名和转化都出彩,直接提升了营销效果。您可以选择今日头条、趣味头条、一点资讯、东方头条……
  知乎文章采集导出助手v1.1.2:
  简介:知乎文章采集
导出助手可以帮助用户批量下载导出知乎上的文章,支持导出知乎网站任意问答中的问答,以及问答评论区,还可以指定所有用户下的文章,包括文章内容和文章评论,导出格式以html格式为主,也可以导出pdf和Word格式。软件说明 1、可以帮助用户根据关键词采集
知乎上的文章内容,并支持批量下载导出;2、收录文章中的图片、视频格式不变;3.导出格式主要是html格式,也可以导出pd...
  沙漠采集器(今日文章合集)v1.0.0.1:
  简介:沙漠采集器可以高效快速的将各类爆款文章下载到本地。用户可以设置一个或多个关键字进行采集
。一个关键字可以采集
数万篇文章。它还支持过滤阅读时间、评论时间和时间。支持多线程下载图片,从事自媒体行业的朋友一定要试试这款文章采集工具!软件功能支持过滤阅读次数、评论次数、时间、图片多线程下载。包括但不限于:热点、图片、科技、娱乐、游戏、体育、汽车、财经、美食、军事、国际、时尚、旅游、探索、亲子、健康、美容、历史、...
  skycc文章采集工具v1.1:
  简介:一篇好的文章不仅可以让你的软文在采集
、排名、转化等方面大放异彩。直接提升营销效果。可以选择今日头条、趣头条、一点新闻、东方头条等各大自媒体平台的文章,进行热点文章的搜集。操作简单方便。只需输入关键词即可开始采集
文章,并可随时暂停。您也可以打开它查看文章的详细信息。做自媒体和发软文的朋友,如果有这个软件,可以借用一下...
  伪原创v1.1文章合集:
  介绍:伪原创文章采集主要是采集文章,替换为伪原创,根据定制生成伪原创。主要面向自媒体用户和软文用户。用户一键采集
相关文章。还增加了替换相似词的功能,进一步优化伪原创。它还增加了可自定义的关键字替换功能,可以由用户选择。...
  skycc文章采集批量伪原创工具v1.3:
  介绍:skycc文章采集批量伪原创工具,主要是自动批量采集文章,对采集到的文章进行批量伪原创,然后进行批量伪原创检查。也可以对单篇文章进行伪原创批处理。提高文章原创性,大大加速搜索引擎收录。注意:如果软件无法正常打开,请安装JAVA环境...
  奥本微信文章采集软件v2.1:
  简介:奥本微信文章采集软件是一款非常好用的微信文章采集器。本软件可以支持各种微信热门文章的搜索导出,还支持汽车、历史、笑话、生活、教育、健康、时尚等十几个热门栏目的文章搜索导出,软件搜索文章非常快,而且超级好用,非常适合从事自媒体行业的人下载使用。...
  优采云
智能文章采集系统v2016.04.09:
  简介:优采云
智能文章采集系统,不知道源码规则也能采集,只要是文章内容站,都可以快速采集优采云
智能文章采集系统,不知道源码规则也能采集,只要是文章内容类网站都能快速采集并自动伪原创中英文,原创度80%以上。自动去噪乱码和文章长度判断,获得干净整洁的文章内容。全球小语种支持,指定网站采集
,非文章源多线程多任务(Multisite)同步...
  多多极速蜘蛛v1.1:
  简介:多多快蜘蛛是多多软件出品的一款专业用于互联网文章和网址高效采集的产品。软件具有网站域名采集、文章智能采集、网站文件检测三大功能。打破了传统软件操作难、速度慢的局限,真正做到了1分钟上手,10分钟精通。使用MongoDB数据库可以真正实现分布式高速存储和提取。主要特点: 分布式极速采集任务分配给多个客户端,具有...
  
  宏业文章采集
器v3.7:
  简介:红叶文章采集器是一款超强的网站文章采集器。它的英文名字是Fast_Spider。它属于蜘蛛爬虫程序。必备文章价值和浏览价值,自动HTM-TXT转换。本软件为绿色软件,解压后即可使用!红叶文章采集器软件特点(1)本软件采用北大天网MD5指纹加权算法,...
  麒麟文章采集工具v1.1:
  介绍:麒麟文章采集软件,采集站内文章,不再需要写采集规则,因为不是每个人都会写,也不是适合所有站点。并且可以收录未收录的文章,一般网站都可以收录。麒麟文章采集软件操作方法:只需输入网址,设置好要采集的文章后缀的URL,即可采集本站文章的所有内容,包括文章标题,文章链接地址文章,文章采集
后...
  优采云
万能文章采集器v3.2.6.1:
  简介:优采云
是优采云
软件出品的一款万能文章采集软件。只需输入关键词就可以采集
各种网页和新闻,也可以采集
指定列表页(栏目页)的文章。注意:微信引擎有严格的限制,请将采集线程数设置为1,否则很容易生成验证码。特点: 1、依托优采云
软件优质的通用文本识别智能算法,可实现对任意网页文本的自动提取,有效率达95%以上。2. 只需键入 关键词 即可...
  WEB基础高性能网络爬虫文章采集
器v6.1:
  简介:基于WEB的高性能网页爬虫文章采集器是一款通用的网页采集爬虫。它可以在不配置模板的情况下采集
世界上任何网站的精华文章。WEB基础高性能网络爬虫文章采集
器是一个网络蜘蛛爬虫程序,用于从指定网站采集
大量精华文章,并将垃圾网页信息直接丢弃,只保存有阅读价值和浏览的精华文章值,并自动执行HTM-TXT转换,并提取标题,正...
  展越高性能网络爬虫文章采集器v6.1:
  简介:赞悦高性能网络爬虫文章采集器是一款通用的网页爬虫。它可以在不配置模板的情况下采集
世界上任何网站的精华文章。本软件全称为赞悦高性能网页爬虫文章采集器,属于网页蜘蛛爬虫程序。用于采集
指定网站的大量精华文章,会直接丢弃其中的垃圾网页信息,只保存有阅读价值和浏览价值的。精华文章,自动HTM-TXT转换,并提取...
  智汇seo软件v1.7:
  简介:智汇seo软件是一款集网站自动更新、长尾关键词自动组合、文章采集
、文章伪原创等功能为一体的多功能网站优化推广软件。本软件需要.net framework 2.0以上的运行环境。功能一:多任务定时自动更新网站(无人值守) 您可以根据需要自由设置采集时间和发布更新文章的时间间隔,尽可能科学自动化地管理您的网站。你...
  甲子博客营销助手v7.1:
  简介:甲子博客营销助手是一款博客推广软件。推广思路: 1、采集
各大网站的热门博文 2、自动添加你设置的链接地址 3、自动发布到各大博客网站 4、自动推广你的博客(漫游、加好友、留言等) 如果有数以百万计的文章在网上流传,有你的链接,不断被转发和搜索……
  猪浏览器(原猪采集器
)v2.2.3.5:
  简介:小猪浏览器(原小猪采集器
)致力于服务草根站长。是站长必备的工具箱和浏览器。小猪浏览器集成了小猪采集
助手、推广助手、搜索助手、投票助手、采集
脚本、文章编辑、采集
夹、图片管理、站长工具等大量功能。注意:小猪浏览器程序一定要放在英文目录下。.....
  站长之星v2.0.3.2:
  简介:站长之星是集文章采集、文章处理、文章发布于一体的专业网站群内容管理系统。界面美观,操作简单,功能强大。站长星拥有完整灵活的执行流程引擎、配置扩展机制和插件系统。你只需要提供一个目标关键词,就可以得到很多相关的关键词(即长尾关键词),然后用这个... &nbsp;
  以上内容是小​​编整理的关于文章采集软件百科的相关攻略内容。如有不妥,请及时与我们联系。想要了解更多文章采集
的最新攻略和资讯,请多多关注全茶网
  关键词:
  文章合集 查看全部

  汇总:分页列表详细信息采集 | 2个月精通优采云
第1课
  在之前的教程中,我们以赶集网店铺数据采集和携程旅行数据为例,体验了一波优采云
采集数据的常(li)正(hai)操作。
  嗯?在这两个实战案例中,规则配置看起来很相似,采集过程也有点相似?
  来吧,是时候追本溯源,透过现象看本质了。
  网页内容由相似的块组成。需要点击“下一页”翻页,然后点击各个链接进入详情页采集数据。
  本文示例网站地址为:
  在开始采集之前,需要观察网页的结构,明确采集的内容。以示例URL为例,内容有4页,每页有3个电影链接。我们需要点击每部电影的链接,进入电影详情页,采集
电影的剧情、上映时间等字段。
  优采云
基于Firefox核心浏览器,通过模拟人的思维和操作,全自动提取网页内容。以示例 URL 为例。在优采云
中打开后,需要创建一个翻页循环,点击“下一页”,然后点击“下一页”自动翻页。然后建立一个电影链接列表循环,打开每部电影的链接,进入电影详情页。然后采集电影详情页的数据。
  1打开网页
  1) 登录优采云
7.0采集器,点击新建任务,选择“自定义采集”。进入任务配置页面
  2) 输入要采集的网址,点击“保存网址”。系统会进入流程设计页面,自动打开之前输入的网址
  2 创建翻页循环
  1) 用鼠标单击“下一页”按钮,在弹出的操作提示框中选择“循环单击下一页”。这一步会模拟手动,自动点击翻页
  
  3 创建循环列表
  1) 点击下图中第一部电影“教父2”的链接,该链接将被选中并标有绿色框
  2) 优采云
的智能算法会自动检测其他相似元素(在这种情况下,链接到其他两个电影标题)。在操作提示框中选择“全选”,优采云
会自动选择所有电影链接
  3) 选择“循环点击每个链接”,优采云
会自动逐一点击每个电影链接,进入电影详情页面
  4 提取数据
  1)在页面点击要提取的电影的title字段,title字段会被选中,选中后用红框标注
  2)在弹出的提示框中,选择“采集
该元素的文本”,表示要采集
页面中的文本数据
  3)同理,点击要采集的其他段,然后选择“采集该元素的文本”
  5 修改字段名称
  1) 点击“流程”按钮,显示“流程设计器”和“自定义当前操作”两个版块。(规则配置过程中可随时打开“流程”)
  2) 在如下界面中,修改字段名称。这里的字段名相当于表头,方便采集时区分各个字段类别。修改完成后点击“确定”保存
  
  6 开始采集
  1) 点击“保存并开始”,在弹出的对话框中选择“开始本地采集”。系统会在本地电脑上启动采集任务,采集数据
  2)任务采集完成后会弹出采集结束的提示,然后选择导出数据,这里以选择导出excel2007为例,然后点击确定
  3)选择文件存放路径,然后点击保存
  然后,我们在几分钟内得到了这样的数据
  动画模式是否让学习更愉快?
  如果您有任何建议或问题,请在 biubiubiu 给我留言!
  给大家的忠告
  学会了分页列表详情的采集
  趁热打铁
  更多实用教程
  汇总:文章采集软件大全
  推荐一:emlog文章自动采集
插件v5.3.1
  简介:从事网站编辑工作的朋友可能需要采集其他网站的内容。如果想快速采集
需要的文章,可以试试小编带来的这款emlog文章自动采集
插件。这是一款简单方便的文章采集
工具,可以帮助用户快速采集
网站上的文章发布到自己的博客中,还可以选择标签和分类。使用方法 1.设置采集时间 2.输入采集链接。如果需要分批,可以设置为txt文件 3.点击Analysis采集
文章信息 更新功能 1:新增用法...
  推荐二:小白短句 v1.1
  简介:向大家推荐一款简单易用的采集
软件“小白短句”。这个软件的界面非常清爽,没有任何捆绑和插件。用户可以使用本软件从网上随机搜集短句,找到你喜欢的句子提供全面精美的句子,使用起来非常方便,阅读效果也很好。欢迎大家下载使用~ 使用方法 运行软件,点击开始欣赏不一样的短句。每次点击都会获得新的短句 亮点 小优点...
  推荐三:zblog采集软件v1.1
  简介:zblog是一个基于Java语言编写的博客系统。很多朋友喜欢在上面发布或者浏览一些信息。今天小编带来的zblog采集
软件就是为本博客平台打造的采集
工具。是一个简单的小程序,具有采集
文章的功能。通过该软件,用户可以快速采集
其他网站的文章并发布到支持自定义采集
的zblog博客。软件功能 支持自动采集对方图片到你的网站 支持发布文章到标签栏 支持任意用户发布文章 支持采集内容,快速过滤内容 支持定时...
  emlog采集
器(自定义采集
规则)v1.3.2:
  简介:emlog采集器是一款为网站内容运营者开发的采集发布工具。它可以将规则导入软件集合。压缩包内附有采集规则样例,供参考。不会使用的朋友可以先看看,然后自己使用 编辑需要的采集
规则,采集
的文章可以在软件界面预览,支持一键发布多篇文章。软件特点 1.emlog采集器采集流程简单,自定义采集规则 2.软件采集可以导入规则,可以在TXT中预先编辑采集规则 3.新用户可以在里面设置新规则软件,然后保存起来以备下次使用 4....
  获取各平台今日热门文章v1.1:
  简介:想要快速获取最新的热点新闻文章,就试试这款获取各平台今日热搜文章的工具吧!本软件为用户提供了互联网上的热搜和采集
功能。它非常强大且易于使用。支持知乎、微博、百度、虎嗅、豆瓣等大家喜欢看的各种平台,让用户轻松上网。网络热点内容,快速查看最新消息!软件开发各平台今日热搜、热文采集,让你一览天下!在信息飞速传播的今天,流量为王,信息孤岛形成。有时我们不得不浏览各种平台和网站来查看最新消息。. . 第二...
  微信文章下载助手v1.1:
  简介:很多朋友平时喜欢在微信平台上浏览一些公众号的文章。如果看到自己需要的内容,想要保存下载,可以使用小编带来的这款微信文章下载助手。软件简单实用,功能强大。,可以帮助用户快速获取微信公众号发布的文章内容,支持抓取指定关键词或段落,保存在本地,方便后续操作。软件开发 经过一个月左右的断断续续的学习和两天的开发,已经实现了Go语言版的微信文章下载助手!它移植了我自己的同名Java项目,纯命令行操作,可以...
  zblog采集
插件v1.0.1:
  简介:zblog采集
插件是论坛网友制作的一款易语言小程序。它的主要功能是帮助用户从其他网站采集
文章资源,然后发布到指定的zblog博客上获得点击率。您可以自由自定义集合对象。收款规则定了,收款效率也很稳定。但是,由于该程序是用一种简单的语言编写的,因此在使用时需要添加信任。插件功能可以采集
其他网站的文章,发布到你的zblog博客上。
  伪原创文章采集
工具v1.1:
  简介:伪原创文章收录工具是一款简单易用的文章自动收录和优化小站长工具。您可以使用它来自动采集
目标站的文本。软件提供相似词替换功能,还支持用户自定义关键词替换,可以有效改善文章的虚假原创,使用方法也非常简单。只需三步即可完成。软件特色 自动采集目标站文章,重新制作伪原创。这个工具可以优化文章,让伪原创更好。自己选择...
  通用文章文本提取系统v1.0.0.2:
  简介:万能文章文本提取系统可以自动提取网站上的文章,非常方便。当我们在网上看到自己喜欢或需要的文章内容时,就可以使用本软件进行获取,全自动运行,使用非常简单,用户只需要输入文章地址即可实现一-点击提取,比复制更快更简单,支持批量操作!软件功能 1、软件无需编写规则,支持全自动采集 2、采集前,检查软件目录下是否有“采集存储配置.ini”和“采集链接.txt”两个文件。
  热门博客外推软件v1.3:
  简介:大众博客外推软件现有20000个采集模块,提供四种不同的更新模式,打破传统手动更新网站的方式,直接帮你批量采集其他博客和网站的内容,获取的数据你可以处理并发布,或导出为任意格式,省心省事,让您花最少的精力管理最多的网站。软件特色 现有20,000个采集模块 模块市场有20,000个采集模块,涵盖各种大型博客、新闻、论坛和门户网站。您可以随时使用这些模块或制作您需要的捕获模块。任何格式导入指南...
  
  emlog采集发布插件v1.1.0.1:
  简介:emlog采集发布插件非常智能,可以帮助用户快速采集网站文章内容。通过该软件可以自动采集网站整页文章的图文,并支持对采集内容进行二次编辑发布。当目标网站有文章更新时,还可以提醒用户,方便实用。软件特性支持显示效果设置标题样式文章自动采集HTML5代码编辑一键登录发布文章软件特性标签列表:使用自动标签后,如果列表中的文章收录
关键词,将自动添加标签文章发布...
  AI智能文章采集软件v1.4:
  简介:AI智能文章采集软件对于从事自媒体或者软文的朋友来说,一定是一款非常实用的文章采集加工神器。本软件不仅可以帮助用户采集
好文章,还可以进行伪原创加工,一键发布,加工后的文章原创率和收录率都在80%以上,大大提高了营销效果。我推荐大家尝试一下。相信你会喜欢的~ 软件特色 一篇好文章不仅可以收录你的软文,排名和转化都出彩,直接提升了营销效果。您可以选择今日头条、趣味头条、一点资讯、东方头条……
  知乎文章采集导出助手v1.1.2:
  简介:知乎文章采集
导出助手可以帮助用户批量下载导出知乎上的文章,支持导出知乎网站任意问答中的问答,以及问答评论区,还可以指定所有用户下的文章,包括文章内容和文章评论,导出格式以html格式为主,也可以导出pdf和Word格式。软件说明 1、可以帮助用户根据关键词采集
知乎上的文章内容,并支持批量下载导出;2、收录文章中的图片、视频格式不变;3.导出格式主要是html格式,也可以导出pd...
  沙漠采集器(今日文章合集)v1.0.0.1:
  简介:沙漠采集器可以高效快速的将各类爆款文章下载到本地。用户可以设置一个或多个关键字进行采集
。一个关键字可以采集
数万篇文章。它还支持过滤阅读时间、评论时间和时间。支持多线程下载图片,从事自媒体行业的朋友一定要试试这款文章采集工具!软件功能支持过滤阅读次数、评论次数、时间、图片多线程下载。包括但不限于:热点、图片、科技、娱乐、游戏、体育、汽车、财经、美食、军事、国际、时尚、旅游、探索、亲子、健康、美容、历史、...
  skycc文章采集工具v1.1:
  简介:一篇好的文章不仅可以让你的软文在采集
、排名、转化等方面大放异彩。直接提升营销效果。可以选择今日头条、趣头条、一点新闻、东方头条等各大自媒体平台的文章,进行热点文章的搜集。操作简单方便。只需输入关键词即可开始采集
文章,并可随时暂停。您也可以打开它查看文章的详细信息。做自媒体和发软文的朋友,如果有这个软件,可以借用一下...
  伪原创v1.1文章合集:
  介绍:伪原创文章采集主要是采集文章,替换为伪原创,根据定制生成伪原创。主要面向自媒体用户和软文用户。用户一键采集
相关文章。还增加了替换相似词的功能,进一步优化伪原创。它还增加了可自定义的关键字替换功能,可以由用户选择。...
  skycc文章采集批量伪原创工具v1.3:
  介绍:skycc文章采集批量伪原创工具,主要是自动批量采集文章,对采集到的文章进行批量伪原创,然后进行批量伪原创检查。也可以对单篇文章进行伪原创批处理。提高文章原创性,大大加速搜索引擎收录。注意:如果软件无法正常打开,请安装JAVA环境...
  奥本微信文章采集软件v2.1:
  简介:奥本微信文章采集软件是一款非常好用的微信文章采集器。本软件可以支持各种微信热门文章的搜索导出,还支持汽车、历史、笑话、生活、教育、健康、时尚等十几个热门栏目的文章搜索导出,软件搜索文章非常快,而且超级好用,非常适合从事自媒体行业的人下载使用。...
  优采云
智能文章采集系统v2016.04.09:
  简介:优采云
智能文章采集系统,不知道源码规则也能采集,只要是文章内容站,都可以快速采集优采云
智能文章采集系统,不知道源码规则也能采集,只要是文章内容类网站都能快速采集并自动伪原创中英文,原创度80%以上。自动去噪乱码和文章长度判断,获得干净整洁的文章内容。全球小语种支持,指定网站采集
,非文章源多线程多任务(Multisite)同步...
  多多极速蜘蛛v1.1:
  简介:多多快蜘蛛是多多软件出品的一款专业用于互联网文章和网址高效采集的产品。软件具有网站域名采集、文章智能采集、网站文件检测三大功能。打破了传统软件操作难、速度慢的局限,真正做到了1分钟上手,10分钟精通。使用MongoDB数据库可以真正实现分布式高速存储和提取。主要特点: 分布式极速采集任务分配给多个客户端,具有...
  
  宏业文章采集
器v3.7:
  简介:红叶文章采集器是一款超强的网站文章采集器。它的英文名字是Fast_Spider。它属于蜘蛛爬虫程序。必备文章价值和浏览价值,自动HTM-TXT转换。本软件为绿色软件,解压后即可使用!红叶文章采集器软件特点(1)本软件采用北大天网MD5指纹加权算法,...
  麒麟文章采集工具v1.1:
  介绍:麒麟文章采集软件,采集站内文章,不再需要写采集规则,因为不是每个人都会写,也不是适合所有站点。并且可以收录未收录的文章,一般网站都可以收录。麒麟文章采集软件操作方法:只需输入网址,设置好要采集的文章后缀的URL,即可采集本站文章的所有内容,包括文章标题,文章链接地址文章,文章采集
后...
  优采云
万能文章采集器v3.2.6.1:
  简介:优采云
是优采云
软件出品的一款万能文章采集软件。只需输入关键词就可以采集
各种网页和新闻,也可以采集
指定列表页(栏目页)的文章。注意:微信引擎有严格的限制,请将采集线程数设置为1,否则很容易生成验证码。特点: 1、依托优采云
软件优质的通用文本识别智能算法,可实现对任意网页文本的自动提取,有效率达95%以上。2. 只需键入 关键词 即可...
  WEB基础高性能网络爬虫文章采集
器v6.1:
  简介:基于WEB的高性能网页爬虫文章采集器是一款通用的网页采集爬虫。它可以在不配置模板的情况下采集
世界上任何网站的精华文章。WEB基础高性能网络爬虫文章采集
器是一个网络蜘蛛爬虫程序,用于从指定网站采集
大量精华文章,并将垃圾网页信息直接丢弃,只保存有阅读价值和浏览的精华文章值,并自动执行HTM-TXT转换,并提取标题,正...
  展越高性能网络爬虫文章采集器v6.1:
  简介:赞悦高性能网络爬虫文章采集器是一款通用的网页爬虫。它可以在不配置模板的情况下采集
世界上任何网站的精华文章。本软件全称为赞悦高性能网页爬虫文章采集器,属于网页蜘蛛爬虫程序。用于采集
指定网站的大量精华文章,会直接丢弃其中的垃圾网页信息,只保存有阅读价值和浏览价值的。精华文章,自动HTM-TXT转换,并提取...
  智汇seo软件v1.7:
  简介:智汇seo软件是一款集网站自动更新、长尾关键词自动组合、文章采集
、文章伪原创等功能为一体的多功能网站优化推广软件。本软件需要.net framework 2.0以上的运行环境。功能一:多任务定时自动更新网站(无人值守) 您可以根据需要自由设置采集时间和发布更新文章的时间间隔,尽可能科学自动化地管理您的网站。你...
  甲子博客营销助手v7.1:
  简介:甲子博客营销助手是一款博客推广软件。推广思路: 1、采集
各大网站的热门博文 2、自动添加你设置的链接地址 3、自动发布到各大博客网站 4、自动推广你的博客(漫游、加好友、留言等) 如果有数以百万计的文章在网上流传,有你的链接,不断被转发和搜索……
  猪浏览器(原猪采集器
)v2.2.3.5:
  简介:小猪浏览器(原小猪采集器
)致力于服务草根站长。是站长必备的工具箱和浏览器。小猪浏览器集成了小猪采集
助手、推广助手、搜索助手、投票助手、采集
脚本、文章编辑、采集
夹、图片管理、站长工具等大量功能。注意:小猪浏览器程序一定要放在英文目录下。.....
  站长之星v2.0.3.2:
  简介:站长之星是集文章采集、文章处理、文章发布于一体的专业网站群内容管理系统。界面美观,操作简单,功能强大。站长星拥有完整灵活的执行流程引擎、配置扩展机制和插件系统。你只需要提供一个目标关键词,就可以得到很多相关的关键词(即长尾关键词),然后用这个... &nbsp;
  以上内容是小​​编整理的关于文章采集软件百科的相关攻略内容。如有不妥,请及时与我们联系。想要了解更多文章采集
的最新攻略和资讯,请多多关注全茶网
  关键词:
  文章合集

汇总:算法自动采集列表页微信相关推文,自动过滤各种性质的软文

采集交流优采云 发表了文章 • 0 个评论 • 62 次浏览 • 2022-11-21 11:40 • 来自相关话题

  汇总:算法自动采集列表页微信相关推文,自动过滤各种性质的软文
  算法自动采集列表页微信相关推文,自动过滤各种性质的软文,无需一一手动操作。一键过滤关键词相关、建议的软文内容等常见违规推文即可。
  搜狗。以前用百度搜过的数据库里的那个用了百度的想换一个。自从用了这个,以前用百度搜的根本不用动脑子了,因为搜不到比它更好的。
  
  站长推广:各种网站购买广告位推广,现在广告主都用百度,推广成本高;搜狗推广推广网站;资源互换:或类似于中介的形式,按照成交量收费。
  搜狗啊!百度自从作大了莆田系医院后就死的一干二净。
  谢邀没用过,
  
  不好。因为ios上,只要真正的软文,都不推荐用搜狗搜索,而是点开即收藏。(百度经验这类算是伪软文吧)不过,对于app本身有推荐的,百度搜索肯定比不上ios上的搜狗。不过既然阿里想做手机,我估计ios上搜狗会有比搜狗搜索更好的地方,比如只推送验证码。
  前两天用搜狗搜索了下搜索引擎和资源大战,也就是你说的那些内容,准确率还可以,但是基本还是和谷歌某些验证码识别有差距。另外,我用手机浏览器都有很多伪原创很多未被收录了,搜狗搜索确实很不适应。
  我觉得大家发的就是比较真实的,根据百度搜狗的识别来,我再来几条比较真实的。我没试过。都是从看到的一些内容来的,不一定是百度自己发的。纯属参考:视频:这个视频是百度百科搜出来的,有句话有误解在,选择性收看在。但说实话我真的不喜欢这种感觉,从百度百科看出来的人物,真的没有耐心去阅读前面的那句话:谷歌搜索关键词:13节气注意事项来搜:第一个网站上面讲的非常清楚第二个,你看搜索里的那句话的后面大体也能猜出来点啥原因,这次更是愣是查出来的差不多了。
  可能也就选择性地看第一遍吧(360手机助手很多伪原创我也看了,连文章本身大概的意思都看不出来,也难怪,你不是内容搜索)如果你是换机后想看谷歌搜索里的那句话,也可以尝试一下使用搜狗搜索看看:谷歌搜索识别:248413页谷歌识别:184903页谷歌识别:222664页谷歌识别:264358页谷歌识别:51838页谷歌识别:19658页谷歌识别:23186页谷歌识别:264358页谷歌识别:215456页谷歌识别:20822页谷歌识别:28152页谷歌识别:21192页谷歌识别:187406页谷歌识别:26409页谷歌识别:20688页谷歌识别:22298页谷歌识别:23739页谷歌识别:15792页谷歌识别:139658页谷歌识别:17566页谷歌识别:10401页谷歌识别:136649页谷歌识别。 查看全部

  汇总:算法自动采集列表页微信相关推文,自动过滤各种性质的软文
  算法自动采集列表页微信相关推文,自动过滤各种性质的软文,无需一一手动操作。一键过滤关键词相关、建议的软文内容等常见违规推文即可。
  搜狗。以前用百度搜过的数据库里的那个用了百度的想换一个。自从用了这个,以前用百度搜的根本不用动脑子了,因为搜不到比它更好的。
  
  站长推广:各种网站购买广告位推广,现在广告主都用百度,推广成本高;搜狗推广推广网站;资源互换:或类似于中介的形式,按照成交量收费。
  搜狗啊!百度自从作大了莆田系医院后就死的一干二净。
  谢邀没用过,
  
  不好。因为ios上,只要真正的软文,都不推荐用搜狗搜索,而是点开即收藏。(百度经验这类算是伪软文吧)不过,对于app本身有推荐的,百度搜索肯定比不上ios上的搜狗。不过既然阿里想做手机,我估计ios上搜狗会有比搜狗搜索更好的地方,比如只推送验证码。
  前两天用搜狗搜索了下搜索引擎和资源大战,也就是你说的那些内容,准确率还可以,但是基本还是和谷歌某些验证码识别有差距。另外,我用手机浏览器都有很多伪原创很多未被收录了,搜狗搜索确实很不适应。
  我觉得大家发的就是比较真实的,根据百度搜狗的识别来,我再来几条比较真实的。我没试过。都是从看到的一些内容来的,不一定是百度自己发的。纯属参考:视频:这个视频是百度百科搜出来的,有句话有误解在,选择性收看在。但说实话我真的不喜欢这种感觉,从百度百科看出来的人物,真的没有耐心去阅读前面的那句话:谷歌搜索关键词:13节气注意事项来搜:第一个网站上面讲的非常清楚第二个,你看搜索里的那句话的后面大体也能猜出来点啥原因,这次更是愣是查出来的差不多了。
  可能也就选择性地看第一遍吧(360手机助手很多伪原创我也看了,连文章本身大概的意思都看不出来,也难怪,你不是内容搜索)如果你是换机后想看谷歌搜索里的那句话,也可以尝试一下使用搜狗搜索看看:谷歌搜索识别:248413页谷歌识别:184903页谷歌识别:222664页谷歌识别:264358页谷歌识别:51838页谷歌识别:19658页谷歌识别:23186页谷歌识别:264358页谷歌识别:215456页谷歌识别:20822页谷歌识别:28152页谷歌识别:21192页谷歌识别:187406页谷歌识别:26409页谷歌识别:20688页谷歌识别:22298页谷歌识别:23739页谷歌识别:15792页谷歌识别:139658页谷歌识别:17566页谷歌识别:10401页谷歌识别:136649页谷歌识别。

解决方案:算法自动采集列表信息的模板很多,题主加定位

采集交流优采云 发表了文章 • 0 个评论 • 36 次浏览 • 2022-11-19 07:11 • 来自相关话题

  解决方案:算法自动采集列表信息的模板很多,题主加定位
  算法自动采集列表信息的模板很多,题主加定位,地点和类型。选定一个模板之后可以在网站首页看到推荐的分页列表,点击后可查看详情。这是个rank模式的爬虫,采集目标是你感兴趣的网站列表页。前端每个页面的抓取开销比较大,可以考虑采用分布式、redis等设备保存数据。
  scrapygallery
  去阿里定向搜索某几个列表,然后在某个列表中搜索关键词,
  
  爬虫么。
  用js抓网页源码保存到数据库中。
  我用github-foxmylengger/scrapy-webdriver:webdriver:compiledandbuiltwithreact-nativeforreact。jsprogramming。focusingoncreatingconsole。js,advancingreactwebdevelopmenttoenhanceandadvanceyourwebbrowserserver。
  
  从哪儿抓数据,
  我个人觉得和某一需求有关,如果有需求就去抓、如果没有需求你有空要做的工作那么多,你的兴趣点在哪里就去哪儿抓,如果你有一堆需求并没有那么多兴趣在哪个领域,那么肯定去什么分类找某一个,
  爬虫么?
  先说你的需求,要是这样要计算的话,就得把所有的需求要具体说一下了,比如你要干什么?确定好这个再去看就好了啊,到底一个大数据库要多少内存,多少带宽。而且好多例子要具体说的,比如规模,好多都不太清楚。 查看全部

  解决方案:算法自动采集列表信息的模板很多,题主加定位
  算法自动采集列表信息的模板很多,题主加定位,地点和类型。选定一个模板之后可以在网站首页看到推荐的分页列表,点击后可查看详情。这是个rank模式的爬虫,采集目标是你感兴趣的网站列表页。前端每个页面的抓取开销比较大,可以考虑采用分布式、redis等设备保存数据。
  scrapygallery
  去阿里定向搜索某几个列表,然后在某个列表中搜索关键词
  
  爬虫么。
  用js抓网页源码保存到数据库中。
  我用github-foxmylengger/scrapy-webdriver:webdriver:compiledandbuiltwithreact-nativeforreact。jsprogramming。focusingoncreatingconsole。js,advancingreactwebdevelopmenttoenhanceandadvanceyourwebbrowserserver。
  
  从哪儿抓数据,
  我个人觉得和某一需求有关,如果有需求就去抓、如果没有需求你有空要做的工作那么多,你的兴趣点在哪里就去哪儿抓,如果你有一堆需求并没有那么多兴趣在哪个领域,那么肯定去什么分类找某一个,
  爬虫么?
  先说你的需求,要是这样要计算的话,就得把所有的需求要具体说一下了,比如你要干什么?确定好这个再去看就好了啊,到底一个大数据库要多少内存,多少带宽。而且好多例子要具体说的,比如规模,好多都不太清楚。

解决方案:网络结构自动设计算法——BlockQNN

采集交流优采云 发表了文章 • 0 个评论 • 40 次浏览 • 2022-11-19 06:08 • 来自相关话题

  解决方案:网络结构自动设计算法——BlockQNN
  以下是商汤科技在大规模分布式训练领域发表的一篇重磅口头报告(口头)论文,提出了一种基于分布式训练的深度强化学习BlockQNN算法,用于自动设计神经网络结构。本文由商汤科技实习研究员钟昭在商汤研究院副院长严俊杰、研究经理吴伟指导下撰写。
  神经网络结构设计一直是深度学习的核心问题。在基于深度学习的分类、检测、分割和跟踪任务中,基础神经网络的结构对整体算法的性能具有决定性的影响。传统的神经网络结构设计需要大量的专业知识和试错成本,甚至需要一些灵感和“魔笔”,每年只有少数几个影响更大的新网络结构被设计出来,因此手工设计网络结构是极其困难的。网络结构的自动设计/搜索方法近年来受到广泛关注,它试图将人们从复杂繁琐的网络设计参数中解放出来,以实现自动化深度学习的目标(如图1所示)。
  图 1:(从左到右)。
  从人工设计的网络结构到
  网络结构由算法自动设计
  最近的网络结构自动设计/搜索算法通常需要大量的计算资源(例如,谷歌的 NAS 算法需要数百个 GPU 和近一个月的训练时间),并且由此产生的模型移植性不高,难以实现真正的实际使用。本文提出的BlockQNN算法可以解决现有网络结构自动设计/搜索方法的效率和泛化问题。
  基于“块”的网络结构表示
  目前主流的深度神经网络结构极其复杂,其深度往往达到上百层,直接搜索整个网络结构的搜索空间非常大,这也是以往的自动网络结构设计/搜索算法效率相对低下的原因之一。同时,直接设计整个网络的策略将导致网络结构不被通用化。例如,基于CIFAR数据集搜索的网络结构由于其数据输入的大小限制,仅适用于处理32x32分辨率的数据,这使得搜索网络结构的泛化性能较弱。
  针对这些问题,本文借鉴了现代主流深度神经网络的设计思路,如ResNet、Inception等网络。这些网络由相同结构的子网的重复组合形成,本文称之为块。通过设计块结构,可以大大减少网络结构的搜索空间,并且块结构本身具有很强的泛化性,对于不同的数据集或任务,只需要叠加不同数量的块(如图2所示)。
  图2:
  基于区块设计的网络整体框架
  左边是CIFAR的框架,右边是ImageNet的框架。
  表一:
  网络结构编码表
  为了表示网络块结构,本文设计了一套网络结构编码,将神经网络视为有向无环图,每个节点代表网络中的每一层,边缘代表数据流的方向。整个编码包括神经网络的层序号、类型、内核的大小以及两个序号节点的序号。可以使用这种编码来表示任意神经网络结构,例如 ResNet 和 Inception 的块结构,可以使用图 3 中的编码来表示。
  图3:
  Inception 和 Resnet 中的块结构编码表示
  基于强化学习的网络结构自动设计
  下一个核心问题是如何获得最优的网络结构。尽管通过设计大大减少了网络结构的搜索空间,但对所有可能结构的直接暴力搜索仍然是计算密集型的。因此,该文提出一种基于强化学习的网络设计方法,该方法可以自动学习网络结构。在网络设计中的强化学习中,本文将当前神经网络层定义为强化学习中的
  
  当前状态,将下一层结构的决策定义为强化学习中的动作。此处使用先前定义的神经网络结构编码来表示网络的每一层。这样,通过一系列动作决策,可以获得代表块结构的代码(如图4所示),所提出的强化学习算法通过优化找到最优的动作决策序列。本文采用Q学习算法进行学习,具体公式不展开。
  图4:
  基于强化学习的自动化网络结构设计流程
  值得注意的是,与一般的强化学习问题不同,这个任务只有在决定结束整个序列后(即生成完整的网络结构之后)才会得到奖励,之前的每一个决策对应奖励。由于获得最终奖励的成本非常高(需要在数据上重新训练新获得的网络结构),为了加快其收敛速度,笔者采用了奖励 SHAPING 技术(如图 5 所示),这样初始训练阶段终止层的 Q 值不会太高, 这样算法就不会在训练的初始阶段生成层太浅的网络结构。
  图5:
  奖励整形对收敛效率的影响
  尽早停止策略
  尽管可以使用多种技术来使自动化网络结构设计更加高效。然而,自动网络设计耗时的关键在于每个奖励的时间成本非常高,生成的网络结构需要在相应的数据集上进行训练以收敛,然后获得相应的精度来表示结构的质量并用作奖励。本文作者发现,通过调整学习率,只有正常训练过程的三分之一(例如,在CIFAR-100数据集上训练12个epoch)可以获得网络的近似最终精度,可以大大降低时间成本。然而,这种网络结构及其相关奖励的准确性会产生误差,导致无法精细区分网络结构的优缺点,本文提出了一个经验解公式:
  也就是说,真正的奖励与
  提前停止,但它与网络结构的计算复杂度和结构连接的复杂度(边数除以块中的点数)成反比。通过这样的公式修正,得到的奖励对网络结构的质量更明显(如图6所示)。
  图6:
  提前止损的精度与网络的真实精度相同计算复杂度
  和连接复杂度之间的关系
  实验结果
  本文使用了 32 个 GPU,经过 3 天的搜索,可以在 CIFAR 数据集上找到具有最先进性能的网络结构(如图 7 所示)。
  图七:
  学习的搜索过程和最佳网络结构
  与以往的自动网页搜索方法(如Google NAS算法的数百个GPU和一个月的时间)相比,BlockQNN算法非常高效(如表2和表3所示)。
  
  表二:
  不同的自动网络结构设计算法
  计算资源比较
  表三:
  CIFAR数据集上不同网络结构的错误率
  另一方面,学习到的网络结构也可以很容易地准确地转移到ImageNet任务中(如表4所示)。
  表四:
  图像网数据集上不同网络结构的错误率
  为了验证BlockQNN算法是否
  真正学会了网络的设计方法,将其与同一搜索空间中的暴力搜索进行比较,可以发现本文提出的BlockQNN算法可以获得比暴力搜索更好的模型(如图8所示)。
  图八:
  强化学习和暴力搜索获取网络结构
  CIFAR数据集的准确性通过
  分析整个搜索过程和结果网络结构(如图9所示),作者发现通过学习获得的优秀结构具有一些共性。比如多分支结构、捷径连接法等,这些都是现在常用的设计思路。同时,作者还发现了一些不太常见的结构共性,如卷积层之间的频繁加法运算,学习到的网络结构需要进一步分析和研究。
  图九:
  由 BlockQNN 算法设计的网络结构示例
  结论
  该文提出一种基于强化学习的高效网络结构自动设计算法BlockQNN,通过“Block”的设计思路,大大减少了网络结构搜索空间,使学习网络具有较强的可移植性。同时,本文采用“早停”和分布式架构来加速整个学习过程,达到了之前 Google NAS 算法的百倍速度(仅 32 个 GPU 和 3 天的训练)。实验表明,学习到的网络结构在CIFAR数据集上可以达到人类设计网络结构的精度,其结构可以迁移到大规模ImageNet数据集上,也可以取得良好的性能。笔者希望继续朝着自动化深度学习的目标发展算法,最终将人们从复杂繁琐的网络设计和参数调优中解放出来,进一步实现深度学习的“智能化”。
  解决方案:云优CMS快速入门
  # API 管理 API 管理功能包括百度普通收录、百度快速收录、百度
  
  统计查询、百度
  
  切字接口,同义词API,多站点控制平台对接## 百度普通收录需要在百度搜索资源平台注册账号并绑定推送链接,填写下图所示的接口调用地址![ 1.jpg]()## 百度快收录 百度快收录主要是针对优质网站的快收录工具,如果你暂时没有这个功能权限,建议尽量更新优质文章获取权限 ### 无权限 下图是未经许可的界面![ 图片.png]()### 许可 下图是许可接口![图片.png] ()## 百度统计查询![4.png]()进入百度统计,点击管理-左侧的统计图标进行设置,复制链接填写下图![5.png]()## 百度切词界面教程:[]()## 同义词API 设置同义词前,需要设置百度切词界面,模式建议准确+50%## 多站点控制平台对接 购买增值服务请开启一键登录,百度自动推送、接受平台推送、排名监控获得四大功能 查看全部

  解决方案:网络结构自动设计算法——BlockQNN
  以下是商汤科技在大规模分布式训练领域发表的一篇重磅口头报告(口头)论文,提出了一种基于分布式训练的深度强化学习BlockQNN算法,用于自动设计神经网络结构。本文由商汤科技实习研究员钟昭在商汤研究院副院长严俊杰、研究经理吴伟指导下撰写。
  神经网络结构设计一直是深度学习的核心问题。在基于深度学习的分类、检测、分割和跟踪任务中,基础神经网络的结构对整体算法的性能具有决定性的影响。传统的神经网络结构设计需要大量的专业知识和试错成本,甚至需要一些灵感和“魔笔”,每年只有少数几个影响更大的新网络结构被设计出来,因此手工设计网络结构是极其困难的。网络结构的自动设计/搜索方法近年来受到广泛关注,它试图将人们从复杂繁琐的网络设计参数中解放出来,以实现自动化深度学习的目标(如图1所示)。
  图 1:(从左到右)。
  从人工设计的网络结构到
  网络结构由算法自动设计
  最近的网络结构自动设计/搜索算法通常需要大量的计算资源(例如,谷歌的 NAS 算法需要数百个 GPU 和近一个月的训练时间),并且由此产生的模型移植性不高,难以实现真正的实际使用。本文提出的BlockQNN算法可以解决现有网络结构自动设计/搜索方法的效率和泛化问题。
  基于“块”的网络结构表示
  目前主流的深度神经网络结构极其复杂,其深度往往达到上百层,直接搜索整个网络结构的搜索空间非常大,这也是以往的自动网络结构设计/搜索算法效率相对低下的原因之一。同时,直接设计整个网络的策略将导致网络结构不被通用化。例如,基于CIFAR数据集搜索的网络结构由于其数据输入的大小限制,仅适用于处理32x32分辨率的数据,这使得搜索网络结构的泛化性能较弱。
  针对这些问题,本文借鉴了现代主流深度神经网络的设计思路,如ResNet、Inception等网络。这些网络由相同结构的子网的重复组合形成,本文称之为块。通过设计块结构,可以大大减少网络结构的搜索空间,并且块结构本身具有很强的泛化性,对于不同的数据集或任务,只需要叠加不同数量的块(如图2所示)。
  图2:
  基于区块设计的网络整体框架
  左边是CIFAR的框架,右边是ImageNet的框架。
  表一:
  网络结构编码表
  为了表示网络块结构,本文设计了一套网络结构编码,将神经网络视为有向无环图,每个节点代表网络中的每一层,边缘代表数据流的方向。整个编码包括神经网络的层序号、类型、内核的大小以及两个序号节点的序号。可以使用这种编码来表示任意神经网络结构,例如 ResNet 和 Inception 的块结构,可以使用图 3 中的编码来表示。
  图3:
  Inception 和 Resnet 中的块结构编码表示
  基于强化学习的网络结构自动设计
  下一个核心问题是如何获得最优的网络结构。尽管通过设计大大减少了网络结构的搜索空间,但对所有可能结构的直接暴力搜索仍然是计算密集型的。因此,该文提出一种基于强化学习的网络设计方法,该方法可以自动学习网络结构。在网络设计中的强化学习中,本文将当前神经网络层定义为强化学习中的
  
  当前状态,将下一层结构的决策定义为强化学习中的动作。此处使用先前定义的神经网络结构编码来表示网络的每一层。这样,通过一系列动作决策,可以获得代表块结构的代码(如图4所示),所提出的强化学习算法通过优化找到最优的动作决策序列。本文采用Q学习算法进行学习,具体公式不展开。
  图4:
  基于强化学习的自动化网络结构设计流程
  值得注意的是,与一般的强化学习问题不同,这个任务只有在决定结束整个序列后(即生成完整的网络结构之后)才会得到奖励,之前的每一个决策对应奖励。由于获得最终奖励的成本非常高(需要在数据上重新训练新获得的网络结构),为了加快其收敛速度,笔者采用了奖励 SHAPING 技术(如图 5 所示),这样初始训练阶段终止层的 Q 值不会太高, 这样算法就不会在训练的初始阶段生成层太浅的网络结构。
  图5:
  奖励整形对收敛效率的影响
  尽早停止策略
  尽管可以使用多种技术来使自动化网络结构设计更加高效。然而,自动网络设计耗时的关键在于每个奖励的时间成本非常高,生成的网络结构需要在相应的数据集上进行训练以收敛,然后获得相应的精度来表示结构的质量并用作奖励。本文作者发现,通过调整学习率,只有正常训练过程的三分之一(例如,在CIFAR-100数据集上训练12个epoch)可以获得网络的近似最终精度,可以大大降低时间成本。然而,这种网络结构及其相关奖励的准确性会产生误差,导致无法精细区分网络结构的优缺点,本文提出了一个经验解公式:
  也就是说,真正的奖励与
  提前停止,但它与网络结构的计算复杂度和结构连接的复杂度(边数除以块中的点数)成反比。通过这样的公式修正,得到的奖励对网络结构的质量更明显(如图6所示)。
  图6:
  提前止损的精度与网络的真实精度相同计算复杂度
  和连接复杂度之间的关系
  实验结果
  本文使用了 32 个 GPU,经过 3 天的搜索,可以在 CIFAR 数据集上找到具有最先进性能的网络结构(如图 7 所示)。
  图七:
  学习的搜索过程和最佳网络结构
  与以往的自动网页搜索方法(如Google NAS算法的数百个GPU和一个月的时间)相比,BlockQNN算法非常高效(如表2和表3所示)。
  
  表二:
  不同的自动网络结构设计算法
  计算资源比较
  表三:
  CIFAR数据集上不同网络结构的错误率
  另一方面,学习到的网络结构也可以很容易地准确地转移到ImageNet任务中(如表4所示)。
  表四:
  图像网数据集上不同网络结构的错误率
  为了验证BlockQNN算法是否
  真正学会了网络的设计方法,将其与同一搜索空间中的暴力搜索进行比较,可以发现本文提出的BlockQNN算法可以获得比暴力搜索更好的模型(如图8所示)。
  图八:
  强化学习和暴力搜索获取网络结构
  CIFAR数据集的准确性通过
  分析整个搜索过程和结果网络结构(如图9所示),作者发现通过学习获得的优秀结构具有一些共性。比如多分支结构、捷径连接法等,这些都是现在常用的设计思路。同时,作者还发现了一些不太常见的结构共性,如卷积层之间的频繁加法运算,学习到的网络结构需要进一步分析和研究。
  图九:
  由 BlockQNN 算法设计的网络结构示例
  结论
  该文提出一种基于强化学习的高效网络结构自动设计算法BlockQNN,通过“Block”的设计思路,大大减少了网络结构搜索空间,使学习网络具有较强的可移植性。同时,本文采用“早停”和分布式架构来加速整个学习过程,达到了之前 Google NAS 算法的百倍速度(仅 32 个 GPU 和 3 天的训练)。实验表明,学习到的网络结构在CIFAR数据集上可以达到人类设计网络结构的精度,其结构可以迁移到大规模ImageNet数据集上,也可以取得良好的性能。笔者希望继续朝着自动化深度学习的目标发展算法,最终将人们从复杂繁琐的网络设计和参数调优中解放出来,进一步实现深度学习的“智能化”。
  解决方案:云优CMS快速入门
  # API 管理 API 管理功能包括百度普通收录、百度快速收录、百度
  
  统计查询、百度
  
  切字接口,同义词API,多站点控制平台对接## 百度普通收录需要在百度搜索资源平台注册账号并绑定推送链接,填写下图所示的接口调用地址![ 1.jpg]()## 百度快收录 百度快收录主要是针对优质网站的快收录工具,如果你暂时没有这个功能权限,建议尽量更新优质文章获取权限 ### 无权限 下图是未经许可的界面![ 图片.png]()### 许可 下图是许可接口![图片.png] ()## 百度统计查询![4.png]()进入百度统计,点击管理-左侧的统计图标进行设置,复制链接填写下图![5.png]()## 百度切词界面教程:[]()## 同义词API 设置同义词前,需要设置百度切词界面,模式建议准确+50%## 多站点控制平台对接 购买增值服务请开启一键登录,百度自动推送、接受平台推送、排名监控获得四大功能

汇总:算法自动采集列表栏和搜索框点击事件的判断搜索匹配策略

采集交流优采云 发表了文章 • 0 个评论 • 56 次浏览 • 2022-11-18 12:26 • 来自相关话题

  汇总:算法自动采集列表栏和搜索框点击事件的判断搜索匹配策略
  算法自动采集列表栏和搜索框点击事件的判断搜索匹配策略框点击事件的定义
  实现有很多种思路,需要根据实际需求去选择,还有一些很麻烦的技术,比如利用静态变量上的直接取值更新style等。另外建议你学学模板,
  伪代码可以用html5或者javascript语言,一个基本的tag-form表单提交接口处理,之后自己做个防止点击事件的缓存机制,比如设置浏览器缓存时间或者有个数字,
  
  考研er应该学过堆栈吧,想要实现很简单,思路非常清晰,就不多说了。就是在css里面隐藏掉验证码。大致意思就是先生成验证码,然后再隐藏,反正验证码是加密过的。可以试试看。
  明显你不是很熟悉html5和javascript
  先学点javascript再说
  
  用php实现cookie自动登录的功能
  php,看了一眼源码,
  我也不知道你是来找鼓励,还是怎么样。首先就是在页面上留一个self_uri,告诉浏览器如何点击。其次按照类型实现,字符串实现很简单。再次就是实现加密认证校验,这个麻烦一点。再就是触发。这个特别让人头疼。推荐用websocket实现一下吧。
  javascript+css,你需要会jqueryhtml5等技术,如果你是有服务器的话就直接放到服务器上,不然有成本不划算。 查看全部

  汇总:算法自动采集列表栏和搜索框点击事件的判断搜索匹配策略
  算法自动采集列表栏和搜索框点击事件的判断搜索匹配策略框点击事件的定义
  实现有很多种思路,需要根据实际需求去选择,还有一些很麻烦的技术,比如利用静态变量上的直接取值更新style等。另外建议你学学模板,
  伪代码可以用html5或者javascript语言,一个基本的tag-form表单提交接口处理,之后自己做个防止点击事件的缓存机制,比如设置浏览器缓存时间或者有个数字,
  
  考研er应该学过堆栈吧,想要实现很简单,思路非常清晰,就不多说了。就是在css里面隐藏掉验证码。大致意思就是先生成验证码,然后再隐藏,反正验证码是加密过的。可以试试看。
  明显你不是很熟悉html5和javascript
  先学点javascript再说
  
  用php实现cookie自动登录的功能
  php,看了一眼源码,
  我也不知道你是来找鼓励,还是怎么样。首先就是在页面上留一个self_uri,告诉浏览器如何点击。其次按照类型实现,字符串实现很简单。再次就是实现加密认证校验,这个麻烦一点。再就是触发。这个特别让人头疼。推荐用websocket实现一下吧。
  javascript+css,你需要会jqueryhtml5等技术,如果你是有服务器的话就直接放到服务器上,不然有成本不划算。

核心方法:机器学习实战之KNN算法

采集交流优采云 发表了文章 • 0 个评论 • 43 次浏览 • 2022-11-18 09:15 • 来自相关话题

  核心方法:机器学习实战之KNN算法
  本系列教程是《实用机器学习》的阅读笔记。首先说一下写这个系列教程的原因:首先,《机器学习实战》的代码是用Python2写的,有些代码在Python3上运行会报错。本教程基于Python3修改代码;second: 看了一些机器学习的书没有记录下来,很快就忘记了。写教程也是一个复习的过程;第三,机器学习比爬虫和数据分析更难学。希望通过这一系列的教程,让读者在学习机器学习的道路上少走弯路。
  本系列教程特色:哪些读者可以吃饱:k近邻算法(KNN)原理
  KNN算法是一种分类算法。古语这样描述KNN算法:“近朱者红,近墨者黑”。
  算法原理:计算测试样本与每个训练样本的距离(距离计算方法见下文),取距离最小的前k个训练样本,最后选取这k个样本中出现次数最多的类别作为类别的测试样本。
  如图,绿色的就是测试样例。当k为3时,样本属于红色类;当k为5时,属于蓝色类。因此,k值的选择极大地影响了算法的结果,通常k值不大于20。
  KNN算法原理
  介绍完原理,再看看KNN算法的伪代码流程:
  计算测试样本与所有训练样本的距离
对距离进行升序排序,取前k个
计算k个样本中最多的分类
  KNN的约会对象分类问题描述及数据情况
  Helen 使用 Dating网站 查找约会对象。随着时间的推移,她发现自己约会过三种类型的人:
  这里 Helen 采集了 1000 行具有三个特征的数据:每年赚取的飞行常客里程数;玩视频游戏的时间百分比;每周消耗的冰淇淋升数。以及对象的类型标签,如图所示。
  数据情况
  分析数据
  import numpy as np
import operator
def file2matrix(filename):
fr = open(filename)
arrayOLines = fr.readlines()
numberOflines = len(arrayOLines)
returnMat = np.zeros((numberOflines, 3))
classLabelVector = []
index = 0
for line in arrayOLines:
line = line.strip()
listFromLine = line.split('\t')
returnMat[index, :] = listFromLine[0:3]
classLabelVector.append(int(listFromLine[-1]))
index = index + 1
return returnMat, classLabelVector
  定义解析数据的函数: 第4-9行:读取文件,获取文件行数,创建一个以文件行数(1000行)3列全0的Numpy数组,创建用于存储类标签的 classLabelVector 列表。
  第 10-17 行:循环遍历文件,将前三列数据存储在 returnMat 数组中,并将最后一列存储在 classLabelVector 列表中。结果如图所示。
  分析数据
  上面的代码是书上写的。其实用pandas读取数据然后出来是很方便的。代码如下:
  import numpy as np
<p>
import operator
import pandas as pd
def file2matrix(filename):
data = pd.read_table(open(filename), sep='\t', header=None)
returnMat = data[[0,1,2]].values
classLabelVector = data[3].values
return returnMat, classLabelVector
</p>
  归一化
  由于特征的取值差异较大,在计算距离时,取值较大的属性对结果的影响较大。这里,数据需要归一化:new = (old-min)/(max-min)。代码如下:
  def autoNorm(dataSet):
minval = dataSet.min(0)
maxval = dataSet.max(0)
ranges = maxval - minval
normDataSet = np.zeros(np.shape(dataSet))
m = dataSet.shape[0]
normDataSet = dataSet - np.tile(minval, (m,1))
normDataSet = normDataSet/np.tile(ranges, (m,1))
return normDataSet, ranges, minval
  传入的参数为测试数据(即returnMat);先按0轴(即按列)计算min和max,如图所示进行简单示例;然后构造一个与数据(normDataSet)大小相同的0矩阵;
  瓦片功能的使用方法请读者自行百度。下面是使用后的案例。作用是让一维数组重复m行,如图所示,这样就可以进行数据归一化的计算。
  例子
  例子
  结果
  KNN算法
  这里使用的距离是欧氏距离,公式为:
  欧氏距离
  def classify(inX, dataSet, labels, k):
dataSize = dataSet.shape[0]
diffMat = np.tile(inX, (dataSize,1)) -dataSet
sqdiffMat = diffMat ** 2
sqDistance = sqdiffMat.sum(axis = 1)
distances = sqDistance ** 0.5
sortedDist = distances.argsort()
classCount ={}
for i in range(k):
voteIlable = labels[sortedDist[i]]
<p>
classCount[voteIlable] = classCount.get(voteIlable, 0) + 1
sortedClassCount = sorted(classCount.items(),
key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]
</p>
  inX 是训练数据;dataSet为测试数据,labels为类别标签;k 是值;
  第 2-6 行:计算欧式距离
  7-Finally:对计算出的距离进行索引排序(argsort),然后对字典进行排序,得到值最多的分类。
  测试分类器
  这里选取前10%的数据作为测试样本来测试分类器。
  def test():
r = 0.1
X, y = file2matrix('数据/datingTestSet2.txt')
new_X, ranges, minval = autoNorm(X)
m = new_X.shape[0]
numTestVecs = int(m*r)
error = 0.0
for i in range(numTestVecs):
result = classify(new_X[i, :],new_X[numTestVecs:m, :], y[numTestVecs:m], 3)
print('分类结果: %d, 真实数据: %d' %(result, y[i]))
if (result != y[i]):
error = error + 1.0
print('错误率: %f' % (error/float(numTestVecs)))
  结果
  测试系统
  最后写一个简单的测试系统,代码可以通过人为输入三个属性特征自动得到交友对象的分类标签。
  def system():
style = ['不喜欢', '一般', '喜欢']
ffmile = float(input('飞行里程'))
game = float(input('游戏'))
ice = float(input('冰淇淋'))
X, y = file2matrix('数据/datingTestSet2.txt')
new_X, ranges, minval = autoNorm(X)
inArr = np.array([ffmile, game, ice])
result = classify((inArr - minval)/ranges, new_X, y, 3)
print('这个人', style[result - 1])
  结果
  算法优缺点写在最后
  乍一看,读者可能会觉得不舒服,多敲几下代码就可以了。欢迎大家点赞评论,也可以微博和我互动(我是罗罗盘)。
  干货教程:首页 > seo教程>> seo优化培训教程之伪原创技巧方法
  
  1、要改写的文章必须收录你要优化的关键词。不要完全模仿原文的标题,这样搜索引擎会重点将其与原文进行比较,这样你的文章风险系数就非常高了。当然,如果能在标题中加入营销元素就完美了,这样更容易吸引客户点击。2、现在不要以为一个文章的段落随便打乱就可以了。现在的搜索引擎很聪明,所以这里我建议最好把同一个话题的多个文章拼凑起来。拥有 文章。在这个过程中,一定要用自己的语言进行过渡,让文章读起来流畅自然,同时删除原文中多余或不相关的内容。3.注意关键词的密度和布局控制。这里笔者多年的经验建议,最好着重写开头和结尾,最好在开头和结尾收录要优化的关键词。4.在文本中的某些节点添加自己的内容,比如添加自己的网站相关的文章标题,然后用锚文本指向他们,添加自己的网站名字, each在段后加一些额外的句子等 seo伪原创的内容怎么写 1.为了避免原文作者起诉你侵犯版权,建议你在文末加上相关参考文章,因为无论您如何伪原创,中心思想是不能变的。2、对于一些文章,比如一些技术性的文章,确实很难改。这时候可以在文章中插入自己的理解和观点,并注明自己的索引来源,这也算伪原创,但不算抄袭,搜索引擎是也比较放松警惕!!3、伪原创,思路的出发点是让搜索引擎认为我们的文章属于原创,所以首先要保证你的网站 和原来的网站的主题、结构甚至思想都有很大的不同,比如一个文章 可以在文章中插入自己的理解和观点,并注明自己的索引来源,这也算伪原创,但不算抄袭,搜索引擎也比较放松警惕!!3、伪原创,思路的出发点是让搜索引擎认为我们的文章属于原创,所以首先要保证你的网站 和原来的网站的主题、结构甚至思想都有很大的不同,比如一个文章 可以在文章中插入自己的理解和观点,并注明自己的索引来源,这也算伪原创,但不算抄袭,搜索引擎也比较放松警惕!!3、伪原创,思路的出发点是让搜索引擎认为我们的文章属于原创,所以首先要保证你的网站 和原来的网站的主题、结构甚至思想都有很大的不同,比如一个文章
   查看全部

  核心方法:机器学习实战之KNN算法
  本系列教程是《实用机器学习》的阅读笔记。首先说一下写这个系列教程的原因:首先,《机器学习实战》的代码是用Python2写的,有些代码在Python3上运行会报错。本教程基于Python3修改代码;second: 看了一些机器学习的书没有记录下来,很快就忘记了。写教程也是一个复习的过程;第三,机器学习比爬虫和数据分析更难学。希望通过这一系列的教程,让读者在学习机器学习的道路上少走弯路。
  本系列教程特色:哪些读者可以吃饱:k近邻算法(KNN)原理
  KNN算法是一种分类算法。古语这样描述KNN算法:“近朱者红,近墨者黑”。
  算法原理:计算测试样本与每个训练样本的距离(距离计算方法见下文),取距离最小的前k个训练样本,最后选取这k个样本中出现次数最多的类别作为类别的测试样本。
  如图,绿色的就是测试样例。当k为3时,样本属于红色类;当k为5时,属于蓝色类。因此,k值的选择极大地影响了算法的结果,通常k值不大于20。
  KNN算法原理
  介绍完原理,再看看KNN算法的伪代码流程:
  计算测试样本与所有训练样本的距离
对距离进行升序排序,取前k个
计算k个样本中最多的分类
  KNN的约会对象分类问题描述及数据情况
  Helen 使用 Dating网站 查找约会对象。随着时间的推移,她发现自己约会过三种类型的人:
  这里 Helen 采集了 1000 行具有三个特征的数据:每年赚取的飞行常客里程数;玩视频游戏的时间百分比;每周消耗的冰淇淋升数。以及对象的类型标签,如图所示。
  数据情况
  分析数据
  import numpy as np
import operator
def file2matrix(filename):
fr = open(filename)
arrayOLines = fr.readlines()
numberOflines = len(arrayOLines)
returnMat = np.zeros((numberOflines, 3))
classLabelVector = []
index = 0
for line in arrayOLines:
line = line.strip()
listFromLine = line.split('\t')
returnMat[index, :] = listFromLine[0:3]
classLabelVector.append(int(listFromLine[-1]))
index = index + 1
return returnMat, classLabelVector
  定义解析数据的函数: 第4-9行:读取文件,获取文件行数,创建一个以文件行数(1000行)3列全0的Numpy数组,创建用于存储类标签的 classLabelVector 列表。
  第 10-17 行:循环遍历文件,将前三列数据存储在 returnMat 数组中,并将最后一列存储在 classLabelVector 列表中。结果如图所示。
  分析数据
  上面的代码是书上写的。其实用pandas读取数据然后出来是很方便的。代码如下:
  import numpy as np
<p>
import operator
import pandas as pd
def file2matrix(filename):
data = pd.read_table(open(filename), sep='\t', header=None)
returnMat = data[[0,1,2]].values
classLabelVector = data[3].values
return returnMat, classLabelVector
</p>
  归一化
  由于特征的取值差异较大,在计算距离时,取值较大的属性对结果的影响较大。这里,数据需要归一化:new = (old-min)/(max-min)。代码如下:
  def autoNorm(dataSet):
minval = dataSet.min(0)
maxval = dataSet.max(0)
ranges = maxval - minval
normDataSet = np.zeros(np.shape(dataSet))
m = dataSet.shape[0]
normDataSet = dataSet - np.tile(minval, (m,1))
normDataSet = normDataSet/np.tile(ranges, (m,1))
return normDataSet, ranges, minval
  传入的参数为测试数据(即returnMat);先按0轴(即按列)计算min和max,如图所示进行简单示例;然后构造一个与数据(normDataSet)大小相同的0矩阵;
  瓦片功能的使用方法请读者自行百度。下面是使用后的案例。作用是让一维数组重复m行,如图所示,这样就可以进行数据归一化的计算。
  例子
  例子
  结果
  KNN算法
  这里使用的距离是欧氏距离,公式为:
  欧氏距离
  def classify(inX, dataSet, labels, k):
dataSize = dataSet.shape[0]
diffMat = np.tile(inX, (dataSize,1)) -dataSet
sqdiffMat = diffMat ** 2
sqDistance = sqdiffMat.sum(axis = 1)
distances = sqDistance ** 0.5
sortedDist = distances.argsort()
classCount ={}
for i in range(k):
voteIlable = labels[sortedDist[i]]
<p>
classCount[voteIlable] = classCount.get(voteIlable, 0) + 1
sortedClassCount = sorted(classCount.items(),
key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]
</p>
  inX 是训练数据;dataSet为测试数据,labels为类别标签;k 是值;
  第 2-6 行:计算欧式距离
  7-Finally:对计算出的距离进行索引排序(argsort),然后对字典进行排序,得到值最多的分类。
  测试分类器
  这里选取前10%的数据作为测试样本来测试分类器。
  def test():
r = 0.1
X, y = file2matrix('数据/datingTestSet2.txt')
new_X, ranges, minval = autoNorm(X)
m = new_X.shape[0]
numTestVecs = int(m*r)
error = 0.0
for i in range(numTestVecs):
result = classify(new_X[i, :],new_X[numTestVecs:m, :], y[numTestVecs:m], 3)
print('分类结果: %d, 真实数据: %d' %(result, y[i]))
if (result != y[i]):
error = error + 1.0
print('错误率: %f' % (error/float(numTestVecs)))
  结果
  测试系统
  最后写一个简单的测试系统,代码可以通过人为输入三个属性特征自动得到交友对象的分类标签。
  def system():
style = ['不喜欢', '一般', '喜欢']
ffmile = float(input('飞行里程'))
game = float(input('游戏'))
ice = float(input('冰淇淋'))
X, y = file2matrix('数据/datingTestSet2.txt')
new_X, ranges, minval = autoNorm(X)
inArr = np.array([ffmile, game, ice])
result = classify((inArr - minval)/ranges, new_X, y, 3)
print('这个人', style[result - 1])
  结果
  算法优缺点写在最后
  乍一看,读者可能会觉得不舒服,多敲几下代码就可以了。欢迎大家点赞评论,也可以微博和我互动(我是罗罗盘)。
  干货教程:首页 > seo教程>> seo优化培训教程之伪原创技巧方法
  
  1、要改写的文章必须收录你要优化的关键词。不要完全模仿原文的标题,这样搜索引擎会重点将其与原文进行比较,这样你的文章风险系数就非常高了。当然,如果能在标题中加入营销元素就完美了,这样更容易吸引客户点击。2、现在不要以为一个文章的段落随便打乱就可以了。现在的搜索引擎很聪明,所以这里我建议最好把同一个话题的多个文章拼凑起来。拥有 文章。在这个过程中,一定要用自己的语言进行过渡,让文章读起来流畅自然,同时删除原文中多余或不相关的内容。3.注意关键词的密度和布局控制。这里笔者多年的经验建议,最好着重写开头和结尾,最好在开头和结尾收录要优化的关键词。4.在文本中的某些节点添加自己的内容,比如添加自己的网站相关的文章标题,然后用锚文本指向他们,添加自己的网站名字, each在段后加一些额外的句子等 seo伪原创的内容怎么写 1.为了避免原文作者起诉你侵犯版权,建议你在文末加上相关参考文章,因为无论您如何伪原创,中心思想是不能变的。2、对于一些文章,比如一些技术性的文章,确实很难改。这时候可以在文章中插入自己的理解和观点,并注明自己的索引来源,这也算伪原创,但不算抄袭,搜索引擎是也比较放松警惕!!3、伪原创,思路的出发点是让搜索引擎认为我们的文章属于原创,所以首先要保证你的网站 和原来的网站的主题、结构甚至思想都有很大的不同,比如一个文章 可以在文章中插入自己的理解和观点,并注明自己的索引来源,这也算伪原创,但不算抄袭,搜索引擎也比较放松警惕!!3、伪原创,思路的出发点是让搜索引擎认为我们的文章属于原创,所以首先要保证你的网站 和原来的网站的主题、结构甚至思想都有很大的不同,比如一个文章 可以在文章中插入自己的理解和观点,并注明自己的索引来源,这也算伪原创,但不算抄袭,搜索引擎也比较放松警惕!!3、伪原创,思路的出发点是让搜索引擎认为我们的文章属于原创,所以首先要保证你的网站 和原来的网站的主题、结构甚至思想都有很大的不同,比如一个文章
  

最新版:算法自动采集列表页列表列表二维码不用自己上传图片

采集交流优采云 发表了文章 • 0 个评论 • 67 次浏览 • 2022-11-17 05:14 • 来自相关话题

  最新版:算法自动采集列表页列表列表二维码不用自己上传图片
  算法自动采集列表页面。一键采集页面列表列表页列表列表二维码不用自己制作。不用自己上传图片。不用自己制作js页面不用爬虫抓取全部第三方文章和文章评论等内容还有第三方的技术维护、第三方的技术服务。优势太多,就不说了。大概就是你只要在做的哪一天突然觉得想要做了,然后依葫芦画瓢,总能搞定。弊端就是经过第三方爬虫抓取的内容基本上都很垃圾。
  
  做这个的成本很高,三方做太容易了。原因很简单,三方爬虫爬取内容的效率高,无论数据新不新,无论是不是总人数的n倍增长,采集效率都很高。而且采集自己,就像我说的,一键采集。每抓取一个页面,爬虫都要换人,更换人也是一个成本,每抓取一个页面,爬虫都要换人,成本更高。一般的架构,像excelexcelexcel就行了。
  
  重点是,爬虫抓取页面列表,还要从列表页面爬取最新内容,这个一般要自己写。因为列表页面是新的。不要的不抓,那你要抓取的是总页面数的n倍的数据。举个例子,当年写爬虫爬取来的淘宝的数据1月9号的时候,收费10元,解释权归淘宝,需要的可以联系我。
  1.目前大部分的新闻网站都是无法支持个性化抓取的(至少我没找到方案),更别说各种二手交易平台了。我所知道的的国内能同时支持个性化爬取(也叫定制化抓取)的暂时还没有,特定的信息网站似乎都只支持抓取文章的标题,同时需要爬取的内容必须也必须带有文章标题,这个要看具体情况而定。2.刚才刚刚去了一趟报刊亭,其中的“数字报刊”分为机械制图报刊与电子版报刊,根据我个人的经验,电子版报刊的机器学习技术都应该是烂熟于胸了吧,放在那里看也没什么用,就算别人能够爬取的数据被你拿去做数据分析,那你这信息又干嘛去了?你说某个高校在那里的排名,那你可以通过排名来爬取学校的信息啊,你说什么时候毕业的,那你拿着学校的文件来,一搜就行,反正只要不是搜索top2这种大学就够了,拿来分析专业评级差异也是够的。这种分析对于新闻信息来说是没什么用的,所以此类大学排名可以忽略。 查看全部

  最新版:算法自动采集列表页列表列表二维码不用自己上传图片
  算法自动采集列表页面。一键采集页面列表列表页列表列表二维码不用自己制作。不用自己上传图片。不用自己制作js页面不用爬虫抓取全部第三方文章和文章评论等内容还有第三方的技术维护、第三方的技术服务。优势太多,就不说了。大概就是你只要在做的哪一天突然觉得想要做了,然后依葫芦画瓢,总能搞定。弊端就是经过第三方爬虫抓取的内容基本上都很垃圾。
  
  做这个的成本很高,三方做太容易了。原因很简单,三方爬虫爬取内容的效率高,无论数据新不新,无论是不是总人数的n倍增长,采集效率都很高。而且采集自己,就像我说的,一键采集。每抓取一个页面,爬虫都要换人,更换人也是一个成本,每抓取一个页面,爬虫都要换人,成本更高。一般的架构,像excelexcelexcel就行了。
  
  重点是,爬虫抓取页面列表,还要从列表页面爬取最新内容,这个一般要自己写。因为列表页面是新的。不要的不抓,那你要抓取的是总页面数的n倍的数据。举个例子,当年写爬虫爬取来的淘宝的数据1月9号的时候,收费10元,解释权归淘宝,需要的可以联系我。
  1.目前大部分的新闻网站都是无法支持个性化抓取的(至少我没找到方案),更别说各种二手交易平台了。我所知道的的国内能同时支持个性化爬取(也叫定制化抓取)的暂时还没有,特定的信息网站似乎都只支持抓取文章的标题,同时需要爬取的内容必须也必须带有文章标题,这个要看具体情况而定。2.刚才刚刚去了一趟报刊亭,其中的“数字报刊”分为机械制图报刊与电子版报刊,根据我个人的经验,电子版报刊的机器学习技术都应该是烂熟于胸了吧,放在那里看也没什么用,就算别人能够爬取的数据被你拿去做数据分析,那你这信息又干嘛去了?你说某个高校在那里的排名,那你可以通过排名来爬取学校的信息啊,你说什么时候毕业的,那你拿着学校的文件来,一搜就行,反正只要不是搜索top2这种大学就够了,拿来分析专业评级差异也是够的。这种分析对于新闻信息来说是没什么用的,所以此类大学排名可以忽略。

即将发布:2017年百度更新算法大盘点(一)

采集交流优采云 发表了文章 • 0 个评论 • 33 次浏览 • 2022-11-15 16:32 • 来自相关话题

  即将发布:2017年百度更新算法大盘点(一)
  近期,百度推出了一系列算法,旨在优化网站体验,更好地服务用户和互联网用户的搜索。今天小燕就把这些算法整理一下,方便以后在seo工作中更好的发挥作用。
  1.飓风算法
  2017年7月4日,百度更新上线飓风算法,严厉打击不良采集。有多少网站受到影响和打击,站长们已经炸了,赶紧来看看吧!
  飓风算法公告全文:
  百度搜索近日推出飓风算法,旨在严厉打击以不良内容来源采集为主要内容的网站。原创内容提供更多的展示机会,促进搜索生态的良性发展。
  飓风算法会例行输出惩罚数据,并会根据情况随时调整迭代次数,体现了百度搜索对不良采集的零容忍。优质原创站点如果发现站点的索引量明显下降,访问量明显下降,可以在反馈中心进行反馈。
  一言以蔽之,百度将开始重点打击采集如网站,并将长期不惜一切代价继续打击。对恶意采集网站百度一向持零容忍态度。
  2.清风算法
  
  2017年9月14日,百度更新上线清风算法,专门惩治网页标题作弊行为。说明标题内容是假的,或者标题中故意堆砌了关键词。做SEO的朋友一定要按照规则填写正确的内容。页面的标题。
  以下为青峰算法全文
  1、标题内容虚假,即标题所表达的内容与网页内容不符,具有欺骗用户之嫌。
  1.1 如遇假官网,将非官方网站描述为官网。
  1.2 标题说明中有TXT下载,但页面不提供下载服务。
  1.3 标题描述为小说下载,但下载的是APP。
  1.4 标题中写着有百度云下载支持在线查看,但是页面无法下载也无法在线查看。
  1.5 标题中部分描述不实。例如,网页标题表示有江苏依依大学排名,但该页面只有大学列表,没有与排名相关的内容。
  2. 故意堆砌标题是指多次重复和过度堆砌标题关键词。
  
  2.1 大量重复标题 关键词
  2.2 标题中堆积了大量标签
  3.优质标题写作建议
  3.1. 标题的书写不能有错别字。
  3.2. 题目意思清楚明了,没有错句和表达不清的地方。
  3.3. 标题应书写工整,无乱码、分句和截断,无关键词堆积。
  3.4. 标题不建议太长。页面标题可以概括为“核心词+适当修饰语”的格式。核心词就是核心内容,修饰语要放在核心词之后。不应出现冗余表达式。
  3.5. 标题围绕页面的主要内容编写,与页面的内容相关,能够突出页面的核心内容。
  3.6. 标题建议使用用户熟悉的语言描述(不建议使用繁体中文和混合多种语言)。如果网站既有中英文网站名字,尽量使用用户熟悉的作为标题描述。
  在官方文档中,分类页标题、首页标题、列表频道页标题、聚合页标题、内容页标题都有对应的示例需求。这些只是希望站长朋友们能够从用户体验的角度出发,不要只是借标题来吸引用户点击。只有把网站细节的每一步都真正做好,没有欺骗和堆砌,这样的标题才是合理的。
  大盘点:网络营销必备6大工具盘点(一)
  您的关注是对我们最大的肯定。每天都会有一篇文章原创文章与大家分享华锐视觉十年创业经历的运营、程序技术、各种坑的感悟。希望能帮助更多的创业者快速成长,绕过一些坑。
  现在,网络营销越来越难做,很多网络推广者没有自己的一套营销工具。今天小编就来介绍一些小编比较好用的工具站点,希望对大家有所帮助。
  1. SEO查询工具
  SEO工具是网络营销中常用的工具。常用的工具有: 1. 站长工具: . 2. 爱站:
  
  我们可以使用这个工具来查看网站关键词的密度、收录状态、外部链接/好友链接、权重、网站死亡链接、关键词排名, 和更多。另请参阅 网站结构、速度、优化等。
  2. 统计工具
  现在市面上的统计工具很多,常用平台有:51La()、百度统计()、CNZZ()等。这三个小编都用过,但是百度统计是最有用的一个,一是因为他的分析数据比较多,二是因为他的数据比较稳定准确。
  3. 网站管理工具
  
  1、百度站长平台:这个平台应该是大部分站长都会用到的,可以用这个平台提交网站数据。
  2. 360搜索站长平台:这个平台虽然功能不多,但是对于那些专注于360搜索引擎优化的运营商来说也很有用网站。一个常用的功能是“站点地图提交”。
  3、搜狗站长平台:这个平台和上面两个平台的功能差不多,你也可以在里面提交一些网站的数据。
  今天给大家分享三种工具,明天继续为大家分享剩下的网站营销工具,敬请期待。 查看全部

  即将发布:2017年百度更新算法大盘点(一)
  近期,百度推出了一系列算法,旨在优化网站体验,更好地服务用户和互联网用户的搜索。今天小燕就把这些算法整理一下,方便以后在seo工作中更好的发挥作用。
  1.飓风算法
  2017年7月4日,百度更新上线飓风算法,严厉打击不良采集。有多少网站受到影响和打击,站长们已经炸了,赶紧来看看吧!
  飓风算法公告全文:
  百度搜索近日推出飓风算法,旨在严厉打击以不良内容来源采集为主要内容的网站。原创内容提供更多的展示机会,促进搜索生态的良性发展。
  飓风算法会例行输出惩罚数据,并会根据情况随时调整迭代次数,体现了百度搜索对不良采集的零容忍。优质原创站点如果发现站点的索引量明显下降,访问量明显下降,可以在反馈中心进行反馈。
  一言以蔽之,百度将开始重点打击采集如网站,并将长期不惜一切代价继续打击。对恶意采集网站百度一向持零容忍态度。
  2.清风算法
  
  2017年9月14日,百度更新上线清风算法,专门惩治网页标题作弊行为。说明标题内容是假的,或者标题中故意堆砌了关键词。做SEO的朋友一定要按照规则填写正确的内容。页面的标题。
  以下为青峰算法全文
  1、标题内容虚假,即标题所表达的内容与网页内容不符,具有欺骗用户之嫌。
  1.1 如遇假官网,将非官方网站描述为官网。
  1.2 标题说明中有TXT下载,但页面不提供下载服务。
  1.3 标题描述为小说下载,但下载的是APP。
  1.4 标题中写着有百度云下载支持在线查看,但是页面无法下载也无法在线查看。
  1.5 标题中部分描述不实。例如,网页标题表示有江苏依依大学排名,但该页面只有大学列表,没有与排名相关的内容。
  2. 故意堆砌标题是指多次重复和过度堆砌标题关键词。
  
  2.1 大量重复标题 关键词
  2.2 标题中堆积了大量标签
  3.优质标题写作建议
  3.1. 标题的书写不能有错别字。
  3.2. 题目意思清楚明了,没有错句和表达不清的地方。
  3.3. 标题应书写工整,无乱码、分句和截断,无关键词堆积。
  3.4. 标题不建议太长。页面标题可以概括为“核心词+适当修饰语”的格式。核心词就是核心内容,修饰语要放在核心词之后。不应出现冗余表达式。
  3.5. 标题围绕页面的主要内容编写,与页面的内容相关,能够突出页面的核心内容。
  3.6. 标题建议使用用户熟悉的语言描述(不建议使用繁体中文和混合多种语言)。如果网站既有中英文网站名字,尽量使用用户熟悉的作为标题描述。
  在官方文档中,分类页标题、首页标题、列表频道页标题、聚合页标题、内容页标题都有对应的示例需求。这些只是希望站长朋友们能够从用户体验的角度出发,不要只是借标题来吸引用户点击。只有把网站细节的每一步都真正做好,没有欺骗和堆砌,这样的标题才是合理的。
  大盘点:网络营销必备6大工具盘点(一)
  您的关注是对我们最大的肯定。每天都会有一篇文章原创文章与大家分享华锐视觉十年创业经历的运营、程序技术、各种坑的感悟。希望能帮助更多的创业者快速成长,绕过一些坑。
  现在,网络营销越来越难做,很多网络推广者没有自己的一套营销工具。今天小编就来介绍一些小编比较好用的工具站点,希望对大家有所帮助。
  1. SEO查询工具
  SEO工具是网络营销中常用的工具。常用的工具有: 1. 站长工具: . 2. 爱站:
  
  我们可以使用这个工具来查看网站关键词的密度、收录状态、外部链接/好友链接、权重、网站死亡链接、关键词排名, 和更多。另请参阅 网站结构、速度、优化等。
  2. 统计工具
  现在市面上的统计工具很多,常用平台有:51La()、百度统计()、CNZZ()等。这三个小编都用过,但是百度统计是最有用的一个,一是因为他的分析数据比较多,二是因为他的数据比较稳定准确。
  3. 网站管理工具
  
  1、百度站长平台:这个平台应该是大部分站长都会用到的,可以用这个平台提交网站数据。
  2. 360搜索站长平台:这个平台虽然功能不多,但是对于那些专注于360搜索引擎优化的运营商来说也很有用网站。一个常用的功能是“站点地图提交”。
  3、搜狗站长平台:这个平台和上面两个平台的功能差不多,你也可以在里面提交一些网站的数据。
  今天给大家分享三种工具,明天继续为大家分享剩下的网站营销工具,敬请期待。

终极:神策杯 2018高校算法大师赛(个人、top2、top6)方案总结

采集交流优采云 发表了文章 • 0 个评论 • 45 次浏览 • 2022-11-15 16:29 • 来自相关话题

  终极:神策杯 2018高校算法大师赛(个人、top2、top6)方案总结
  神策数据推荐系统是基于神策分析平台的智能推荐系统。根据客户需求和业务特点,基于神策分析采集的用户行为数据,利用机器学习算法对咨询、视频、产品等进行个性化推荐,为客户提供智能化应用不同场景,比如优化产品体验,提升点击率等核心业务指标。
  传感器推荐系统是一个完整的学习闭环。采集的基础数据是通过机器学习的算法模型来应用的。实时验证效果,引导数据源的添加,算法优化反馈形成全流程、实时、自动、快速迭代的推荐闭环。
  本次比赛模拟业务场景,目的是提取新闻文本的核心词,最终结果达到提升推荐和用户画像的效果。
  比赛链接:
  Dataset数据地址:
  密码:qa2u
  02任务
  个性化推荐系统是神策智能系统的一个重要方面。准确理解信息的主题是提高推荐系统效果的重要手段。基于真实的商业案例,神策数据提供了数千篇文章 文章 及其 关键词。参赛者需要训练一个“关键词抽取”模型来抽取10万条新闻文章的关键词。
  03数据
  备注:报名参赛或加入战队后,即可获得数据下载权限。
  提供下载的数据集包括两部分:1.all_docs.txt,108295条信息文章数据,数据格式为:ID文章title文章text,以\001分隔在中间。2. train_docs_keywords.txt,1000篇文章文章的关键词标注结果,数据格式为:ID关键词列表,中间用\t分隔。
  注意:标记数据中每个文章的关键词不超过5个。关键词 都出现在 文章 的标题或正文中。需要注意的是“the set of 关键词 of the training set 文章”和“the set of 关键词 of the test set 文章”,这两个集合可能会重叠,但收录与收录之间并不一定存在关系。
  04个人预赛第十一名方案
  基于NLP中的无监督学习方法提取关键词,这也是我第一次参加比赛。当时刚接触NLP,所以对这次比赛印象很深,在此分享给大家
  神策杯“2018年高校算法大师赛B组排名(13/583)
  4.1 计分
  4.2 数据分析:
  4.3 提高技能
  
  词性标注
  这就是tf-idf抽取关键词错误较大的原因
  4.5 核心代码:
  # -*- coding: utf-8 -*-<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /># @Author  : quincyqiang<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /># @File    : analysis_for_06.py<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /># @Time    : 2018/9/5 14:17<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />import pickle<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />import pandas as pd<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />from tqdm import tqdm<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />from jieba.analyse import extract_tags,textrank # tf-idf<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />from jieba import posseg<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />import random<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />import jieba<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />jieba.analyse.set_stop_words('data/stop_words.txt') # 去除停用词<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />jieba.load_userdict('data/custom_dict.txt') # 设置词库<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />'''<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />  nr 人名 nz 其他专名 ns 地名 nt 机构团体 n 名词 l 习用语 i 成语 a 形容词 <br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />  nrt <br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />  v 动词 t 时间词<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />'''<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />test_data=pd.read_csv('data/test_docs.csv')<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />train_data=pd.read_csv('data/new_train_docs.csv')<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />allow_pos={'nr':1,'nz':2,'ns':3,'nt':4,'eng':5,'n':6,'l':7,'i':8,'a':9,'nrt':10,'v':11,'t':12}<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /># allow_pos={'nr':1,'nz':2,'ns':3,'nt':4,'eng':5,'nrt':10}<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />tf_pos = ['ns', 'n', 'vn', 'nr', 'nt', 'eng', 'nrt','v','a']<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />def generate_name(word_tags):<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    name_pos = ['ns', 'n', 'vn', 'nr', 'nt', 'eng', 'nrt']<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    for word_tag in word_tags:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />        if word_tag[0] == '·' or word_tag=='!':<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            index = word_tags.index(word_tag)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            if (index+1) 1]<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />        title_keywords = sorted(title_keywords, reverse=False, key=lambda x: (allow_pos[x[1]], -len(x[0])))<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />        if '·' in title :<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            if len(title_keywords) >= 2:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                key_1 = title_keywords[0][0]<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                key_2 = title_keywords[1][0]<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            else:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                # print(keywords,title,word_tags)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                key_1 = title_keywords[0][0]<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                key_2 = ''<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            labels_1.append(key_1)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            labels_2.append(key_2)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />        else:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            # 使用tf-idf<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            use_idf += 1<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            # ---------重要文本-----<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            primary_words = []<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            for keyword in title_keywords:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                if keyword[1] == 'n':<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                    primary_words.append(keyword[0])<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                if keyword[1] in ['nr', 'nz', 'nt', 'ns']:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                    primary_words.extend([keyword[0]] * len(keyword[0]))<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            abstract_text = "".join(doc.split(' ')[:15])<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            for word, tag in jieba.posseg.cut(abstract_text):<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                if tag == 'n':<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                    primary_words.append(word)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                if tag in ['nr', 'nz', 'ns']:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                    primary_words.extend([word] * len(word))<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            primary_text = "".join(primary_words)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            # 拼接成最后的文本<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            text = primary_text * 2 + title * 6 + " ".join(doc.split(' ')[:15] * 2) + doc<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            # ---------重要文本-----<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            temp_keywords = [keyword for keyword in extract_tags(text, topK=2)]<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            if len(temp_keywords)>=2:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                labels_1.append(temp_keywords[0])<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                labels_2.append(temp_keywords[1])<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            else:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                labels_1.append(temp_keywords[0])<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                labels_2.append(' ')<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    data = {'id': ids,<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            'label1': labels_1,<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            'label2': labels_2}<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    df_data = pd.DataFrame(data, columns=['id', 'label1', 'label2'])<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    df_data.to_csv('result/06_jieba_ensemble.csv', index=False)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    print("使用tf-idf提取的次数:",use_idf)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />if __name__ == '__main__':<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    # evaluate()<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    extract_keyword_ensemble(test_data)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />© 2021 GitHub, Inc.<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />
  以下是来自国内大佬的无私风向
  05 “神策杯”2018年高校算法大师赛第二名代码
  代码链接:
  文章链接:
  团队:SCI毕业
  5.1 目录说明
  jieba:修改jieba库。
  词典:商店解吧词库。PS:词库来自搜狗百度输入法词库,爬虫获得的星词和LSTM命名实体识别结果。
  all_docs.txt:训练语料库
  train_docs_keywords.txt:我改了一些明显错误的关键词,比如D039180梁静茹-&gt;贾静雯,D011909泰荣军-&gt;泰荣军等。
  classes_doc2vec.npy:默认gensim参数,doc2vec+Kmeans对语料库的聚类结果。
  my_idf.txt:计算出的语料的idf文件。
  lgb_sub_9524764012949717.npy LGB的某个预测值,用于特征生成
  stopword.txt:停用词
  Get_Feature.ipynb:特征生成notebook,生成训练集和测试集对应的文件
  lgb_predict.py:预测并输出结果的脚本。需要 train_df_v7.csv 和 test_df_v7.csv。
  train_df_v7.csv、test_df_v7.csv:Get_Feature.ipynb的结果,notebook有详细的特征描述
  Word2vec模型下载地址: 提取码:tw0m。
  Doc2vec模型下载地址:链接:提取码:0ciw。
  5.2 操作说明
  
  运行 Get_Feature.ipynb 以获取 train_df_v7.csv 和 test_df_v7.csv。
  运行 lgb_predict.py 得到结果 sub.csv。
  numpy 1.14.0rc1<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />pandas 0.23.0<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />sklearn 0.19.0<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />lightgbm 2.0.5<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />scipy 1.0.0<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />
  5.3 解题思路和方案说明
  使用jieba的tfidf方法筛选出Top20的候选人关键词
  对每个样本的候选关键词提取对应的特征,将关键词提取当做一个普通的二分类问题。特征可以分为两类:
  样本文档本身的特征:如文本长度、句子数量、聚类结果等;
  候选人关键词自身特点:关键词的长度、逆词频等;
  样本文本与候选关键词的交互特征:词频、中心词频、tfidf、主题相似度等;
  candidate 关键词之间的特征:主要是关键词之间的相似特征。
  候选 关键词 和其他示例文档之间的交互特征:这里有两个非常强大的特征。第一个是候选 关键词 在整个数据集中出现的频率,第二个类似于点击率。计算整个文档中被预测为正样本的概率结果的个数大于0.5(之前提到这个特征的时候,我大概以为会过拟合,但是效果出乎意料的好,所以没有做相应的平滑处理,可能吧因为结果只有Top2的关键词,这里选择0.5的概率会有一定的平滑效果,具体操作参考lgb_predict.py的31-42行)。
  使用LightGBM解决上面的二分类问题,然后根据LightGBM的结果选择每个文本预测概率前2的词作为关键词输出。
  06 第六名项目排名 6 / 622
  代码链接:
  07总结
  该任务属于短语挖掘或关键词挖掘。在接触NLP的过程中,很多同学都在研究如何从文本中挖掘关键词。NLP技术经过近几年的发展,大致归纳出以下几种方法。在上面分享的三个解决方案中:
  基于无监督方法:LDA、TFIDF、TextRank
  基于特征工程:基于无监督生成候选词,进而构建特征训练二分类模型
  关键词基于深度学习的提取:span、bio、bmes crf序列标注等方法
  08 更多信息
  谈谈医疗保健领域的Phrase Mining
  加微信到交流群:1185918903 注:ChallengeHub01
  解决方案:在线智能ai文章伪原创(智能ai文章php在线伪原创)
  阅读本文提示词:smart ai文章php在线伪原创、smart media ai在线伪原创、smart ai伪原创工具下载
  在线智能ai文章伪原创网站源码,1源码
  具体程序代码2
  程序代码 3 优于 伪原创
  程序代码4.如果真的是大型站点,上面一键生成一个适合说话的在线智能ai伪原创应用,可以轻松为你定制
  程序代码6.网上智能ai伪原创应用太多,你要学着做
  程序代码7,程序代码8,网站安全检测工具9,更适合在线智能ai伪原创应用 别人的代码你怎么看都懂
  程序代码9,在线智能AI伪原创应用篇一
  程序代码9、网站安全检测工具绿色免费检测工具绿色在线提交
  
  程序代码10、安全检测工具绿色在线检测
  程序代码11、安全检测工具绿色在线检测
  程序代码12,所有程序定义都不知道你有多厉害
  程序代码 1.所有目录都有软件文明检测完善的在线安全检测功能网站
  程序代码 1.所有目录不知道你有多好
  程序代码 1.将程序代码完全合并到一个网页中
  程序代码2、网页运行成功目录下面一行
  程序代码3.在页面顶部,使用写,标签等管理员操作
  程序代码4,web目录新建保存页面
  
  程序代码seo 伪原创文章工具,1个大量的HTML和JS文件
  使用 LanHelper 可以大大简化您的网络管理。
  LanHelper可以安装在包括全网在内的各种问题系统中,包括使用301重定向、查看兼容性、JS编码等使用方法
  系统软件设计
  LanHelper可实现对不同控制台的控制
  用纯 HTML 编写,运行速度非常快。如果你很快开发了一个简单易用的LanHelper,没有文件管理器,没有任何辅助设置,那些可以显示自动操作和自动更新的系统。
  LanHelper可以自动更新关键字、TAG标签、描述和功能等核心数据类型,并自动添加源代码,自动生成新的高质量展示。
  我会研究导演的出勤、出勤、出勤情况。如果我不能按时报告,讲座内容旁边会显示空白。你可以在这里输入,或者选择一个自动更新功能,它会自动更新为空白并自动更新。
  相关文章 查看全部

  终极:神策杯 2018高校算法大师赛(个人、top2、top6)方案总结
  神策数据推荐系统是基于神策分析平台的智能推荐系统。根据客户需求和业务特点,基于神策分析采集的用户行为数据,利用机器学习算法对咨询、视频、产品等进行个性化推荐,为客户提供智能化应用不同场景,比如优化产品体验,提升点击率等核心业务指标。
  传感器推荐系统是一个完整的学习闭环。采集的基础数据是通过机器学习的算法模型来应用的。实时验证效果,引导数据源的添加,算法优化反馈形成全流程、实时、自动、快速迭代的推荐闭环。
  本次比赛模拟业务场景,目的是提取新闻文本的核心词,最终结果达到提升推荐和用户画像的效果。
  比赛链接:
  Dataset数据地址:
  密码:qa2u
  02任务
  个性化推荐系统是神策智能系统的一个重要方面。准确理解信息的主题是提高推荐系统效果的重要手段。基于真实的商业案例,神策数据提供了数千篇文章 文章 及其 关键词。参赛者需要训练一个“关键词抽取”模型来抽取10万条新闻文章的关键词。
  03数据
  备注:报名参赛或加入战队后,即可获得数据下载权限。
  提供下载的数据集包括两部分:1.all_docs.txt,108295条信息文章数据,数据格式为:ID文章title文章text,以\001分隔在中间。2. train_docs_keywords.txt,1000篇文章文章的关键词标注结果,数据格式为:ID关键词列表,中间用\t分隔。
  注意:标记数据中每个文章的关键词不超过5个。关键词 都出现在 文章 的标题或正文中。需要注意的是“the set of 关键词 of the training set 文章”和“the set of 关键词 of the test set 文章”,这两个集合可能会重叠,但收录与收录之间并不一定存在关系。
  04个人预赛第十一名方案
  基于NLP中的无监督学习方法提取关键词,这也是我第一次参加比赛。当时刚接触NLP,所以对这次比赛印象很深,在此分享给大家
  神策杯“2018年高校算法大师赛B组排名(13/583)
  4.1 计分
  4.2 数据分析:
  4.3 提高技能
  
  词性标注
  这就是tf-idf抽取关键词错误较大的原因
  4.5 核心代码:
  # -*- coding: utf-8 -*-<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /># @Author  : quincyqiang<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /># @File    : analysis_for_06.py<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /># @Time    : 2018/9/5 14:17<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />import pickle<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />import pandas as pd<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />from tqdm import tqdm<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />from jieba.analyse import extract_tags,textrank # tf-idf<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />from jieba import posseg<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />import random<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />import jieba<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />jieba.analyse.set_stop_words('data/stop_words.txt') # 去除停用词<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />jieba.load_userdict('data/custom_dict.txt') # 设置词库<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />'''<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />  nr 人名 nz 其他专名 ns 地名 nt 机构团体 n 名词 l 习用语 i 成语 a 形容词 <br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />  nrt <br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />  v 动词 t 时间词<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />'''<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />test_data=pd.read_csv('data/test_docs.csv')<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />train_data=pd.read_csv('data/new_train_docs.csv')<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />allow_pos={'nr':1,'nz':2,'ns':3,'nt':4,'eng':5,'n':6,'l':7,'i':8,'a':9,'nrt':10,'v':11,'t':12}<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /># allow_pos={'nr':1,'nz':2,'ns':3,'nt':4,'eng':5,'nrt':10}<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />tf_pos = ['ns', 'n', 'vn', 'nr', 'nt', 'eng', 'nrt','v','a']<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />def generate_name(word_tags):<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    name_pos = ['ns', 'n', 'vn', 'nr', 'nt', 'eng', 'nrt']<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    for word_tag in word_tags:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />        if word_tag[0] == '·' or word_tag=='!':<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            index = word_tags.index(word_tag)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            if (index+1) 1]<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />        title_keywords = sorted(title_keywords, reverse=False, key=lambda x: (allow_pos[x[1]], -len(x[0])))<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />        if '·' in title :<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            if len(title_keywords) >= 2:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                key_1 = title_keywords[0][0]<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                key_2 = title_keywords[1][0]<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            else:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                # print(keywords,title,word_tags)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                key_1 = title_keywords[0][0]<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                key_2 = ''<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            labels_1.append(key_1)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            labels_2.append(key_2)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />        else:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            # 使用tf-idf<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            use_idf += 1<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            # ---------重要文本-----<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            primary_words = []<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            for keyword in title_keywords:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                if keyword[1] == 'n':<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                    primary_words.append(keyword[0])<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                if keyword[1] in ['nr', 'nz', 'nt', 'ns']:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                    primary_words.extend([keyword[0]] * len(keyword[0]))<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            abstract_text = "".join(doc.split(' ')[:15])<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            for word, tag in jieba.posseg.cut(abstract_text):<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                if tag == 'n':<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                    primary_words.append(word)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                if tag in ['nr', 'nz', 'ns']:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                    primary_words.extend([word] * len(word))<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            primary_text = "".join(primary_words)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            # 拼接成最后的文本<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            text = primary_text * 2 + title * 6 + " ".join(doc.split(' ')[:15] * 2) + doc<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            # ---------重要文本-----<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            temp_keywords = [keyword for keyword in extract_tags(text, topK=2)]<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            if len(temp_keywords)>=2:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                labels_1.append(temp_keywords[0])<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                labels_2.append(temp_keywords[1])<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            else:<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                labels_1.append(temp_keywords[0])<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />                labels_2.append(' ')<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    data = {'id': ids,<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            'label1': labels_1,<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />            'label2': labels_2}<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    df_data = pd.DataFrame(data, columns=['id', 'label1', 'label2'])<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    df_data.to_csv('result/06_jieba_ensemble.csv', index=False)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    print("使用tf-idf提取的次数:",use_idf)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />if __name__ == '__main__':<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    # evaluate()<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />    extract_keyword_ensemble(test_data)<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />© 2021 GitHub, Inc.<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />
  以下是来自国内大佬的无私风向
  05 “神策杯”2018年高校算法大师赛第二名代码
  代码链接:
  文章链接:
  团队:SCI毕业
  5.1 目录说明
  jieba:修改jieba库。
  词典:商店解吧词库。PS:词库来自搜狗百度输入法词库,爬虫获得的星词和LSTM命名实体识别结果。
  all_docs.txt:训练语料库
  train_docs_keywords.txt:我改了一些明显错误的关键词,比如D039180梁静茹-&gt;贾静雯,D011909泰荣军-&gt;泰荣军等。
  classes_doc2vec.npy:默认gensim参数,doc2vec+Kmeans对语料库的聚类结果。
  my_idf.txt:计算出的语料的idf文件。
  lgb_sub_9524764012949717.npy LGB的某个预测值,用于特征生成
  stopword.txt:停用词
  Get_Feature.ipynb:特征生成notebook,生成训练集和测试集对应的文件
  lgb_predict.py:预测并输出结果的脚本。需要 train_df_v7.csv 和 test_df_v7.csv。
  train_df_v7.csv、test_df_v7.csv:Get_Feature.ipynb的结果,notebook有详细的特征描述
  Word2vec模型下载地址: 提取码:tw0m。
  Doc2vec模型下载地址:链接:提取码:0ciw。
  5.2 操作说明
  
  运行 Get_Feature.ipynb 以获取 train_df_v7.csv 和 test_df_v7.csv。
  运行 lgb_predict.py 得到结果 sub.csv。
  numpy 1.14.0rc1<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />pandas 0.23.0<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />sklearn 0.19.0<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />lightgbm 2.0.5<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />scipy 1.0.0<br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" /><br style="margin: 0px;padding: 0px;max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" />
  5.3 解题思路和方案说明
  使用jieba的tfidf方法筛选出Top20的候选人关键词
  对每个样本的候选关键词提取对应的特征,将关键词提取当做一个普通的二分类问题。特征可以分为两类:
  样本文档本身的特征:如文本长度、句子数量、聚类结果等;
  候选人关键词自身特点:关键词的长度、逆词频等;
  样本文本与候选关键词的交互特征:词频、中心词频、tfidf、主题相似度等;
  candidate 关键词之间的特征:主要是关键词之间的相似特征。
  候选 关键词 和其他示例文档之间的交互特征:这里有两个非常强大的特征。第一个是候选 关键词 在整个数据集中出现的频率,第二个类似于点击率。计算整个文档中被预测为正样本的概率结果的个数大于0.5(之前提到这个特征的时候,我大概以为会过拟合,但是效果出乎意料的好,所以没有做相应的平滑处理,可能吧因为结果只有Top2的关键词,这里选择0.5的概率会有一定的平滑效果,具体操作参考lgb_predict.py的31-42行)。
  使用LightGBM解决上面的二分类问题,然后根据LightGBM的结果选择每个文本预测概率前2的词作为关键词输出。
  06 第六名项目排名 6 / 622
  代码链接:
  07总结
  该任务属于短语挖掘或关键词挖掘。在接触NLP的过程中,很多同学都在研究如何从文本中挖掘关键词。NLP技术经过近几年的发展,大致归纳出以下几种方法。在上面分享的三个解决方案中:
  基于无监督方法:LDA、TFIDF、TextRank
  基于特征工程:基于无监督生成候选词,进而构建特征训练二分类模型
  关键词基于深度学习的提取:span、bio、bmes crf序列标注等方法
  08 更多信息
  谈谈医疗保健领域的Phrase Mining
  加微信到交流群:1185918903 注:ChallengeHub01
  解决方案:在线智能ai文章伪原创(智能ai文章php在线伪原创)
  阅读本文提示词:smart ai文章php在线伪原创、smart media ai在线伪原创、smart ai伪原创工具下载
  在线智能ai文章伪原创网站源码,1源码
  具体程序代码2
  程序代码 3 优于 伪原创
  程序代码4.如果真的是大型站点,上面一键生成一个适合说话的在线智能ai伪原创应用,可以轻松为你定制
  程序代码6.网上智能ai伪原创应用太多,你要学着做
  程序代码7,程序代码8,网站安全检测工具9,更适合在线智能ai伪原创应用 别人的代码你怎么看都懂
  程序代码9,在线智能AI伪原创应用篇一
  程序代码9、网站安全检测工具绿色免费检测工具绿色在线提交
  
  程序代码10、安全检测工具绿色在线检测
  程序代码11、安全检测工具绿色在线检测
  程序代码12,所有程序定义都不知道你有多厉害
  程序代码 1.所有目录都有软件文明检测完善的在线安全检测功能网站
  程序代码 1.所有目录不知道你有多好
  程序代码 1.将程序代码完全合并到一个网页中
  程序代码2、网页运行成功目录下面一行
  程序代码3.在页面顶部,使用写,标签等管理员操作
  程序代码4,web目录新建保存页面
  
  程序代码seo 伪原创文章工具,1个大量的HTML和JS文件
  使用 LanHelper 可以大大简化您的网络管理。
  LanHelper可以安装在包括全网在内的各种问题系统中,包括使用301重定向、查看兼容性、JS编码等使用方法
  系统软件设计
  LanHelper可实现对不同控制台的控制
  用纯 HTML 编写,运行速度非常快。如果你很快开发了一个简单易用的LanHelper,没有文件管理器,没有任何辅助设置,那些可以显示自动操作和自动更新的系统。
  LanHelper可以自动更新关键字、TAG标签、描述和功能等核心数据类型,并自动添加源代码,自动生成新的高质量展示。
  我会研究导演的出勤、出勤、出勤情况。如果我不能按时报告,讲座内容旁边会显示空白。你可以在这里输入,或者选择一个自动更新功能,它会自动更新为空白并自动更新。
  相关文章

通用解决方案:C#爬虫算法[精华]

采集交流优采云 发表了文章 • 0 个评论 • 44 次浏览 • 2022-11-15 15:43 • 来自相关话题

  通用解决方案:C#爬虫算法[精华]
  在此期间采集一些网络资源的 C# 数据采集,考虑到
  
  采集源的防采集屏蔽,所以优采云采集器不能用,只能写一个,部分代码如下: Codprivatentnumc # 数据采集 C# 爬虫算法 C# 数据采集这个时候采集一些网络资源,考虑到防御采集源采集阻塞,所以优采云采集器不能用,只能写一个,部分代码比如 gotoRes() ntnum 这次采集一些网络资源, 考虑到采集源的防采集屏蔽,所以优采云采集器不能使用,只能写一个,部分代码如下: C#爬网算法 C#数据采集这次采集 一些网络资源,考虑到采集源的防采集屏蔽,所以优采云采集器没有用,只能写一个,部分代码如下: CodeprgotoRes(ntnumprivatevoidgotoRes()intnumintdnumstringstrMsg“ 执行数据如下:\r\n\r\n”;D ataTabledtBusiness。商。GetUrlTable(Convert。ToInt32(starid。文本),转换。ToInt32(endid。文本));stringstrPath“d:\\res\\”;stringstrFilePathstring[]resourceUrlSplitString(dt。
  Rows[i][“resourceUrl”]。ToString()。ToLower(),(intlengthresourceUrl。长度;长度++)dt。Rows[i][“resourceUrl”]。ToString()resourceUrl[length];(Business。商。UpDateRes(Convert。ToInt32(dt。行[i][“rid”])))“下载完成!\r\n“;dnum++;publicbooldownfile2(stringurl,stringLocalPath)newUri(url);HttpWebRequestmRequest(HttpWebRequest)WebRequest。创建(u);mRequest。方法“获取”;mRequest。ContentType“application/x-www-form-urlencoded”;HttpWebResponsewr(HttpWebResponse)mRequest。获取响应();状态栏1。TextStreamsInwr。
  
  GetResponseStream();FileStreamfsnewFileStream(LocalPath,FileMode。创建,文件访问。写);状态栏1。文本“错误!长长WR器。内容长度;intbyte[]buffernewbyte[1024];而“字节当前下载:”sIn。关闭();水利。关闭();状态栏1。文本“文件下载完成”文件大小 fs。长度。ToString() “byte”;安慰。写线(“文件下载完整文件大小”fs。长度。ToString()System。日期时间。现在。ToString());司 司长。关闭();返回真;返回假;}C#爬虫算法 C#数据采集这段时间内采集的一些网络资源,考虑到采集源的防采集屏蔽,所以优采云采集器没有用,只能写一个,部分代码如下: CodeprgotoRes (ntnumCodeprgotoRes(ntnum
  解决方案:百度飓风3.0算法解读,控制跨领域采集及站群问题
  百度8月8日发布公告称,“飓风算法3.0即将上线,控制跨域采集和站群问题”。为维护健康的移动生态,保障用户体验,确保优质站点/智能小程序获得合理的流量分配,百度搜索将于近期升级飓风算法,升级后的飓风算法3.0将上线在线的。
  本次算法升级主要针对跨域采集和站群问题,将覆盖百度搜索下的PC站点、H5站点、智能小程序等。对于算法覆盖的站点/智能小程序,将根据违规严重程度酌情限制搜索结果的展示。
  下面详细介绍飓风算法3.0的相关规则。
  问题1:同一品牌下,分支的网站/智能小程序都使用同一个模板,会不会被飓风算法3.0判定为站群命中?
  答1:对于站群问题,算法会综合判断页面布局相似度、同一主题下站点/智能小程序数量、内容质量、内容稀缺性、内容相似度等多种因素。
  
  如果网站/同品牌下的智能小程序使用相同的页面布局,内容相似度高,这种情况也可能被判断为站群,存在被算法命中的风险。
  问题示例:某品牌旗下多个区域分公司的智能小程序使用同一个模板,内容质量低,相似度高。
  问题2:此次飓风算法升级主要针对跨域采集,那么同域的采集会被算法覆盖吗?
  回答2:飓风算法3.0的主要升级点是加强了对跨域采集和站群问题的覆盖,但是之前的飓风算法在控制不良采集方面依然有效. 百度搜索算法一直在持续运行,以控制损害用户体验的违规行为,旧算法不会因算法升级或新增而停止。
  问题三:站点/智能小程序中如果有跨域采集内容,是否需要删除之前的跨域内容,以免被算法命中?
  回答3:是的,如果本站/智能小程序发布了与网站/智能小程序领域无关的内容,建议您尽快删除跨领域内容,深化当前领域,并生产满足用户需求的优质内容,提升网站/智能小程序的领域关注度。
  问题四:如果在一个站点下设置不同主题的频道或目录,发布不同领域的内容,会不会被算法命中?
  
  回答4:不同主题的频道或目录可以存在于同一个站点下,但每个频道的内容要与站点的领域定位相关,并以该领域为重点。频道的内容应该是满足搜索用户需求的优质内容。
  问题5:此次飓风算法升级主要针对跨领域的采集,那么同领域的采集会被算法覆盖吗?
  答5:同一个主题下可以存在不同主题的智能小程序,但每个智能小程序都应该有专业的资源、优质的内容、完整的功能。应该没有站群行为,内容应该关注智能小程序所属的域。
  总结:
  百度飓风算法3.0预计8月上线。当然,和以往一样,如果你的站点被百度识别为跨域采集或站群问题,那么你可能会收到百度搜索资源平台的提醒,比如站内信和短信,所以小编第九条,建议大家要自查,有的话就彻底整改,避免不必要的降电。
  其实小酒认为,与其说百度飓风算法3.0是针对跨域采集和站群,其实更像是在为百度的智能小程序助力和铺路,以及随着智能小程序权重的增加,通过搜索引擎算法间接将流量引向百度小程序。 查看全部

  通用解决方案:C#爬虫算法[精华]
  在此期间采集一些网络资源的 C# 数据采集,考虑到
  
  采集源的防采集屏蔽,所以优采云采集器不能用,只能写一个,部分代码如下: Codprivatentnumc # 数据采集 C# 爬虫算法 C# 数据采集这个时候采集一些网络资源,考虑到防御采集源采集阻塞,所以优采云采集器不能用,只能写一个,部分代码比如 gotoRes() ntnum 这次采集一些网络资源, 考虑到采集源的防采集屏蔽,所以优采云采集器不能使用,只能写一个,部分代码如下: C#爬网算法 C#数据采集这次采集 一些网络资源,考虑到采集源的防采集屏蔽,所以优采云采集器没有用,只能写一个,部分代码如下: CodeprgotoRes(ntnumprivatevoidgotoRes()intnumintdnumstringstrMsg“ 执行数据如下:\r\n\r\n”;D ataTabledtBusiness。商。GetUrlTable(Convert。ToInt32(starid。文本),转换。ToInt32(endid。文本));stringstrPath“d:\\res\\”;stringstrFilePathstring[]resourceUrlSplitString(dt。
  Rows[i][“resourceUrl”]。ToString()。ToLower(),(intlengthresourceUrl。长度;长度++)dt。Rows[i][“resourceUrl”]。ToString()resourceUrl[length];(Business。商。UpDateRes(Convert。ToInt32(dt。行[i][“rid”])))“下载完成!\r\n“;dnum++;publicbooldownfile2(stringurl,stringLocalPath)newUri(url);HttpWebRequestmRequest(HttpWebRequest)WebRequest。创建(u);mRequest。方法“获取”;mRequest。ContentType“application/x-www-form-urlencoded”;HttpWebResponsewr(HttpWebResponse)mRequest。获取响应();状态栏1。TextStreamsInwr。
  
  GetResponseStream();FileStreamfsnewFileStream(LocalPath,FileMode。创建,文件访问。写);状态栏1。文本“错误!长长WR器。内容长度;intbyte[]buffernewbyte[1024];而“字节当前下载:”sIn。关闭();水利。关闭();状态栏1。文本“文件下载完成”文件大小 fs。长度。ToString() “byte”;安慰。写线(“文件下载完整文件大小”fs。长度。ToString()System。日期时间。现在。ToString());司 司长。关闭();返回真;返回假;}C#爬虫算法 C#数据采集这段时间内采集的一些网络资源,考虑到采集源的防采集屏蔽,所以优采云采集器没有用,只能写一个,部分代码如下: CodeprgotoRes (ntnumCodeprgotoRes(ntnum
  解决方案:百度飓风3.0算法解读,控制跨领域采集及站群问题
  百度8月8日发布公告称,“飓风算法3.0即将上线,控制跨域采集和站群问题”。为维护健康的移动生态,保障用户体验,确保优质站点/智能小程序获得合理的流量分配,百度搜索将于近期升级飓风算法,升级后的飓风算法3.0将上线在线的。
  本次算法升级主要针对跨域采集和站群问题,将覆盖百度搜索下的PC站点、H5站点、智能小程序等。对于算法覆盖的站点/智能小程序,将根据违规严重程度酌情限制搜索结果的展示。
  下面详细介绍飓风算法3.0的相关规则。
  问题1:同一品牌下,分支的网站/智能小程序都使用同一个模板,会不会被飓风算法3.0判定为站群命中?
  答1:对于站群问题,算法会综合判断页面布局相似度、同一主题下站点/智能小程序数量、内容质量、内容稀缺性、内容相似度等多种因素。
  
  如果网站/同品牌下的智能小程序使用相同的页面布局,内容相似度高,这种情况也可能被判断为站群,存在被算法命中的风险。
  问题示例:某品牌旗下多个区域分公司的智能小程序使用同一个模板,内容质量低,相似度高。
  问题2:此次飓风算法升级主要针对跨域采集,那么同域的采集会被算法覆盖吗?
  回答2:飓风算法3.0的主要升级点是加强了对跨域采集和站群问题的覆盖,但是之前的飓风算法在控制不良采集方面依然有效. 百度搜索算法一直在持续运行,以控制损害用户体验的违规行为,旧算法不会因算法升级或新增而停止。
  问题三:站点/智能小程序中如果有跨域采集内容,是否需要删除之前的跨域内容,以免被算法命中?
  回答3:是的,如果本站/智能小程序发布了与网站/智能小程序领域无关的内容,建议您尽快删除跨领域内容,深化当前领域,并生产满足用户需求的优质内容,提升网站/智能小程序的领域关注度。
  问题四:如果在一个站点下设置不同主题的频道或目录,发布不同领域的内容,会不会被算法命中?
  
  回答4:不同主题的频道或目录可以存在于同一个站点下,但每个频道的内容要与站点的领域定位相关,并以该领域为重点。频道的内容应该是满足搜索用户需求的优质内容。
  问题5:此次飓风算法升级主要针对跨领域的采集,那么同领域的采集会被算法覆盖吗?
  答5:同一个主题下可以存在不同主题的智能小程序,但每个智能小程序都应该有专业的资源、优质的内容、完整的功能。应该没有站群行为,内容应该关注智能小程序所属的域。
  总结:
  百度飓风算法3.0预计8月上线。当然,和以往一样,如果你的站点被百度识别为跨域采集或站群问题,那么你可能会收到百度搜索资源平台的提醒,比如站内信和短信,所以小编第九条,建议大家要自查,有的话就彻底整改,避免不必要的降电。
  其实小酒认为,与其说百度飓风算法3.0是针对跨域采集和站群,其实更像是在为百度的智能小程序助力和铺路,以及随着智能小程序权重的增加,通过搜索引擎算法间接将流量引向百度小程序。

解决方案:百度飓风算法下 网站何去何从?

采集交流优采云 发表了文章 • 0 个评论 • 50 次浏览 • 2022-11-15 15:26 • 来自相关话题

  解决方案:百度飓风算法下 网站何去何从?
  2019-46-27
  网站在百度飓风算法下去哪了?
  7月7日,百度推出飓风算法!旨在严厉打击以不良内容来源采集为主要内容的网站。起初,飓风算法的影响并没有立即显现出来,而且大多被 网站 忽略了。我以为百度的算法只是对网站的一个警告,采集网站太多了,不可能一下子严厉整改。然而,从7月下旬开始,不少网站发现了全站索引量减少、降级、甚至零脱毛的“惨状”,这让广大网站开始关注起来到飓风算法。一时间,站长圈内人心惶惶,不知该如何应对!
  图1来自PS处理
  什么是飓风算法?
  关于飓风算法,百度给的介绍不是很详细,也没有像之前系列算法那样的惩罚案例。究其原因,大概是因为网站采集的行为比较广泛,不方便举例,所以站长没有引起重视,提前预防。不少网站被措手不及,不救难,损失惨重。
  飓风算法百度官方解释:
  
  百度搜索近日推出飓风算法,旨在严厉打击以不良内容来源采集为主要内容的网站。原创内容提供更多的展示机会,促进搜索生态的良性发展。
  飓风算法会例行输出惩罚数据,并会根据情况随时调整迭代次数,体现了百度搜索对不良采集的零容忍。优质原创站点如果发现站点的索引量明显下降,访问量明显下降,可以在反馈中心进行反馈。
  图2来自PS合成
  飓风算法的影响
  那么飓风算法带来了哪些影响呢?笔者将根据采集到的案例分析以下几点
  1 网站减少索引量
  很多网站发现飓风算法后百度搜索的索引量明显下降。这应该是飓风算法对网站采集行为最直接的惩罚,也应该算是最轻的惩罚。缩减的索引量应该是所有采集相关的内容。不过正常更新的网站内容基本不会被惩罚。
  2 网站体重下降
  
  有的网站在狂飙算法后通过爱站、站长工具等搜索,权重都在下降。说明采集的行为比较严重,网站的权重在索引量大幅度减少时直接受到影响。此类网站可能 采集 收录所有内容的 50% 以上。
  3 直接清除百度新闻源
  虽然百度在年初表示取消了新闻源概念,但百度新闻的展示并没有取消,取而代之的是VIP站点优质内容的推送。也就是说,如果你的网站内容质量高,符合百度算法的要求,也会在新闻源中展示。而在新算法下,百度对新闻来源的展示是实时的、智能的推送。一旦你的网站降低了内容质量,网站被黑客入侵,或者有过度的采集行为,惩罚的频率和强度也会增加。但是这次飓风算法,因为采集的行为,很多优质的新闻源站点被直接取消,造成了流量方面的巨大损失。
  4 网站直接拔毛并归零
  这种情况比较少见,但是笔者在搜集案例的时候确实遇到过,而且是比较大型的网站,每天有几十万的访问量。据分析,此类网站一般都是采集相当严重,甚至完全是采集网站。以前有的采集做的比较好网站,可以增加流量和权重,但是飓风算法一旦上线,不管你的网站多大,惩罚都会被惩罚。
  如何处理被招募网站?
  在飓风算法中,影响比较大的站点类型是信息。这种类型的 网站 通常具有特定的 采集 行为。处罚的时间和力度虽然不同,但基本相同。不能跑。百度算法说明中也有提到。飓风算法会根据情况随时调整自己的迭代次数。也许你的网站现在没有受到惩罚,但只要你有采集行为,迟早还是要“还债”的。第二类是b2b类网站,b2b网站一般数据量很大,很多网站也依赖采集采集数据,而b2b类比较依赖搜索引擎的张强也完全靠流量为生。一旦受到处罚,金钱的直接损失将比信息损失更惨网站。其他类型的网站,只要有采集行为,这次飓风算法都会进行惩罚。那么如何处理被招募网站?
  1 尽快停止 采集
  有些 网站 可能很幸运,即使受到惩罚也不想阻止 采集。其实,这种想法无可厚非。一旦你停止 采集,流量就会下降。网站 靠什么生存?但不要停止 采集 并遭受更多痛苦。还有一些 网站 认为我正在改进 采集 行为,减少 采集 的数量,调整 采集 频率和事件,做 采集文章编辑和修改可以逃避算法。这种想法也是错误的。现在搜索引擎的算法越来越聪明,算法也会考虑到你能想到的。所以网站和采集行为应该及时停止采集,以免造成更多的损失。
  解决方案:夏季SEO超链接工具和单向链接优化是否可行?(组图)
  下载: 开发商:
  软件语言:简体中文软件类别:国产软件/站长工具
  应用平台://
  某种
  0%(0)
  某种
  100% (9)
  软件介绍:
  根据最新的科学和艺术预测:未来人类今天所有的重复性工作都可以被机器和工具所取代,人们可以腾出双手去做自己喜欢的有创意的事情。
  
  今天,您可以将电脑上复杂的获取外部链接的过程交给Shaling的SEO超链接工具,为我们省时、省钱、省力!享受健康生活!
  优化原则:
  SEO超链接工具集成了ip查询、排名查询、pr查询等上万站长常用的查询站点,因为这些站点大部分都有查询记录展示功能,查询记录可以百度,
  、搜狗等搜索引擎迅速收录,形成外链。因为这是一个普通查询生成的外链,这个外链可以显着增加索引,提高搜索引擎排名!
  常见问题:
  1、使用SEO超链接工具算作SEO作弊吗?
  SEO超链接工具只是一个简单的综合查询工具,模拟正常的人工查询抓号,没有作弊。如果是作弊,你可以使用Daylight Savings SEO 超链接工具来推广你竞争对手的网站,然后放手。
  2. 网站单纯依靠DST SEO超链接工具和单向链接优化是否可行?
  网站优化不能单靠夏玲的SEO超链接工具。它需要结合正常的外部链接和附属链接。您可以在 网站 维基百科上发布 文章 并在附属链接平台上交换友好链接。
  3. 如何使用超链接以获得最佳效果?
  
  夏令时 SEO 超链接工具不同于常规链接。这是一个动态链接。只有经常使用超链接工具进行优化,才能获得稳定的链接,最终让搜索引擎将查询索引到URL页面
  指导:
  打开软件后,进入需要升级的网页,如: ,点击开始。程序小巧玲珑,不占内存,还可以最小化,每天都能跟上排名。
  更多介绍
  转载请注明出处文章。新会首页&gt; Web基础&gt; DIV&amp;CSS&gt;
  标题:夏季SEO超链接工具1.0
  地址:
  关键词:夏灵,超级,外链,工具
  自动采集和发布 网站文章
  有财云采集器是一个网站采集器,根据用户提供的关键词,自动采集云相关文章和发布给用户网站。它可以自动识别各种网页的标题、正文等信息,无需用户编写任何采集规则,实现采集全网。内容采集完成后,会自动计算内容与设置关键词的相关性,只推送相关的文章给用户。支持标题前缀、关键词自动加粗、永久链接插入、自动tag标签提取、自动内链、自动图片匹配、自动伪原创、内容过滤器更换、电话号码和URL清理、定时采集、百度主动提交等SEO功能。用户只需设置关键词和相关需求筛选电话号码软件,即可实现完全托管和零维护的网站内容更新。网站没有数量限制,无论是单个网站还是大型站群抓号器,都可以很方便的进行管理。 查看全部

  解决方案:百度飓风算法下 网站何去何从?
  2019-46-27
  网站在百度飓风算法下去哪了?
  7月7日,百度推出飓风算法!旨在严厉打击以不良内容来源采集为主要内容的网站。起初,飓风算法的影响并没有立即显现出来,而且大多被 网站 忽略了。我以为百度的算法只是对网站的一个警告,采集网站太多了,不可能一下子严厉整改。然而,从7月下旬开始,不少网站发现了全站索引量减少、降级、甚至零脱毛的“惨状”,这让广大网站开始关注起来到飓风算法。一时间,站长圈内人心惶惶,不知该如何应对!
  图1来自PS处理
  什么是飓风算法?
  关于飓风算法,百度给的介绍不是很详细,也没有像之前系列算法那样的惩罚案例。究其原因,大概是因为网站采集的行为比较广泛,不方便举例,所以站长没有引起重视,提前预防。不少网站被措手不及,不救难,损失惨重。
  飓风算法百度官方解释:
  
  百度搜索近日推出飓风算法,旨在严厉打击以不良内容来源采集为主要内容的网站。原创内容提供更多的展示机会,促进搜索生态的良性发展。
  飓风算法会例行输出惩罚数据,并会根据情况随时调整迭代次数,体现了百度搜索对不良采集的零容忍。优质原创站点如果发现站点的索引量明显下降,访问量明显下降,可以在反馈中心进行反馈。
  图2来自PS合成
  飓风算法的影响
  那么飓风算法带来了哪些影响呢?笔者将根据采集到的案例分析以下几点
  1 网站减少索引量
  很多网站发现飓风算法后百度搜索的索引量明显下降。这应该是飓风算法对网站采集行为最直接的惩罚,也应该算是最轻的惩罚。缩减的索引量应该是所有采集相关的内容。不过正常更新的网站内容基本不会被惩罚。
  2 网站体重下降
  
  有的网站在狂飙算法后通过爱站、站长工具等搜索,权重都在下降。说明采集的行为比较严重,网站的权重在索引量大幅度减少时直接受到影响。此类网站可能 采集 收录所有内容的 50% 以上。
  3 直接清除百度新闻源
  虽然百度在年初表示取消了新闻源概念,但百度新闻的展示并没有取消,取而代之的是VIP站点优质内容的推送。也就是说,如果你的网站内容质量高,符合百度算法的要求,也会在新闻源中展示。而在新算法下,百度对新闻来源的展示是实时的、智能的推送。一旦你的网站降低了内容质量,网站被黑客入侵,或者有过度的采集行为,惩罚的频率和强度也会增加。但是这次飓风算法,因为采集的行为,很多优质的新闻源站点被直接取消,造成了流量方面的巨大损失。
  4 网站直接拔毛并归零
  这种情况比较少见,但是笔者在搜集案例的时候确实遇到过,而且是比较大型的网站,每天有几十万的访问量。据分析,此类网站一般都是采集相当严重,甚至完全是采集网站。以前有的采集做的比较好网站,可以增加流量和权重,但是飓风算法一旦上线,不管你的网站多大,惩罚都会被惩罚。
  如何处理被招募网站?
  在飓风算法中,影响比较大的站点类型是信息。这种类型的 网站 通常具有特定的 采集 行为。处罚的时间和力度虽然不同,但基本相同。不能跑。百度算法说明中也有提到。飓风算法会根据情况随时调整自己的迭代次数。也许你的网站现在没有受到惩罚,但只要你有采集行为,迟早还是要“还债”的。第二类是b2b类网站,b2b网站一般数据量很大,很多网站也依赖采集采集数据,而b2b类比较依赖搜索引擎的张强也完全靠流量为生。一旦受到处罚,金钱的直接损失将比信息损失更惨网站。其他类型的网站,只要有采集行为,这次飓风算法都会进行惩罚。那么如何处理被招募网站?
  1 尽快停止 采集
  有些 网站 可能很幸运,即使受到惩罚也不想阻止 采集。其实,这种想法无可厚非。一旦你停止 采集,流量就会下降。网站 靠什么生存?但不要停止 采集 并遭受更多痛苦。还有一些 网站 认为我正在改进 采集 行为,减少 采集 的数量,调整 采集 频率和事件,做 采集文章编辑和修改可以逃避算法。这种想法也是错误的。现在搜索引擎的算法越来越聪明,算法也会考虑到你能想到的。所以网站和采集行为应该及时停止采集,以免造成更多的损失。
  解决方案:夏季SEO超链接工具和单向链接优化是否可行?(组图)
  下载: 开发商:
  软件语言:简体中文软件类别:国产软件/站长工具
  应用平台://
  某种
  0%(0)
  某种
  100% (9)
  软件介绍:
  根据最新的科学和艺术预测:未来人类今天所有的重复性工作都可以被机器和工具所取代,人们可以腾出双手去做自己喜欢的有创意的事情。
  
  今天,您可以将电脑上复杂的获取外部链接的过程交给Shaling的SEO超链接工具,为我们省时、省钱、省力!享受健康生活!
  优化原则:
  SEO超链接工具集成了ip查询、排名查询、pr查询等上万站长常用的查询站点,因为这些站点大部分都有查询记录展示功能,查询记录可以百度,
  、搜狗等搜索引擎迅速收录,形成外链。因为这是一个普通查询生成的外链,这个外链可以显着增加索引,提高搜索引擎排名!
  常见问题:
  1、使用SEO超链接工具算作SEO作弊吗?
  SEO超链接工具只是一个简单的综合查询工具,模拟正常的人工查询抓号,没有作弊。如果是作弊,你可以使用Daylight Savings SEO 超链接工具来推广你竞争对手的网站,然后放手。
  2. 网站单纯依靠DST SEO超链接工具和单向链接优化是否可行?
  网站优化不能单靠夏玲的SEO超链接工具。它需要结合正常的外部链接和附属链接。您可以在 网站 维基百科上发布 文章 并在附属链接平台上交换友好链接。
  3. 如何使用超链接以获得最佳效果?
  
  夏令时 SEO 超链接工具不同于常规链接。这是一个动态链接。只有经常使用超链接工具进行优化,才能获得稳定的链接,最终让搜索引擎将查询索引到URL页面
  指导:
  打开软件后,进入需要升级的网页,如: ,点击开始。程序小巧玲珑,不占内存,还可以最小化,每天都能跟上排名。
  更多介绍
  转载请注明出处文章。新会首页&gt; Web基础&gt; DIV&amp;CSS&gt;
  标题:夏季SEO超链接工具1.0
  地址:
  关键词:夏灵,超级,外链,工具
  自动采集和发布 网站文章
  有财云采集器是一个网站采集器,根据用户提供的关键词,自动采集云相关文章和发布给用户网站。它可以自动识别各种网页的标题、正文等信息,无需用户编写任何采集规则,实现采集全网。内容采集完成后,会自动计算内容与设置关键词的相关性,只推送相关的文章给用户。支持标题前缀、关键词自动加粗、永久链接插入、自动tag标签提取、自动内链、自动图片匹配、自动伪原创、内容过滤器更换、电话号码和URL清理、定时采集、百度主动提交等SEO功能。用户只需设置关键词和相关需求筛选电话号码软件,即可实现完全托管和零维护的网站内容更新。网站没有数量限制,无论是单个网站还是大型站群抓号器,都可以很方便的进行管理。

解决方案:视频的基本参数及H264编解码相关概念

采集交流优采云 发表了文章 • 0 个评论 • 45 次浏览 • 2022-11-12 13:49 • 来自相关话题

  解决方案:视频的基本参数及H264编解码相关概念
  DTS时间戳决定SCR时间等于DTS时间时解码器何时解码,与PTS时间戳类似。通常,DTS/PTS 时间戳表示比音频-视频数据包中的 SCR 晚的时间。例如,如果一个视频包的SCR为100ms(意味着播放100ms后从磁盘读取包),那么DTS/PTS值很少是200/280ms,也就是说当SCR达到200ms时,视频is 数据应该在 80ms 后解码并显示(视频数据保存在缓冲区中,直到解码开始)。当与视频流相关的复用率设置得太高时,通常会发生下溢。如果mux rate是1000000bits/sec(意味着解码器必须以1000000bits/sec读取文件),但视频速率是2000000bits/sec(意味着视频数据需要以2000000bits/sec显示),从磁盘读取 获取视频数据的速度不够快,无法在 1 秒内读取足够的视频数据。在这种情况下,DTS/PTS 时间戳表示视频在从硬盘读取之前已被解码或显示(DTS/PTS 时间戳将早于收录它们的数据包中的 SCR 时间)。
  现在依靠解码器,这基本上不是问题(尽管 MPEG 文件不完全符合 MPEG 标准,因为它们不应该有下溢)。一些编解码器(许多著名的基于 PC 的播放器)尽可能快地读取文件以显示视频,如果可能的话忽略 SCR。
  请注意,在您提供的列表中,平均视频流传输速率约为 3Mbps(3000000 位/秒),但峰值为 14Mbps(非常大,DVD 限制为 9.8Mbps)。这意味着需要将复用速率调整得足够大以处理 14Mbps 部分,而 bbMPEG 计算的复用速率有时太低而不会导致下溢。您是否打算使视频流率如此之高?这超出了 DVD 的规格,并且很可能不会在大多数独立设备中播放。如果您不这样计划,我会将 mquant 值从 1 增加,并在视频设置中将最大比特率设置为 9Mbps,以保持比特率更小。
  如果你真的想要视频比特率那么高,你需要增加复用率。从提供的列表中可以得出结论,bbMPEG 使用 06800bits/sec 或 1838350bytes/sec 的复用速率(总数据速率:1838350bytes/sec (06800bits/sec) 行)。您在 force mux rate 字段中设置的值应该以字节/秒为单位,并且可以被 50 整除。所以我将从 36767 (1838350/50) 开始并继续增长,直到不再有下溢错误;
  比特率(比特率) 关于比特率
  由于保存完整逐帧图片的原创视频文件太大,需要通过视频压缩算法对视频中的图片进行压缩,以减小视频文件的大小。视频的失真会越严重,因为视频中原创图像的数据信息在压缩过程中不可避免地会丢失。在了解这一点的前提下,我举个例子,将一个分辨率为1080P的原创视频(未压缩)压缩成两个分别为4GB和1GB的视频文件。因为1GB的视频压缩比更高,很明显看1GB的视频不如4GB的视频清晰(虽然它们的分辨率都是1080P)。
  比特率,也称为比特率,是指在压缩视频时为视频指定一个参数,以告诉压缩软件预期压缩视频的大小。比特率的英文名称是bps(bit per second),它是衡量一个视频大小的平均每秒比特数。
  计算视频的比特率
  我们可以根据视频的长度和大小来推断视频的比特率。下面是一个具体的例子。
  一个 1080P 的视频长 100 分钟,大小为 1GB,视频的比特率是多少?
  100min = 100*60s = 6000s;
1G = 1024M = 1024*1024KB = 1024*1024*1024Bit = 1024*1024*1024*8bit = 8589934592bit;
比特率 = 8589934592/6000s = 1431655b/s = 1.4Mbit/s;
复制代码
  那么这个视频的码率大约是1.4Mbit/s。这个比特率在在线视频中已经很高了。通常主流视频平台的最高码率在1Mbit左右,比如直播网站斗鱼。高清选项播放的实际视频码率为 900Kbit/s (0.9Mbit)。
  我们可以得出结论,对于相同时长的视频,码率越大,视频尺寸越大,视频质量越清晰(不管各种压缩算法的优劣),这是最直观的感受. 比特率对于视频来说非常重要。
  音视频同步
  上面提到的概念与视频帧、DTS 和 PTS 有关。我们都知道,在一个媒体流中,除了视频之外,一般还包括音频。音频播放也有DTS和PTS的概念,但是音频没有类似视频的B帧,不需要双向预测,所以音频帧的DTS和PTS顺序是一致的。
  将音视频混合在一起播放,呈现出我们经常看到的广义视频。当音视频一起播放时,我们一般需要面对一个问题:如何同步,避免出现画面不声音的情况。
  要实现音视频同步,一般需要选择一个参考时钟。参考时钟上的时间线性增加。在对音频和视频流进行编码时,每帧数据都会根据参考时钟上的时间打上时间戳。播放时,读取数据帧上的时间戳,参考当前参考时钟上的时间安排播放。这里提到的时间戳就是我们前面提到的PTS。在实践中,我们可以选择:同步视频到音频,同步音频到视频,同步音频和视频到外部时钟。
  视频编解码器概述软编码和硬编码的概念
  软编码:使用 CPU 进行编码。
  硬编码:不使用CPU进行编码,使用显卡GPU、专用DSP、FPGA、ASIC芯片等硬件进行编码。
  软编码和硬编码的比较
  软编码:实现直接简单,参数调整方便,升级容易,但CPU负载较重,性能比硬编码低,一般在低码率下质量比硬编码好。
  硬编码:性能高,一般在低码率下质量低于硬编码,但部分产品在GPU硬件平台上移植了优秀的软编码算法(如X264),质量与软编码基本相同。
  ios系统中的硬编码
  在 iOS 8.0 系统之前,苹果没有开放系统的硬件编解码功能,但 Mac OS 系统一直都有一个叫做 Video ToolBox 的框架来处理硬件编解码。最后,在 iOS 8.0 之后,Apple 将该框架引入了 iOS。系统。
  H264编码原理与I帧B帧P帧H264编码原理
  H264是新一代的编码标准。它以高压缩和高质量着称,支持各种网络的流媒体传输。在编码方面,我理解他的理论依据是:参考图像在一段时间内的统计结果,在相邻的几张图像中,通常不同的像素点只有10%以内,亮度差异确实变化不超过2%,色度差变化仅在1%以内。因此,对于变化不大的图像,我们可以先编码一个完整的图像帧A,后面的B帧不编码所有图像,而只写与A帧的差值,这样B帧的大小就只有整个框架的大小。1/10 或更少!如果B帧之后的C帧变化不大,我们可以通过参考B继续对C帧进行编码,依此类推。这个图像称为序列(序列是具有相同特征的一段数据)。当一个图像与前一个图像相比变化很大并且不能参考前一帧生成时,那么我们结束前一个序列并开始下一个序列。为这幅图像生成一个序列,即完整的帧A1,后面的图像参照A1生成,只写与A1的差异内容。
  H264 协议中定义了三种类型的帧。完整编码的帧称为I帧,参照前一帧产生的仅收录差异部分编码的帧称为P帧,还有参照前一帧编码的另一帧。调用 B 帧。
  H264使用的核心算法是帧内压缩和帧间压缩。帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。
  序列说明
  在 H264 中,图像以序列为单位进行组织。序列是由图像编码的数据流,从一个 I 帧开始,到下一个 I 帧结束。
  序列的第一个图像称为 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像。H.264 引入了用于解码重新同步的 IDR 图像。当解码器对IDR图像进行解码时,当参考帧队列即将被清空时,将所有解码数据输出或丢弃,重新搜索参数集开始新的序列。这样,如果前面的序列出现重大错误,这里就有机会重新同步。IDR图片之后的图片永远不会使用IDR之前图片的数据进行解码。
  
  序列是通过对内容差别不大的图像进行编码而生成的数据流。当运动变化相对较小时,序列可能会很长。由于运动变化很小,说明图像的内容变化很小,所以可以编译一个I帧,然后制作P帧和B帧。当运动变化较多时,一个序列可能比较短,例如收录一个I帧和三个或四个P帧。
  三种框架I框架介绍
  为了更好地理解I帧的概念,我列出两个解释:
  工字架特点:
  P 帧
  为了更好地理解P-frames的概念,我还列出了两个解释:
  **P-frame预测与重构:**P-frame以I-frame为参考帧,在I-frame中求P-frame“某一点”的预测值和运动向量,取预测差和运动矢量一起发送。在接收端,根据运动向量,从I帧中找到P帧的“某点”的预测值并加差,得到P帧的“某点”样本值,这样就可以得到完整的P帧。
  P帧特点:
  B 帧
  为了更好的理解P-frames的概念,我还是列出两个解释:
  **B帧的预测与重构:**B帧之前的I或P帧和B帧之后的P帧为参考帧,“找出”B帧“一个点”的预测值和两个运动向量,取预测差异和运动矢量传输。接收端根据运动矢量“找到(计算)”两个参考帧中的预测值,并与差值相加得到B帧的“点”样本值,从而得到完整的B帧。
  B帧的特点:
  I、B、P的每一帧都是根据压缩算法的需要人为定义的,都是真实的物理帧。一般来说,I帧的压缩比是7(和JPG差别很大),P帧是20,B帧可以达到50。可见使用B帧可以节省很多空间,节省的空间可以用于节省更多的I帧,在相同码率下可以提供更好的画质。
  压缩算法说明
  h264的压缩方式:
  分组:将几帧图像分成一个组(GOP,即一个序列)。为了防止运动变化,帧数不宜过多。定义帧:将每组中的每一帧图像定义为三种类型,即I帧、B帧和P帧;预测帧:以I帧为基帧,用I帧预测P帧,再用I帧和P帧预测B帧;数据传输:最后存储和传输I帧数据和预测的差异信息。
  帧内压缩也称为空间压缩。压缩一帧图像时,只考虑这一帧的数据,不考虑相邻帧之间的冗余信息,实际上类似于静态图像压缩。帧内通常使用有损压缩算法,因为帧内压缩是对完整的图像进行编码,因此可以独立解码和显示。帧内压缩通常不能达到很高的压缩率,并且非常接近于编码 jpeg。
  帧间压缩的原理是:相邻几帧的数据有很大的相关性,或者说是连续两帧的信息变化不大的特点。也就是说,连续视频在相邻帧之间具有冗余信息。根据该特征,压缩相邻帧之间的冗余可以进一步增加压缩量并降低压缩率。帧间压缩也称为时间压缩,通过在时间轴上比较不同帧之间的数据来压缩数据。帧间压缩通常是无损的。帧差分算法是一种典型的时间压缩方法。它比较本帧与相邻帧的差异,只记录本帧与其相邻帧的差异,可以大大减少数据量。.
  顺便说一下,有损(Lossy)压缩和无损(Lossy less)压缩。无损压缩是指压缩前和解压后的数据完全相同。大多数无损压缩使用 RLE 游程编码算法。有损压缩是指解压后的数据与压缩前的数据不一样。在压缩过程中,会丢失一些对人眼和耳朵不敏感的图像或音频信息,丢失的信息无法恢复。几乎所有的高压缩算法都使用有损压缩来达到低数据速率的目标。丢失的数据率与压缩率有关。压缩比越小,丢失的数据越多,解压效果通常越差。此外,
  三帧不一样,DTS和PTS不一样
  DTS主要用于视频解码,用于解码阶段。PTS主要用于视频同步和输出。它用于显示。在没有B帧的情况下,DTS和PTS的输出顺序是一样的。
  例子:
  下面是一个 GOP 为 15 的示例,解码后的参考帧及其解码顺序在其中:
  如上图: I帧的解码不依赖于任何其他帧。p帧的解码依赖于之前的I帧或P帧。B 帧的解码取决于最近的前一个 I 帧或 P 帧。帧和下一个最近的 P 帧。
  IOS系统H264视频硬件编解码说明
  我们知道,在IOS8系统之后,苹果将Mac OS中硬件编解码的VideoToolbox框架引入了IOS系统。
  根据苹果WWDC2014 513“直接访问媒体编解码”的描述,苹果之前提供的AVFoundation框架也是使用硬件对视频进行硬编码解码,但是编码后直接写入文件,之后直接显示解码。Video Toolbox框架可以获得编码后的帧结构和解码后的原创图像,因此在做一些视频图像处理方面具有更大的灵活性。
  视频工具箱简介
  在iOS中,有5个视频相关的接口,从顶层开始:AVKit - AVFoundation - VideoToolbox - Core Media - Core Video
  其中VideoToolbox可以将视频解压到CVPixelBuffer,也可以压缩到cmsampleBuffer。
  如果需要使用硬编码,在这5个接口中,需要用到AVKit、AVFoundation和VideoToolbox。这里我只介绍VideoToolbox。
  VideoToolbox 中的对象硬解码
  经过如图所示的典型应用,来说明如何使用硬件解码接口。应用场景是从网络传输H264编码的视频流,最后显示在手机屏幕上。
  要完成以上功能,需要经过以下步骤:
  
  将 H.264 流转换为 cmsampleBuffer 显示 cmsampleBuffer 将 H.264 流转换为 cmsampleBuffer
  我们知道 cmsampleBuffer = CMTime + FormatDesc + CMBlockBuffer 。需要从H264码流中提取以上三个信息。最后组合成cmsampleBuffer,提供给硬解码接口进行解码。
  在H.264的语法中,有一个最基本的层叫做网络抽象层,简称NAL。H.264流数据由一系列NAL单元(NAL Unit,简称NAUL)组成。
  H264的码流由NALU单元组成,一个NALU可能收录:
  NALU 标头
  对于流数据,NAUL header 通常以 0x00 00 01 或 0x00 00 00 01 开头(两者都有可能,下面以 0x00 00 01 为例)。0x00 00 01 称为起始码。
  总结以上知识,我们知道H264码流是由NALU单元组成的,其中收录视频图像数据和H264参数信息。视频图像数据为CMBlockBuffer,可以将H264的参数信息组合成FormatDesc。具体的,参数信息包括SPS(Sequence Parameter Set)和PPS(Picture Parameter Set)。下图是一个H.264码流的结构:
  1)提取sps和pps生成FormatDesc
  2)提取视频图像数据生成CMBlockBuffer
  3)根据需要生成CMTime信息。(实际测试中,添加时间信息后,出现了不稳定的图像,但不添加时间信息就没有了,需要进一步研究,这里建议不要添加时间信息)
  根据上述获取CMVideoFormatDescriptionRef、CMBlockBufferRef和可选的时间信息,使用cmsampleBufferCreate接口获取要解码的原创数据为cmsampleBuffer数据。下图为H264数据转换示意图。
  显示 cmsampleBuffer
  有两种显示方式:
  1)通过系统提供的AVSampleBufferDisplayLayer解码显示
  用法与其他CALayer类似。该层内置硬件解码功能,直接将原创cmsampleBuffer的解码图像显示在屏幕上,非常简单方便。
  2) 用 OPenGL 本身渲染
  通过VTDecompression接口,将cmsampleBuffer解码成图像,并在UIImageView或OpenGL上显示图像。
  硬编码
  硬编码的使用也通过一个典型的应用场景来描述。首先通过摄像头获取采集图像,然后对采集接收到的图像进行硬编码,最后将编码后的数据组合成H264码流通过网络传播.
  以下是具体步骤的说明:
  相机采集数据
  Camera采集,iOS系统为采集相机图像数据提供AVCaptureSession。设置会话的 采集 分辨率。然后设置输入和输出。设置输出时,需要设置委托和输出队列。在委托方法中,处理 采集 好的图像。
  图像输出的格式是未编码的 cmsampleBuffer 形式。
  使用 VTCompressionSession 硬编码
  1)初始化VTCompressionSession
  VTCompressionSession初始化时,通常需要给出width宽度、高度长度、编码器类型kCMVideoCodecType_H264等。然后通过调用VTSessionSetProperty接口设置帧率等属性,demo中提供了一些设置参考。测试时发现几乎没有效果,可能需要进一步调试。最后,需要设置一个回调函数。视频图像编码成功后调用该回调。一切准备就绪后,使用 VTCompressionSessionCreate 创建会话
  2)提取相机采集的原创图像数据到VTCompressionSession进行硬编码
  相机 采集 之后的图像是未编码的 cmsampleBuffer 形式。给定的接口函数 cmsampleBufferGetImageBuffer 用于从中提取 CVPixelBufferRef,硬编码接口 VTCompressionSessionEncodeFrame 用于对帧进行硬编码。,编码成功后,会自动调用会话初始化时设置的回调函数。
  3)使用回调函数将编码成功的cmsampleBuffer转化为H264流,并通过网络传播
  基本上是硬解码的逆过程。解析出参数集SPS和PPS,加上起始代码,组装成NALU。提取视频数据,将长度码转换为起始码,组长为NALU。将 NALU 发送出去。
  下一篇文章我们将介绍H264硬编码和软编码的实现。
  参考
  教程:帝国cms在首页调用指定几个栏目的所有文章和用js实现分页的方法
  先说明一下我的问题:我的博客有两个主题,技术和生活,四栏是技术,四栏是生活。我想在首页调用所有文章的技术类,实现分页。
  首先,让我们调用指定列的所有文章。我不需要 php。我在群友的提示下重新阅读了智能标签。我可以使用智能标签。我只需要在''中写上指定列的ids即可,可以一起使用,也可以分开使用,例如:
  
[e:loop={'1,12,13,16',10000,0,0}]
[/e:loop]
  让我们谈谈分页。一开始,我给青姐看我以前调用技术类所有文章的代码,问她如何实现分页。她告诉我这个调用无法实现分页,所以我只好使用自定义列表。她的文章:,但是我在操作过程中提交自定义列表后是空白的,无法查看原因,而且我的主页是动态主页,我还加了反采集和放入index.php 原来是phpcms站的动态链接改成了404的代码,那么我的网站使用中青姐的方法有缺陷。
  先说一下如何使用js实现分页,js在墨鱼博客中找到,原地址: ,但是用了我的网站后出现乱码,解决方法很简单,新建一个文本文档并把代码复制过来,然后另存为,选择UTF-8进行编码,然后新建一个js把代码复制回乱码问题就解决了。
  具体使用方法是在你原来的ul中加上id="list",并写样式display:none,然后在原来的ul下再加一个ul,类名id="list2",这个ul是用来移植的上面隐藏ul,在新添加的ul下调用js,这里我改成index-page.js,我把原文前面调用的js改成page-function.js,整体代码如下:
  这个时候前台打电话是没有问题的,但是你发现风格乱了。据说id="list2"的ul是用来移植id="list"的ul的内容,id="list"的ul也是隐藏的。然后将原创 ul 的类名添加到 id="list2" 的 ul 中。
  然后说样式,样式都在class="ctrlPages"的span里面,分页按钮在a标签里面,大家f12慢慢写样式,我提供我写的:
  
  
/*分页*/
span.ctrlPages {
display: block;
width: 90%;
text-align: center;
line-height: 2.0;
margin: auto;
margin-bottom: 15px;
}
span.ctrlPages a {
border: solid 1px #C6C4C4;
padding: 2px 5px 2px 5px;
color: #333;
}
<p>
span.ctrlPages a.curPage {
background-color: #FD9D01;
padding: 3px 5px 3px 5px;
color: #fff;
border: none;
}</p>
  效果如下:
  我觉得当前页和页码提示没什么用,所以我把page-function.js中的相关代码删掉了,这个js中也修改了小样式。以下是修改后的效果
  我的js下载
  dgcms-index-page.rar
  02385c9a4d92a50047ade72c4ff49889.rar(1.44 KB)
  2019年9月29日补充:js实现分页存在缺陷,即一次加载所有列表信息。您可以通过查看源代码来了解这一点。如果您的主页没有使用缓存技术,建议加载或使用自定义您的列表。 查看全部

  解决方案:视频的基本参数及H264编解码相关概念
  DTS时间戳决定SCR时间等于DTS时间时解码器何时解码,与PTS时间戳类似。通常,DTS/PTS 时间戳表示比音频-视频数据包中的 SCR 晚的时间。例如,如果一个视频包的SCR为100ms(意味着播放100ms后从磁盘读取包),那么DTS/PTS值很少是200/280ms,也就是说当SCR达到200ms时,视频is 数据应该在 80ms 后解码并显示(视频数据保存在缓冲区中,直到解码开始)。当与视频流相关的复用率设置得太高时,通常会发生下溢。如果mux rate是1000000bits/sec(意味着解码器必须以1000000bits/sec读取文件),但视频速率是2000000bits/sec(意味着视频数据需要以2000000bits/sec显示),从磁盘读取 获取视频数据的速度不够快,无法在 1 秒内读取足够的视频数据。在这种情况下,DTS/PTS 时间戳表示视频在从硬盘读取之前已被解码或显示(DTS/PTS 时间戳将早于收录它们的数据包中的 SCR 时间)。
  现在依靠解码器,这基本上不是问题(尽管 MPEG 文件不完全符合 MPEG 标准,因为它们不应该有下溢)。一些编解码器(许多著名的基于 PC 的播放器)尽可能快地读取文件以显示视频,如果可能的话忽略 SCR。
  请注意,在您提供的列表中,平均视频流传输速率约为 3Mbps(3000000 位/秒),但峰值为 14Mbps(非常大,DVD 限制为 9.8Mbps)。这意味着需要将复用速率调整得足够大以处理 14Mbps 部分,而 bbMPEG 计算的复用速率有时太低而不会导致下溢。您是否打算使视频流率如此之高?这超出了 DVD 的规格,并且很可能不会在大多数独立设备中播放。如果您不这样计划,我会将 mquant 值从 1 增加,并在视频设置中将最大比特率设置为 9Mbps,以保持比特率更小。
  如果你真的想要视频比特率那么高,你需要增加复用率。从提供的列表中可以得出结论,bbMPEG 使用 06800bits/sec 或 1838350bytes/sec 的复用速率(总数据速率:1838350bytes/sec (06800bits/sec) 行)。您在 force mux rate 字段中设置的值应该以字节/秒为单位,并且可以被 50 整除。所以我将从 36767 (1838350/50) 开始并继续增长,直到不再有下溢错误;
  比特率(比特率) 关于比特率
  由于保存完整逐帧图片的原创视频文件太大,需要通过视频压缩算法对视频中的图片进行压缩,以减小视频文件的大小。视频的失真会越严重,因为视频中原创图像的数据信息在压缩过程中不可避免地会丢失。在了解这一点的前提下,我举个例子,将一个分辨率为1080P的原创视频(未压缩)压缩成两个分别为4GB和1GB的视频文件。因为1GB的视频压缩比更高,很明显看1GB的视频不如4GB的视频清晰(虽然它们的分辨率都是1080P)。
  比特率,也称为比特率,是指在压缩视频时为视频指定一个参数,以告诉压缩软件预期压缩视频的大小。比特率的英文名称是bps(bit per second),它是衡量一个视频大小的平均每秒比特数。
  计算视频的比特率
  我们可以根据视频的长度和大小来推断视频的比特率。下面是一个具体的例子。
  一个 1080P 的视频长 100 分钟,大小为 1GB,视频的比特率是多少?
  100min = 100*60s = 6000s;
1G = 1024M = 1024*1024KB = 1024*1024*1024Bit = 1024*1024*1024*8bit = 8589934592bit;
比特率 = 8589934592/6000s = 1431655b/s = 1.4Mbit/s;
复制代码
  那么这个视频的码率大约是1.4Mbit/s。这个比特率在在线视频中已经很高了。通常主流视频平台的最高码率在1Mbit左右,比如直播网站斗鱼。高清选项播放的实际视频码率为 900Kbit/s (0.9Mbit)。
  我们可以得出结论,对于相同时长的视频,码率越大,视频尺寸越大,视频质量越清晰(不管各种压缩算法的优劣),这是最直观的感受. 比特率对于视频来说非常重要。
  音视频同步
  上面提到的概念与视频帧、DTS 和 PTS 有关。我们都知道,在一个媒体流中,除了视频之外,一般还包括音频。音频播放也有DTS和PTS的概念,但是音频没有类似视频的B帧,不需要双向预测,所以音频帧的DTS和PTS顺序是一致的。
  将音视频混合在一起播放,呈现出我们经常看到的广义视频。当音视频一起播放时,我们一般需要面对一个问题:如何同步,避免出现画面不声音的情况。
  要实现音视频同步,一般需要选择一个参考时钟。参考时钟上的时间线性增加。在对音频和视频流进行编码时,每帧数据都会根据参考时钟上的时间打上时间戳。播放时,读取数据帧上的时间戳,参考当前参考时钟上的时间安排播放。这里提到的时间戳就是我们前面提到的PTS。在实践中,我们可以选择:同步视频到音频,同步音频到视频,同步音频和视频到外部时钟。
  视频编解码器概述软编码和硬编码的概念
  软编码:使用 CPU 进行编码。
  硬编码:不使用CPU进行编码,使用显卡GPU、专用DSP、FPGA、ASIC芯片等硬件进行编码。
  软编码和硬编码的比较
  软编码:实现直接简单,参数调整方便,升级容易,但CPU负载较重,性能比硬编码低,一般在低码率下质量比硬编码好。
  硬编码:性能高,一般在低码率下质量低于硬编码,但部分产品在GPU硬件平台上移植了优秀的软编码算法(如X264),质量与软编码基本相同。
  ios系统中的硬编码
  在 iOS 8.0 系统之前,苹果没有开放系统的硬件编解码功能,但 Mac OS 系统一直都有一个叫做 Video ToolBox 的框架来处理硬件编解码。最后,在 iOS 8.0 之后,Apple 将该框架引入了 iOS。系统。
  H264编码原理与I帧B帧P帧H264编码原理
  H264是新一代的编码标准。它以高压缩和高质量着称,支持各种网络的流媒体传输。在编码方面,我理解他的理论依据是:参考图像在一段时间内的统计结果,在相邻的几张图像中,通常不同的像素点只有10%以内,亮度差异确实变化不超过2%,色度差变化仅在1%以内。因此,对于变化不大的图像,我们可以先编码一个完整的图像帧A,后面的B帧不编码所有图像,而只写与A帧的差值,这样B帧的大小就只有整个框架的大小。1/10 或更少!如果B帧之后的C帧变化不大,我们可以通过参考B继续对C帧进行编码,依此类推。这个图像称为序列(序列是具有相同特征的一段数据)。当一个图像与前一个图像相比变化很大并且不能参考前一帧生成时,那么我们结束前一个序列并开始下一个序列。为这幅图像生成一个序列,即完整的帧A1,后面的图像参照A1生成,只写与A1的差异内容。
  H264 协议中定义了三种类型的帧。完整编码的帧称为I帧,参照前一帧产生的仅收录差异部分编码的帧称为P帧,还有参照前一帧编码的另一帧。调用 B 帧。
  H264使用的核心算法是帧内压缩和帧间压缩。帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。
  序列说明
  在 H264 中,图像以序列为单位进行组织。序列是由图像编码的数据流,从一个 I 帧开始,到下一个 I 帧结束。
  序列的第一个图像称为 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像。H.264 引入了用于解码重新同步的 IDR 图像。当解码器对IDR图像进行解码时,当参考帧队列即将被清空时,将所有解码数据输出或丢弃,重新搜索参数集开始新的序列。这样,如果前面的序列出现重大错误,这里就有机会重新同步。IDR图片之后的图片永远不会使用IDR之前图片的数据进行解码。
  
  序列是通过对内容差别不大的图像进行编码而生成的数据流。当运动变化相对较小时,序列可能会很长。由于运动变化很小,说明图像的内容变化很小,所以可以编译一个I帧,然后制作P帧和B帧。当运动变化较多时,一个序列可能比较短,例如收录一个I帧和三个或四个P帧。
  三种框架I框架介绍
  为了更好地理解I帧的概念,我列出两个解释:
  工字架特点:
  P 帧
  为了更好地理解P-frames的概念,我还列出了两个解释:
  **P-frame预测与重构:**P-frame以I-frame为参考帧,在I-frame中求P-frame“某一点”的预测值和运动向量,取预测差和运动矢量一起发送。在接收端,根据运动向量,从I帧中找到P帧的“某点”的预测值并加差,得到P帧的“某点”样本值,这样就可以得到完整的P帧。
  P帧特点:
  B 帧
  为了更好的理解P-frames的概念,我还是列出两个解释:
  **B帧的预测与重构:**B帧之前的I或P帧和B帧之后的P帧为参考帧,“找出”B帧“一个点”的预测值和两个运动向量,取预测差异和运动矢量传输。接收端根据运动矢量“找到(计算)”两个参考帧中的预测值,并与差值相加得到B帧的“点”样本值,从而得到完整的B帧。
  B帧的特点:
  I、B、P的每一帧都是根据压缩算法的需要人为定义的,都是真实的物理帧。一般来说,I帧的压缩比是7(和JPG差别很大),P帧是20,B帧可以达到50。可见使用B帧可以节省很多空间,节省的空间可以用于节省更多的I帧,在相同码率下可以提供更好的画质。
  压缩算法说明
  h264的压缩方式:
  分组:将几帧图像分成一个组(GOP,即一个序列)。为了防止运动变化,帧数不宜过多。定义帧:将每组中的每一帧图像定义为三种类型,即I帧、B帧和P帧;预测帧:以I帧为基帧,用I帧预测P帧,再用I帧和P帧预测B帧;数据传输:最后存储和传输I帧数据和预测的差异信息。
  帧内压缩也称为空间压缩。压缩一帧图像时,只考虑这一帧的数据,不考虑相邻帧之间的冗余信息,实际上类似于静态图像压缩。帧内通常使用有损压缩算法,因为帧内压缩是对完整的图像进行编码,因此可以独立解码和显示。帧内压缩通常不能达到很高的压缩率,并且非常接近于编码 jpeg。
  帧间压缩的原理是:相邻几帧的数据有很大的相关性,或者说是连续两帧的信息变化不大的特点。也就是说,连续视频在相邻帧之间具有冗余信息。根据该特征,压缩相邻帧之间的冗余可以进一步增加压缩量并降低压缩率。帧间压缩也称为时间压缩,通过在时间轴上比较不同帧之间的数据来压缩数据。帧间压缩通常是无损的。帧差分算法是一种典型的时间压缩方法。它比较本帧与相邻帧的差异,只记录本帧与其相邻帧的差异,可以大大减少数据量。.
  顺便说一下,有损(Lossy)压缩和无损(Lossy less)压缩。无损压缩是指压缩前和解压后的数据完全相同。大多数无损压缩使用 RLE 游程编码算法。有损压缩是指解压后的数据与压缩前的数据不一样。在压缩过程中,会丢失一些对人眼和耳朵不敏感的图像或音频信息,丢失的信息无法恢复。几乎所有的高压缩算法都使用有损压缩来达到低数据速率的目标。丢失的数据率与压缩率有关。压缩比越小,丢失的数据越多,解压效果通常越差。此外,
  三帧不一样,DTS和PTS不一样
  DTS主要用于视频解码,用于解码阶段。PTS主要用于视频同步和输出。它用于显示。在没有B帧的情况下,DTS和PTS的输出顺序是一样的。
  例子:
  下面是一个 GOP 为 15 的示例,解码后的参考帧及其解码顺序在其中:
  如上图: I帧的解码不依赖于任何其他帧。p帧的解码依赖于之前的I帧或P帧。B 帧的解码取决于最近的前一个 I 帧或 P 帧。帧和下一个最近的 P 帧。
  IOS系统H264视频硬件编解码说明
  我们知道,在IOS8系统之后,苹果将Mac OS中硬件编解码的VideoToolbox框架引入了IOS系统。
  根据苹果WWDC2014 513“直接访问媒体编解码”的描述,苹果之前提供的AVFoundation框架也是使用硬件对视频进行硬编码解码,但是编码后直接写入文件,之后直接显示解码。Video Toolbox框架可以获得编码后的帧结构和解码后的原创图像,因此在做一些视频图像处理方面具有更大的灵活性。
  视频工具箱简介
  在iOS中,有5个视频相关的接口,从顶层开始:AVKit - AVFoundation - VideoToolbox - Core Media - Core Video
  其中VideoToolbox可以将视频解压到CVPixelBuffer,也可以压缩到cmsampleBuffer。
  如果需要使用硬编码,在这5个接口中,需要用到AVKit、AVFoundation和VideoToolbox。这里我只介绍VideoToolbox。
  VideoToolbox 中的对象硬解码
  经过如图所示的典型应用,来说明如何使用硬件解码接口。应用场景是从网络传输H264编码的视频流,最后显示在手机屏幕上。
  要完成以上功能,需要经过以下步骤:
  
  将 H.264 流转换为 cmsampleBuffer 显示 cmsampleBuffer 将 H.264 流转换为 cmsampleBuffer
  我们知道 cmsampleBuffer = CMTime + FormatDesc + CMBlockBuffer 。需要从H264码流中提取以上三个信息。最后组合成cmsampleBuffer,提供给硬解码接口进行解码。
  在H.264的语法中,有一个最基本的层叫做网络抽象层,简称NAL。H.264流数据由一系列NAL单元(NAL Unit,简称NAUL)组成。
  H264的码流由NALU单元组成,一个NALU可能收录:
  NALU 标头
  对于流数据,NAUL header 通常以 0x00 00 01 或 0x00 00 00 01 开头(两者都有可能,下面以 0x00 00 01 为例)。0x00 00 01 称为起始码。
  总结以上知识,我们知道H264码流是由NALU单元组成的,其中收录视频图像数据和H264参数信息。视频图像数据为CMBlockBuffer,可以将H264的参数信息组合成FormatDesc。具体的,参数信息包括SPS(Sequence Parameter Set)和PPS(Picture Parameter Set)。下图是一个H.264码流的结构:
  1)提取sps和pps生成FormatDesc
  2)提取视频图像数据生成CMBlockBuffer
  3)根据需要生成CMTime信息。(实际测试中,添加时间信息后,出现了不稳定的图像,但不添加时间信息就没有了,需要进一步研究,这里建议不要添加时间信息)
  根据上述获取CMVideoFormatDescriptionRef、CMBlockBufferRef和可选的时间信息,使用cmsampleBufferCreate接口获取要解码的原创数据为cmsampleBuffer数据。下图为H264数据转换示意图。
  显示 cmsampleBuffer
  有两种显示方式:
  1)通过系统提供的AVSampleBufferDisplayLayer解码显示
  用法与其他CALayer类似。该层内置硬件解码功能,直接将原创cmsampleBuffer的解码图像显示在屏幕上,非常简单方便。
  2) 用 OPenGL 本身渲染
  通过VTDecompression接口,将cmsampleBuffer解码成图像,并在UIImageView或OpenGL上显示图像。
  硬编码
  硬编码的使用也通过一个典型的应用场景来描述。首先通过摄像头获取采集图像,然后对采集接收到的图像进行硬编码,最后将编码后的数据组合成H264码流通过网络传播.
  以下是具体步骤的说明:
  相机采集数据
  Camera采集,iOS系统为采集相机图像数据提供AVCaptureSession。设置会话的 采集 分辨率。然后设置输入和输出。设置输出时,需要设置委托和输出队列。在委托方法中,处理 采集 好的图像。
  图像输出的格式是未编码的 cmsampleBuffer 形式。
  使用 VTCompressionSession 硬编码
  1)初始化VTCompressionSession
  VTCompressionSession初始化时,通常需要给出width宽度、高度长度、编码器类型kCMVideoCodecType_H264等。然后通过调用VTSessionSetProperty接口设置帧率等属性,demo中提供了一些设置参考。测试时发现几乎没有效果,可能需要进一步调试。最后,需要设置一个回调函数。视频图像编码成功后调用该回调。一切准备就绪后,使用 VTCompressionSessionCreate 创建会话
  2)提取相机采集的原创图像数据到VTCompressionSession进行硬编码
  相机 采集 之后的图像是未编码的 cmsampleBuffer 形式。给定的接口函数 cmsampleBufferGetImageBuffer 用于从中提取 CVPixelBufferRef,硬编码接口 VTCompressionSessionEncodeFrame 用于对帧进行硬编码。,编码成功后,会自动调用会话初始化时设置的回调函数。
  3)使用回调函数将编码成功的cmsampleBuffer转化为H264流,并通过网络传播
  基本上是硬解码的逆过程。解析出参数集SPS和PPS,加上起始代码,组装成NALU。提取视频数据,将长度码转换为起始码,组长为NALU。将 NALU 发送出去。
  下一篇文章我们将介绍H264硬编码和软编码的实现。
  参考
  教程:帝国cms在首页调用指定几个栏目的所有文章和用js实现分页的方法
  先说明一下我的问题:我的博客有两个主题,技术和生活,四栏是技术,四栏是生活。我想在首页调用所有文章的技术类,实现分页。
  首先,让我们调用指定列的所有文章。我不需要 php。我在群友的提示下重新阅读了智能标签。我可以使用智能标签。我只需要在''中写上指定列的ids即可,可以一起使用,也可以分开使用,例如:
  
[e:loop={'1,12,13,16',10000,0,0}]
[/e:loop]
  让我们谈谈分页。一开始,我给青姐看我以前调用技术类所有文章的代码,问她如何实现分页。她告诉我这个调用无法实现分页,所以我只好使用自定义列表。她的文章:,但是我在操作过程中提交自定义列表后是空白的,无法查看原因,而且我的主页是动态主页,我还加了反采集和放入index.php 原来是phpcms站的动态链接改成了404的代码,那么我的网站使用中青姐的方法有缺陷。
  先说一下如何使用js实现分页,js在墨鱼博客中找到,原地址: ,但是用了我的网站后出现乱码,解决方法很简单,新建一个文本文档并把代码复制过来,然后另存为,选择UTF-8进行编码,然后新建一个js把代码复制回乱码问题就解决了。
  具体使用方法是在你原来的ul中加上id="list",并写样式display:none,然后在原来的ul下再加一个ul,类名id="list2",这个ul是用来移植的上面隐藏ul,在新添加的ul下调用js,这里我改成index-page.js,我把原文前面调用的js改成page-function.js,整体代码如下:
  这个时候前台打电话是没有问题的,但是你发现风格乱了。据说id="list2"的ul是用来移植id="list"的ul的内容,id="list"的ul也是隐藏的。然后将原创 ul 的类名添加到 id="list2" 的 ul 中。
  然后说样式,样式都在class="ctrlPages"的span里面,分页按钮在a标签里面,大家f12慢慢写样式,我提供我写的:
  
  
/*分页*/
span.ctrlPages {
display: block;
width: 90%;
text-align: center;
line-height: 2.0;
margin: auto;
margin-bottom: 15px;
}
span.ctrlPages a {
border: solid 1px #C6C4C4;
padding: 2px 5px 2px 5px;
color: #333;
}
<p>
span.ctrlPages a.curPage {
background-color: #FD9D01;
padding: 3px 5px 3px 5px;
color: #fff;
border: none;
}</p>
  效果如下:
  我觉得当前页和页码提示没什么用,所以我把page-function.js中的相关代码删掉了,这个js中也修改了小样式。以下是修改后的效果
  我的js下载
  dgcms-index-page.rar
  02385c9a4d92a50047ade72c4ff49889.rar(1.44 KB)
  2019年9月29日补充:js实现分页存在缺陷,即一次加载所有列表信息。您可以通过查看源代码来了解这一点。如果您的主页没有使用缓存技术,建议加载或使用自定义您的列表。

技巧:用selenium+sqlmap套个轮子,我是按时间采的

采集交流优采云 发表了文章 • 0 个评论 • 50 次浏览 • 2022-11-10 14:23 • 来自相关话题

  技巧:用selenium+sqlmap套个轮子,我是按时间采的
  算法自动采集列表页,按时间采集内容。生成字段内容提取器,依次翻页回采。翻页消耗的空间和成本不小。有简易方案,但没有考虑性能,已废弃。自然用户点击才是反作弊的依据,
  这个算不算广告联盟?
  我们使用adobeflashserver的scriptapi封装了一个php,登录以后能检查url带的参数的相关性。
  htmlcookie和抓包
  网络广告识别。这个广告其实是cookie,跟硬件关系不大。不过既然要用php来检查,
  
  1,点击发起端向采集端发送数据包,数据包再被发送,将数据反回去2,检查发起的人是否是真的访问者,
  想采集但是程序不会的大可以找我我可以免费给你开发实现专业客户端采集php也行不只一种采集软件目前多款批量采集软件在线开发帮助有需要也可以私信我。
  用selenium+sqlmap套个轮子,
  我是按时间采的,
  我们现在也在测试用php采集。
  
  百度一下
  fast_request?greater?
  跟楼上一样,不过我是按时间采的,
  不仅是按时间还有按ip的。
  用不同时间的点击率来对比和分析
  我们也在用php,可以自己开发爬虫,做一个scrapy的爬虫,自动采集。另外可以使用到不同的算法,比如按url长度的。 查看全部

  技巧:用selenium+sqlmap套个轮子,我是按时间采的
  算法自动采集列表页,按时间采集内容。生成字段内容提取器,依次翻页回采。翻页消耗的空间和成本不小。有简易方案,但没有考虑性能,已废弃。自然用户点击才是反作弊的依据,
  这个算不算广告联盟?
  我们使用adobeflashserver的scriptapi封装了一个php,登录以后能检查url带的参数的相关性。
  htmlcookie和抓包
  网络广告识别。这个广告其实是cookie,跟硬件关系不大。不过既然要用php来检查,
  
  1,点击发起端向采集端发送数据包,数据包再被发送,将数据反回去2,检查发起的人是否是真的访问者,
  想采集但是程序不会的大可以找我我可以免费给你开发实现专业客户端采集php也行不只一种采集软件目前多款批量采集软件在线开发帮助有需要也可以私信我。
  用selenium+sqlmap套个轮子,
  我是按时间采的,
  我们现在也在测试用php采集。
  
  百度一下
  fast_request?greater?
  跟楼上一样,不过我是按时间采的,
  不仅是按时间还有按ip的。
  用不同时间的点击率来对比和分析
  我们也在用php,可以自己开发爬虫,做一个scrapy的爬虫,自动采集。另外可以使用到不同的算法,比如按url长度的。

总结:收藏 | 机器学习数据集汇总收集

采集交流优采云 发表了文章 • 0 个评论 • 160 次浏览 • 2022-11-08 16:34 • 来自相关话题

  总结:收藏 | 机器学习数据集汇总收集
  转载于:机器学习算法与 Python 实战
  大学公共数据集
  (斯坦福)69G 大型无人机(校园)图像数据集【斯坦福】
  人脸素描数据集 [中大]
  自然语言推理(文本蕴涵标签)数据集 [NYU]
  伯克利图像分割数据集 BSDS500 [伯克利]
  宠物图像(分割)数据集 [牛津]
  ~vgg/数据/宠物/
  发布ADE20K场景感知/解析/分割/多目标识别数据集[MIT]
  多模式二元行为数据集 [GaTech]
  计算机视觉/图像/视频数据集
  Fashion-MNIST风格服装图像数据集【小涵】
  大型(500,000)LOGO数据集
  4D 扫描(60fps 移动非刚性物体 3D 扫描)数据集 [D-FAUST]
  Counting MNIST,基于 MNIST 的视觉计数合成数据集
  YouTube MV 视频数据集 [Keunwoo Choi]
  大量计算机视觉合成数据集/工具 [unrealcv]
  动物属性标签数据集 [ChristophH. Lampert/Daniel Pucher/JohannesDostal]
  漫画数据集 Manga109
  架空舞蹈视频数据集
  Pixiv(着色)图像数据集 [Jerry Li]
  e-VDS 视频数据集
  #下载
  快,画!简单的笔画涂鸦数据集
  简单的笔画涂鸦数据集[hardmaru]
  Clothing Portrait Generation Model (&amp;Chictopia10K [HumanParsing] Fashion Portrait Analysis Dataset) [Christoph Lassner/Gerard Pons-Moll/Peter V. Gehler]
  COCO 像素级标注数据集
  大规模街道级图像(分割)数据集 [Peter Kontschieder]
  大规模日本图像描述数据集
  Cityscapes 街景语义分割数据集(50 个城市,30 个类别,5k 精细标签,20k 厚标签图像和带标签的视频)
  (街头)时尚服装数据集(2000 多张带注释的图像)
  PyTorch [BodoKaiser] 实现的 VOC2012 数据集的逐像素目标分割
  200 亿个神经元对象复杂运动和交互视频数据集 [Nikita Johnson]
  
  文本/评估/问答/自然语言数据集
  (200,000) 个英语笑话数据集 [TaivoPungas]
  机器学习保险行业问答开放数据集 [HainWang]
  保险业问答 (QA) 数据集 [Minwei Feng]
  斯坦福 NLP 发布新的多轮、跨领域、面向任务的对话数据集 [Mihail Eric]
  实体/名词语义关系标签数据集 [David S. Batista]
  NLVR:自然语言基础数据集(对象分组、数量、比较和空间关系推理)
  28,000文章/100,000题大规模(英语测试)阅读理解数据集
  拼写错误的数据集
  〜罗杰/corpora.html
  文本缩减数据集
  ~dkauchak/简化/
  英文单词/句子/语义框架标注数据集FrameNet
  (另一个) 自然语言处理 (NLP) 数据集列表 [Nicolas Iderhoff]
  用于跨语言/多样式/多粒度文本相似性检测的数据集
  Quora 数据集:400,000 行潜在的重复问题
  文本分类数据集
  框架:Maluuba 对话数据集
  跨域(亚马逊产品评论)情感数据集
  ~mdredze/数据集/sentiment/
  语义 Web 机器学习系统评估/基准数据集采集
  其他数据集
  数据科学/机器学习数据集摘要
  CORe50:连续对象识别数据集 [Vincenzo Lomonaco &amp; Davide Maltoni]
  (Matlab) 自动发现数据集的统计分布 [Isabel Valera]
  (建筑)损害评估数据集 [海啸]
  IndieWeb 社交图数据集 [IndieWeb]
  DeepMind 开源环境/数据集/代码合集【DeepMind】
  鸟叫数据集 [xeno-canto]
  Wolfram 数据集存储库
  大规模音乐分析数据集 FMA
  (300 万) Instacart 在线杂货购物数据集 [Jeremy Stanley]
  用于欺诈检测的合成金融数据集 [TESTIMON]
  NSynth:一个大规模的高质量音符标记音频数据集
  
  LIBSVM 格式分类/回归/多标签/字符串数据集
  ~cjlin/libsvmtools/datasets/binary.html
  笔记本电脑使用逻辑回归拟合 100G 数据集 [DmitriySelivanov]
  StackExchange 近似/重复问题数据集
  2010-2017最全的KDD CUP试题及数据集
  食谱数据集:超过 20,000 个带有评级、营养和类别信息的食谱 [HugoDarwood]
  奥斯卡数据集【电影艺术与科学学院】
  计算医学库:大型医学数据集的 (TensorFlow) 分析和机器学习建模 [AkshayBhat]
  聚类数据集
  官方开放气候数据集
  全球恐怖袭击数据集【START联盟】
  七个机器学习时间序列数据集
  大规模众包关系数据库自然语言查询语义解析数据集(80,000+查询样本)
  赛马赔率数据集
  新的 YELP 数据集:收录 470 万条评论和 156,000 个商家
  JMIR 数据集特刊“JMIR 数据”
  日本木刻版画文字识别数据集
  多模式二元行为数据集
  机器学习论文/数据集/工具集(日语)
  机器学习公司的十大数据采集策略
  NLP 数据集加载工具集
  日语相似词数据集
  大规模以人为本的完形填空(多项选择阅读理解)数据集
  高质量免费数据集列表
  “数据之美”自然语言数据集/代码
  微软数据集MS MARCO,阅读理解领域的“ImageNet”
  AI2科学问答数据集(多选)
  常用图像数据集
  (分类、跟踪、分割、检测等)
  搜狗实验室数据集:
  互联网图片库来自搜狗图片搜索索引的部分数据。共有 2,836,535 张图片,类别包括人物、动物、建筑、机械、风景和运动。对于每张图片,原创图片、缩略图、图片所在的网页以及网页中的相关文本都在数据集中给出。超过200G
  IMAGECLEF 致力于为图像相关领域(检索、分类、注释等)提供基准跨语言评估论坛(CLEF)。该比赛自2003年起每年举办一次。
  ~xirong/index.php?n=Main.Dataset
  专业知识:seo专家:八个工具助您的外贸网站快速排名
  八款工具助你外贸网站快速排名
  做外贸网站,没有好的SEO策划,很难在激烈的竞争中脱颖而出。一个好的网站SEO需要分析网站本身,什么是外贸,以及竞争对手的网站。SEO分析对于外贸新手网站或者SEO不好的网站尤为重要。本文精选了 8 个 SEO 工具,可以帮助您发现 SEO网站 的问题。同时还可以分析竞争对手的关键词选型、链式、链式设计,然后用在自己的外贸网站中,推广SEO的隐藏东西。
  1. SEMrush
  SEMrush 可以称为一个综合性的 SEO 工具,SEO 初学者和专家都可以通过 SEMrush 流程获得帮助。什么是外贸,从竞争对手分析和展示到关键词研究、广告策略分析、逆向检查、关键词难度、品牌展示等。你甚至可以用它来发现新的竞争对手,观察行业变化帮助您连接和领导的领域。
  SEMrush 从 Google 和 Bing 中提取大量 SEO 数据,让您能够以难以置信的细节探索 关键词。什么是外贸,以便捷的方式提供所有这些数据,并进行全面的现场审核和持续跟踪。如果您只为您的专业博客业务使用一种工具,那么设置 SEMrush 是一个不错的选择。
  2. 最佳搜索引擎优化
  
  Yoast SEO 是一个 WordPress SEO 插件。这是市场上最好的 SEO 插件之一。从主页面到文章页面,从存档页面到标签页,都提供了详细的设置。可以说,Yoast SEO对SEO设计的每一页的规划都是很小的。如可读性分析、关键词、meta关键词、关键词网页内容结构、图片分析、内外链接分析、标题和描述分析、链接地址分析等。
  Yoast SEO 可能是您可以用来改善博客 SEO 的最佳整体工具。
  3.Moz工具
  Moz 工具可用于链接构建和分析、Web 功能、关键词sink 研究、网站 拥抱、列表查看等。什么是外贸是互联网上最大最准确的SEO关键词数据库之一。在几秒钟内,专业博主可以使用它在 网站 上找到 关键词 并确定其优先级。没有用于分析或统计过滤的复杂图表,SEO 建议简单直观。
  Moz 提供了许多可供博主用来推广 SEO 的工具。这个大扇区是免费的,几乎没有限制。
  4. BuzzSumo
  
  BuzzSumo 是一个智能工具。哪些外贸可以帮助您进一步提高您的SEO工作。BuzzSumo 无需绞尽脑汁根据关键词汇寻找可操作的主题,而是让您在社交媒体上找到高度共享的内容并围绕该内容定制您的工作。
  在快速搜索中,您可以在 Facebook、Twitter、Pinterest、Reddit 上查看 关键词,包括订阅、反向链接、总份额。
  5. 隔壁
  强大的 SEO 集成,从 关键词 研究到链接分析,无所不能。Serpstat 提供范围广泛的 SEO 工具,几乎每个人都会在城市中找到方便的工具,包括长尾 关键词 研究、每次点击成本分析、PPC 竞争洞察、搜索量分析。
  因此,您可以使用 Serpstat 做的最有用的事情是对您的站点进行全面审核。什么是外贸,包括反向链接和 Serpstat 本身,是完全自动的。
  天蜘蛛网专注于SEO培训,大量学员受益。 查看全部

  总结:收藏 | 机器学习数据集汇总收集
  转载于:机器学习算法与 Python 实战
  大学公共数据集
  (斯坦福)69G 大型无人机(校园)图像数据集【斯坦福】
  人脸素描数据集 [中大]
  自然语言推理(文本蕴涵标签)数据集 [NYU]
  伯克利图像分割数据集 BSDS500 [伯克利]
  宠物图像(分割)数据集 [牛津]
  ~vgg/数据/宠物/
  发布ADE20K场景感知/解析/分割/多目标识别数据集[MIT]
  多模式二元行为数据集 [GaTech]
  计算机视觉/图像/视频数据集
  Fashion-MNIST风格服装图像数据集【小涵】
  大型(500,000)LOGO数据集
  4D 扫描(60fps 移动非刚性物体 3D 扫描)数据集 [D-FAUST]
  Counting MNIST,基于 MNIST 的视觉计数合成数据集
  YouTube MV 视频数据集 [Keunwoo Choi]
  大量计算机视觉合成数据集/工具 [unrealcv]
  动物属性标签数据集 [ChristophH. Lampert/Daniel Pucher/JohannesDostal]
  漫画数据集 Manga109
  架空舞蹈视频数据集
  Pixiv(着色)图像数据集 [Jerry Li]
  e-VDS 视频数据集
  #下载
  快,画!简单的笔画涂鸦数据集
  简单的笔画涂鸦数据集[hardmaru]
  Clothing Portrait Generation Model (&amp;Chictopia10K [HumanParsing] Fashion Portrait Analysis Dataset) [Christoph Lassner/Gerard Pons-Moll/Peter V. Gehler]
  COCO 像素级标注数据集
  大规模街道级图像(分割)数据集 [Peter Kontschieder]
  大规模日本图像描述数据集
  Cityscapes 街景语义分割数据集(50 个城市,30 个类别,5k 精细标签,20k 厚标签图像和带标签的视频)
  (街头)时尚服装数据集(2000 多张带注释的图像)
  PyTorch [BodoKaiser] 实现的 VOC2012 数据集的逐像素目标分割
  200 亿个神经元对象复杂运动和交互视频数据集 [Nikita Johnson]
  
  文本/评估/问答/自然语言数据集
  (200,000) 个英语笑话数据集 [TaivoPungas]
  机器学习保险行业问答开放数据集 [HainWang]
  保险业问答 (QA) 数据集 [Minwei Feng]
  斯坦福 NLP 发布新的多轮、跨领域、面向任务的对话数据集 [Mihail Eric]
  实体/名词语义关系标签数据集 [David S. Batista]
  NLVR:自然语言基础数据集(对象分组、数量、比较和空间关系推理)
  28,000文章/100,000题大规模(英语测试)阅读理解数据集
  拼写错误的数据集
  〜罗杰/corpora.html
  文本缩减数据集
  ~dkauchak/简化/
  英文单词/句子/语义框架标注数据集FrameNet
  (另一个) 自然语言处理 (NLP) 数据集列表 [Nicolas Iderhoff]
  用于跨语言/多样式/多粒度文本相似性检测的数据集
  Quora 数据集:400,000 行潜在的重复问题
  文本分类数据集
  框架:Maluuba 对话数据集
  跨域(亚马逊产品评论)情感数据集
  ~mdredze/数据集/sentiment/
  语义 Web 机器学习系统评估/基准数据集采集
  其他数据集
  数据科学/机器学习数据集摘要
  CORe50:连续对象识别数据集 [Vincenzo Lomonaco &amp; Davide Maltoni]
  (Matlab) 自动发现数据集的统计分布 [Isabel Valera]
  (建筑)损害评估数据集 [海啸]
  IndieWeb 社交图数据集 [IndieWeb]
  DeepMind 开源环境/数据集/代码合集【DeepMind】
  鸟叫数据集 [xeno-canto]
  Wolfram 数据集存储库
  大规模音乐分析数据集 FMA
  (300 万) Instacart 在线杂货购物数据集 [Jeremy Stanley]
  用于欺诈检测的合成金融数据集 [TESTIMON]
  NSynth:一个大规模的高质量音符标记音频数据集
  
  LIBSVM 格式分类/回归/多标签/字符串数据集
  ~cjlin/libsvmtools/datasets/binary.html
  笔记本电脑使用逻辑回归拟合 100G 数据集 [DmitriySelivanov]
  StackExchange 近似/重复问题数据集
  2010-2017最全的KDD CUP试题及数据集
  食谱数据集:超过 20,000 个带有评级、营养和类别信息的食谱 [HugoDarwood]
  奥斯卡数据集【电影艺术与科学学院】
  计算医学库:大型医学数据集的 (TensorFlow) 分析和机器学习建模 [AkshayBhat]
  聚类数据集
  官方开放气候数据集
  全球恐怖袭击数据集【START联盟】
  七个机器学习时间序列数据集
  大规模众包关系数据库自然语言查询语义解析数据集(80,000+查询样本)
  赛马赔率数据集
  新的 YELP 数据集:收录 470 万条评论和 156,000 个商家
  JMIR 数据集特刊“JMIR 数据”
  日本木刻版画文字识别数据集
  多模式二元行为数据集
  机器学习论文/数据集/工具集(日语)
  机器学习公司的十大数据采集策略
  NLP 数据集加载工具集
  日语相似词数据集
  大规模以人为本的完形填空(多项选择阅读理解)数据集
  高质量免费数据集列表
  “数据之美”自然语言数据集/代码
  微软数据集MS MARCO,阅读理解领域的“ImageNet”
  AI2科学问答数据集(多选)
  常用图像数据集
  (分类、跟踪、分割、检测等)
  搜狗实验室数据集:
  互联网图片库来自搜狗图片搜索索引的部分数据。共有 2,836,535 张图片,类别包括人物、动物、建筑、机械、风景和运动。对于每张图片,原创图片、缩略图、图片所在的网页以及网页中的相关文本都在数据集中给出。超过200G
  IMAGECLEF 致力于为图像相关领域(检索、分类、注释等)提供基准跨语言评估论坛(CLEF)。该比赛自2003年起每年举办一次。
  ~xirong/index.php?n=Main.Dataset
  专业知识:seo专家:八个工具助您的外贸网站快速排名
  八款工具助你外贸网站快速排名
  做外贸网站,没有好的SEO策划,很难在激烈的竞争中脱颖而出。一个好的网站SEO需要分析网站本身,什么是外贸,以及竞争对手的网站。SEO分析对于外贸新手网站或者SEO不好的网站尤为重要。本文精选了 8 个 SEO 工具,可以帮助您发现 SEO网站 的问题。同时还可以分析竞争对手的关键词选型、链式、链式设计,然后用在自己的外贸网站中,推广SEO的隐藏东西。
  1. SEMrush
  SEMrush 可以称为一个综合性的 SEO 工具,SEO 初学者和专家都可以通过 SEMrush 流程获得帮助。什么是外贸,从竞争对手分析和展示到关键词研究、广告策略分析、逆向检查、关键词难度、品牌展示等。你甚至可以用它来发现新的竞争对手,观察行业变化帮助您连接和领导的领域。
  SEMrush 从 Google 和 Bing 中提取大量 SEO 数据,让您能够以难以置信的细节探索 关键词。什么是外贸,以便捷的方式提供所有这些数据,并进行全面的现场审核和持续跟踪。如果您只为您的专业博客业务使用一种工具,那么设置 SEMrush 是一个不错的选择。
  2. 最佳搜索引擎优化
  
  Yoast SEO 是一个 WordPress SEO 插件。这是市场上最好的 SEO 插件之一。从主页面到文章页面,从存档页面到标签页,都提供了详细的设置。可以说,Yoast SEO对SEO设计的每一页的规划都是很小的。如可读性分析、关键词、meta关键词、关键词网页内容结构、图片分析、内外链接分析、标题和描述分析、链接地址分析等。
  Yoast SEO 可能是您可以用来改善博客 SEO 的最佳整体工具。
  3.Moz工具
  Moz 工具可用于链接构建和分析、Web 功能、关键词sink 研究、网站 拥抱、列表查看等。什么是外贸是互联网上最大最准确的SEO关键词数据库之一。在几秒钟内,专业博主可以使用它在 网站 上找到 关键词 并确定其优先级。没有用于分析或统计过滤的复杂图表,SEO 建议简单直观。
  Moz 提供了许多可供博主用来推广 SEO 的工具。这个大扇区是免费的,几乎没有限制。
  4. BuzzSumo
  
  BuzzSumo 是一个智能工具。哪些外贸可以帮助您进一步提高您的SEO工作。BuzzSumo 无需绞尽脑汁根据关键词汇寻找可操作的主题,而是让您在社交媒体上找到高度共享的内容并围绕该内容定制您的工作。
  在快速搜索中,您可以在 Facebook、Twitter、Pinterest、Reddit 上查看 关键词,包括订阅、反向链接、总份额。
  5. 隔壁
  强大的 SEO 集成,从 关键词 研究到链接分析,无所不能。Serpstat 提供范围广泛的 SEO 工具,几乎每个人都会在城市中找到方便的工具,包括长尾 关键词 研究、每次点击成本分析、PPC 竞争洞察、搜索量分析。
  因此,您可以使用 Serpstat 做的最有用的事情是对您的站点进行全面审核。什么是外贸,包括反向链接和 Serpstat 本身,是完全自动的。
  天蜘蛛网专注于SEO培训,大量学员受益。

汇总:Java算法自动采集列表页内容怎么用?

采集交流优采云 发表了文章 • 0 个评论 • 93 次浏览 • 2022-11-06 08:26 • 来自相关话题

  汇总:Java算法自动采集列表页内容怎么用?
  算法自动采集列表页内容这种做法适合采集静态页面,静态页面容易被转载,使用这种方法非常合适,首先先下载美化模板,再在网页上编辑,编辑方法可看:(request页),成功后,点击loadpng,自动将美化模板美化为静态页面,再次点击loadpng,再生成一个静态页面(不要点击js),就可以通过ua来做身份验证,点击ua生成一个密码,记住,使用https,记住,同时登录自己的账号和密码,loadpng要返回回文,在ua/https状态下即可。
  工欲善其事必先利其器,尤其是技术开发人员,在使用开发工具技术的过程中,
  
  1、多行字段,采用java开发时,繁琐,
  2、每次启动都要调用程序,传参数,字段值传参,
  3、数据对接需要等待好几秒,而且费时间,数据未必准确,
  
  4、报错麻烦,等待一分钟,都是日常工作;总之,会遇到很多技术问题,需要在配置中进行修改,所以很多人都不敢轻易尝试;但是,如果遇到java代码中的坑,则解决起来只需要简单几步;记得上大学的时候,老师讲过一个故事:一个大学生做生意,客户一般有100个,通过qq找了10个客户,分别取对应的联系方式,然后邮件发过去,客户回复,要做什么,你再发一遍。
  如果找到对方,最好,1次性能招10个学生,先打一波僵尸,自己发动去赚钱,发现订单不多,也招不到学生,走人,大学生自己接着赚;等真正开业了,一次性招够100个人,这时你才能赚10万块钱,为什么?这10万块钱,才是你的真金白银,而不是发几封邮件,招10个学生,来打个僵尸。
  说这个故事的意思是,当你遇到困难的时候,你需要多方协作,你不需要看到他人的失败就傻乎乎立马改变方向,困难肯定是有的,项目经理,产品经理,开发人员,测试人员,市场,老板等,除了老板跟你讲,产品策略,市场定位,产品功能等,其他人都不知道你项目哪里有问题,技术也不清楚你做的究竟是个什么产品,也不知道你对技术的需求是什么,他们顶多用上级的要求,展开你项目中,能用就行了,那么这个项目,你是顶多承担80%的任务,尽量降低到40%,是一个非常合理的比例;你遇到问题,没人帮你,先想着说服老板,说服市场,别自己自己打自己;而对于自己的技术的技术栈的掌握,一定要扎实;团队的技术落地,可以看以下方面;。
  1、对接流程各种问题(功能页面,数据库,性能,兼容性等),这里面有个重要人物就是程序员,你在跟他沟通的时候,他也在和你沟通的,切记不要嫌麻烦,对接环节,老板,需求方, 查看全部

  汇总:Java算法自动采集列表页内容怎么用?
  算法自动采集列表页内容这种做法适合采集静态页面,静态页面容易被转载,使用这种方法非常合适,首先先下载美化模板,再在网页上编辑,编辑方法可看:(request页),成功后,点击loadpng,自动将美化模板美化为静态页面,再次点击loadpng,再生成一个静态页面(不要点击js),就可以通过ua来做身份验证,点击ua生成一个密码,记住,使用https,记住,同时登录自己的账号和密码,loadpng要返回回文,在ua/https状态下即可。
  工欲善其事必先利其器,尤其是技术开发人员,在使用开发工具技术的过程中,
  
  1、多行字段,采用java开发时,繁琐,
  2、每次启动都要调用程序,传参数,字段值传参,
  3、数据对接需要等待好几秒,而且费时间,数据未必准确,
  
  4、报错麻烦,等待一分钟,都是日常工作;总之,会遇到很多技术问题,需要在配置中进行修改,所以很多人都不敢轻易尝试;但是,如果遇到java代码中的坑,则解决起来只需要简单几步;记得上大学的时候,老师讲过一个故事:一个大学生做生意,客户一般有100个,通过qq找了10个客户,分别取对应的联系方式,然后邮件发过去,客户回复,要做什么,你再发一遍。
  如果找到对方,最好,1次性能招10个学生,先打一波僵尸,自己发动去赚钱,发现订单不多,也招不到学生,走人,大学生自己接着赚;等真正开业了,一次性招够100个人,这时你才能赚10万块钱,为什么?这10万块钱,才是你的真金白银,而不是发几封邮件,招10个学生,来打个僵尸。
  说这个故事的意思是,当你遇到困难的时候,你需要多方协作,你不需要看到他人的失败就傻乎乎立马改变方向,困难肯定是有的,项目经理,产品经理,开发人员,测试人员,市场,老板等,除了老板跟你讲,产品策略,市场定位,产品功能等,其他人都不知道你项目哪里有问题,技术也不清楚你做的究竟是个什么产品,也不知道你对技术的需求是什么,他们顶多用上级的要求,展开你项目中,能用就行了,那么这个项目,你是顶多承担80%的任务,尽量降低到40%,是一个非常合理的比例;你遇到问题,没人帮你,先想着说服老板,说服市场,别自己自己打自己;而对于自己的技术的技术栈的掌握,一定要扎实;团队的技术落地,可以看以下方面;。
  1、对接流程各种问题(功能页面,数据库,性能,兼容性等),这里面有个重要人物就是程序员,你在跟他沟通的时候,他也在和你沟通的,切记不要嫌麻烦,对接环节,老板,需求方,

官方客服QQ群

微信人工客服

QQ人工客服


线