数据峰会

Github 常用社交用语
有人说过,优秀的程序员是懒惰的,他们总是找到一件事情中的规律,然后用最简单的方式解决它;在平时的交流中更是如此,所以很多人认为他们很难交流。
那么你是否注意到在 Github 的 issues 和 PR 中经查出现一些缩写吗?这里,我们就收集一些在社区交流中经查用到的一些缩写,有的在配合CI/CD 的工具下,已经实现了丰富的功能,一些则经常用在平时的交流中。我们简单的将常用的,和一些高级玩家用的分开来,让我们使用一些常用的缩略语以提高交流效率,避免的使用一些低频率缩略语,为别人减少一些疑惑。常见缩略语PR PR Pull Request.
这是 Github 中的一个常用功能,合并拉取请求,用以发起将自己的分支合并到主干分支的请求,请求对方将你的代码 Merge 到他的主干分支。GitLab 中对应的是 merge_requests,都是当前贡献代码的主要手段。Github 中有关于 Pull Request 有一个详细的说明,刚兴趣的话可以仔细研读下:about-pull-requestsWIP WIP Work in progress, do not merge yet.
出现在 PR 的标题中,用于提示审核人,进行中暂时不要合并;Github 和 GitLab 均以对此缩略语提供了自动化支持,在标题中出现时,将禁用合并按钮。在开源项目中,如果计划贡献代码,请在开始时,就准备一个 PR,并贴上你的计划和目的描述,在标题开头标注 WIP: 以同步给与你有同样想法的人,避免重复的工作。LGTM/SGTM LGTM Looks good to me.
SGTM Sounds Good To Me.
通常出现在 PR 的评论里,表示对提交者的赞许,鼓励他更多的参与贡献。正如语气 在我看来很好 所以大多是审核者或者项目所有者对贡献者的鼓励,请在评论别人的 PR 时斟酌一二。CC CC Carbon copy
CC 可能是来自邮件沟通中的缩略语,表示抄送的意思,希望某人也能收到,了解相关信息,通过 cc 后续的 @ At 出对应的成员,他可以再自己的通知中收到相关信息,并知晓有消息抄送给他。实例: cc @dingdayu 这里的消息看一下其他缩略语下面所列也是常见缩略语,但受于篇幅和时间,将不对其做更多的着墨,相信大家根据注释都能有所体会,有兴趣的话,可以在社区多多尝试一下。TL;DR Too Long; Didn't Read. // 太长懒得看。也有很多文档在做简略描述之前会写这么一句
PTAL Please take a look. // 帮我看下,一般都是请别人 review 自己的 PR
DNM Do not merge. //不要合并
CL Changelist. // 修改的文件
CS Changeset. // 和CL 类似
ACK acknowledgement. // 我确认了或者我接受了,我承认了
RFC request for comments. // 我觉得这个想法很好, 我们来一起讨论下
IIRC if I recall correctly. // 如果我没记错
NACK/NAK negative acknowledgement. // 我不同意
TBR To Be Reviewed. // 提示维护者进行 review
TBD To Be Done(or Defined/Discussed/Decided/Determined). // 根据语境不同意义有所区别,但一般都是还没搞定的意思
IMO In My Opinion. //在我看来、依我看、依我所见
IMHO In My Humble Opinion IMO. //谦虚的说法,以我的拙见(多用于邮件和网络)
AFAIK/AFAICT As Far As I Know / Can Tell. //据我所知
FYI For your information. //供你参考
AFK Away From the Keyboard. //稍后回来
IANAL I am not a lawyer, but I smell licensing issues. // 我不是律师,但是我闻到了许可问题不推荐的用法这里的不推荐只是作者本人认为有更好的方式表达,且操作存在相关争议,建议大家不要这样使用,并不代表官方说法,请仅供参考。 LGT1 Looks Good To 1. //如果有一个回复 LGTM 则可以添加为 LGT1,1 代表目前有 1 个赞
LGT2 Looks Good To 2. //如果有两个回复 LGTM 则可以添加为 LGT2,2 代表目前有 2 个赞
建议使用 GitLab 和 Github 中提供的 enjoy 表情的功能,表达你的观点。其中 Github 上在评论(issues,PR均可)的右上角提供一个 表情图案(Pick your reaction),提供了几个预选表情,你可以选择你的观点,也可以再评论的下方,别人的观点中进行+1等操作。GitLab 则在响应的位置提供了 ?/? 或添加新的观点的功能。

docker部署Discuz论坛
环境准备:ip服务192.168.2.10(server1)docker、k8s192.168.2.20(server2)docker、k8s192.168.2.30(server3)docker、k8sk8s集群如何搭建如果是刚开机的k8s集群的主机开机后启动服务(集群还是ready)代码语言:javascript复制[root@server1 ~]# systemctl enable kubelet.service systemctl start kubelet.service
[root@server1 ~]# systemctl stop firewalld systemctl start docker.service开始我把防火墙都关了不然端口太多代码语言:javascript复制systemctl stop firewalldserver1:pull所需要的mysql镜像代码语言:javascript复制[root@server1 ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
8559a31e96f4: Pull complete
d51ce1c2e575: Pull complete
c2344adc4858: Pull complete
fcf3ceff18fc: Pull complete
16da0c38dc5b: Pull complete
b905d1797e97: Pull complete
4b50d1c6b05c: Pull complete
d85174a87144: Pull complete
a4ad33703fa8: Pull complete
f7a5433ce20d: Pull complete
3dcd2a278b4a: Pull complete
Digest: sha256:32f9d9a069f7a735e28fd44ea944d53c61f990ba71460c5c183e610854ca4854
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7server1:pull所需要的nginx和php的整合镜像代码语言:javascript复制[root@server1 ~]# docker pull richarvey/nginx-php-fpm
Using default tag: latest
latest: Pulling from richarvey/nginx-php-fpm
aad63a933944: Pulling fs layer
b61c449d5d91: Pulling fs layer
3fde16e1397a: Pulling fs layer
b1096698ab2a: Pulling fs layer
96de990b7ad3: Pulling fs layer
c280bfe25221: Pulling fs layer
02be9679a029: Pulling fs layer
01973f657634: Pulling fs layer
75924d0578e0: Pulling fs layer
7545938f30ed: Pull complete
267be130ac8a: Pull complete
5b9ce6473ee0: Pull complete
0cb267b5005b: Pull complete
0bbcede612f0: Pull complete
6f23dfb3d18c: Pull complete
363732275cc7: Pull complete
679aa7f9f360: Pull complete
d47507c4f094: Pull complete
17ba4fac2074: Pull complete
b16f52630a15: Pull complete
e8c7df728273: Pull complete
3b3bc6c69299: Pull complete
d0f1d1b1ad30: Pull complete
b8af2e53bd85: Pull complete
7e439df1bb98: Pull complete
f28361c951da: Pull complete
126a49c3e514: Pull complete
39838375a23b: Pull complete
1ca506cbf594: Pull complete
Digest: sha256:8b7c47b940fd79b5764ec12fdfbc7a1a198889316347963c9e9bd1aa78eec098
Status: Downloaded newer image for richarvey/nginx-php-fpm:latest
docker.io/richarvey/nginx-php-fpm:latestNFSserver2下载nfs代码语言:javascript复制[root@server1 ~]# yum -y install nfs-utils
[root@server2 ~]# mkdir -p /data/k8s/{web,db}
[root@server2 ~]# vim /etc/exports
[root@server2 ~]# cat /etc/exports
/data/k8s 192.168.2.0/24(rw,sync,no_root_squash)
[root@server2 ~]# exportfs -rv
exporting 192.168.2.0/24:/data/k8s
[root@server2 ~]# systemctl start nfs
[root@server2 ~]# systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.server1:代码语言:javascript复制[root@server1 ~]# mkdir -p /home/k8s/lnmp/mysql
[root@server1 ~]# cd /home/k8s/lnmp/mysql
[root@server1 mysql]# kubectl create secret generic mysql-pass --from-literal=password=123.com
secret/mysql-pass created
[root@server1 mysql]# vim mysql-pv.yml
#内容:
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
path: /data/k8s/db
server: 192.168.2.20
[root@server1 mysql]# kubectl apply -f mysql-pv.yml
persistentvolume/mysql-pv created
[root@server1 mysql]# vim mysql-pvc.yml
#内容:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-claim
labels:
app: discuz
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
[root@server1 mysql]# kubectl apply -f mysql-pvc.yml
persistentvolumeclaim/mysql-claim created
[root@server1 mysql]# vim mysql-dp.yml
#内容:
apiVersion: apps/v1
kind: Deployment
metadata:
name: dz-mysql
labels:
app: discuz
spec:
selector:
matchLabels:
app: discuz
tier: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: discuz
tier: mysql
spec:
imagePullSecrets:
- name: my-secret
containers:
- image: mysql:5.7
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 3306
name: dz-mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-claim
[root@server1 mysql]# kubectl apply -f mysql-dp.yml
deployment.apps/dz-mysql created
[root@server1 mysql]# vim mysql-svc.yml
#内容:
apiVersion: v1
kind: Service
metadata:
name: dz-mysql
labels:
app: discuz
spec:
ports:
- port: 3306
selector:
app: discuz
tier: mysql
[root@server1 mysql]# kubectl apply -f mysql-svc.yml
service/dz-mysql created
[root@server1 mysql]# kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/mysql-pv 10Gi RWX Retain Bound default/mysql-claim 17m
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/mysql-claim Bound mysql-pv 10Gi RWX 8m6s
[root@server1 mysql]# vim web-pv.yml
#内容:
apiVersion: v1
kind: PersistentVolume
metadata:
name: web-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
path: /data/k8s/web
server: 192.168.2.20
[root@server1 mysql]# kubectl apply -f web-pv.yml
persistentvolume/web-pv created
[root@server1 mysql]# vim web-pvc.yml
#内容:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: web-claim
labels:
app: discuz
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
[root@server1 mysql]# kubectl apply -f web-pvc.yml
persistentvolumeclaim/web-claim created
[root@server1 mysql]# vim web-dp.yml
#内容:
apiVersion: apps/v1
kind: Deployment
metadata:
name: dz-web
labels:
app: discuz
spec:
replicas: 1
selector:
matchLabels:
app: discuz
tier: nginx-php
template:
metadata:
labels:
app: discuz
tier: nginx-php
spec:
imagePullSecrets:
- name: my-secret
containers:
- image: richarvey/nginx-php-fpm
name: dz-web
ports:
- containerPort: 9000
- containerPort: 80
name: dz-web
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/www/html
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: web-claim
[root@server1 mysql]# kubectl apply -f web-dp.yml
deployment.apps/dz-web created
[root@server1 mysql]# vim web-svc.yml
#内容:
apiVersion: v1
kind: Service
metadata:
name: dz-web
labels:
app: discuz
spec:
type: NodePort
ports:
- port: 80
nodePort: 30001
selector:
app: discuz
tier: nginx-php
[root@server1 mysql]# kubectl apply -f web-svc.yml
service/dz-web created
#如果下一步操作显示0/1别着急先往下做(等3-5分钟即可)
[root@server1 mysql]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
dz-mysql-5dcd86b5c8-qgqbm 1/1 Running 0 22m 10.244.1.24 server2 <none> <none>
dz-web-68959dc478-879qr 1/1 Running 0 6m43s 10.244.2.28 server3 <none> <none>
[root@server1 mysql]# kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/mysql-pv 10Gi RWX Retain Bound default/mysql-claim 33m
persistentvolume/web-pv 10Gi RWX Retain Bound default/web-claim 11m
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/mysql-claim Bound mysql-pv 10Gi RWX 23m
persistentvolumeclaim/web-claim Bound web-pv 10Gi RWX 5m22sserver2:代码语言:javascript复制[root@server2 data]# git clone https://gitee.com/ComsenzDiscuz/DiscuzX.git
[root@server2 data]# mv DiscuzX/upload/* k8s/web/
[root@server2 data]# ls
DiscuzX k8s
[root@server2 data]# cd k8s/web
[root@server2 web]# ls
admin.php data m source
api favicon.ico member.php static
api.php forum.php misc.php template
archiver group.php plugin.php uc_client
config home.php portal.php uc_server
connect.php index.php robots.txt
crossdomain.xml install search.php
[root@server2 web]# chmod -R 777 /data/k8s/web/server1:代码语言:javascript复制[root@server1 mysql]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
dz-mysql-5dcd86b5c8-qgqbm 1/1 Running 0 40m 10.244.1.24 server2 <none> <none>
dz-web-68959dc478-879qr 1/1 Running 0 24m 10.244.2.28 server3 <none> <none>
[root@server1 mysql]# kubectl exec -it dz-mysql-5dcd86b5c8-qgqbm -- mysql -uroot -p123.com
mysql> create database hy;
Query OK, 1 row affected (0.00 sec)
mysql> grant all on hy.* to 'hy'@'%' identified by '123.com';
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
mysql> exit
Bye验证:IP:30001
下面的步骤跟着走就行了!
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/101953.html原文链接:https://javaforall.cn

怎样增强 CLike 游戏的社交功能,促进玩家之间的互动和交流?
要增强CLike游戏的社交功能,以促进玩家之间的互动和交流,可以考虑以下几个方面: 添加聊天功能:在游戏中加入实时聊天功能,让玩家可以在游戏内互相交流。可以通过文本聊天或者语音聊天来实现。
社交平台集成:将CLike游戏与流行的社交媒体平台(如Facebook、Twitter等)进行集成,让玩家可以方便地与自己的朋友分享游戏进展、成就和战绩。
建立玩家社区:为CLike游戏创建一个在线玩家社区,让玩家可以在社区中创建个人资料、加入兴趣小组、发布帖子等,从而与其他玩家建立联系,并与他们交流和分享游戏经验。
多人合作和竞争模式:设计多人合作或竞争模式,让玩家可以与其他玩家共同完成任务或对抗。这样可以促进玩家之间的互动和合作,增加游戏的社交性。
社交活动和比赛:定期举办社交活动和比赛,例如公开赛、擂台赛等。这样可以吸引更多玩家参与,并通过竞争和合作来增强社交互动。
增加奖励系统:为玩家的社交互动和交流行为设计奖励机制,例如通过赠送虚拟货币、特殊道具或提供特殊权益等形式,鼓励玩家积极参与社交活动。
提供论坛和帮助中心:为CLike游戏建立一个官方论坛和帮助中心,让玩家可以在这里提问、回答问题、分享经验和交流。有专门的工作人员维护和回复社区的问题,以增加玩家之间的互动和帮助。
通过以上措施,可以增强CLike游戏的社交功能,促进玩家之间的互动和交流,提高游戏的社交性和玩家的参与度。

Redis实现社交粉丝功能
好友相关的功能至少包含关注 / 取关我(他)的关注我(他)的粉丝共同关注我关注的人也关注他这样的功能如果采用数据库,只是单纯得到用户的一些粉丝或者关注列表,也很简单、易实现,但若我想查出两个甚至多个用户共同关注人或想查询两个或者多个用户的共同粉丝,就会很麻烦,效率也不会很高。但如果用 redis 去做的话就会相当的简单且高效。因为 redis 自己本身带有专门针对于这种集合的交集、并集、差集的一些操作。
总体思路我们采用 MySQL + Redis 的方式结合完成。MySQL 保存落地数据Redis 的 Sets 进行集合操作数据表设计代码语言:javascript复制CREATE TABLE `t_follow` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`diner_id` int(11) NULL DEFAULT NULL COMMENT '用户外键' ,
`follow_diner_id` int(11) NULL DEFAULT NULL COMMENT '用户食客外键' ,
`is_valid` tinyint(1) NULL DEFAULT NULL ,
`create_date` datetime NULL DEFAULT NULL ,
`update_date` datetime NULL DEFAULT NULL ,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=6
ROW_FORMAT=COMPACT;创建代码模块 ms-follow代码语言:javascript复制<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
dependency>
<dependency>
<groupId>org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>com.battcngroupId>
<artifactId>swagger-spring-boot-starterartifactId>
dependency>
dependencies>配置文件代码语言:javascript复制server:
port: 8084 # 端口
spring:
application:
name: ms-follow # 应用名
# 数据库
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://127.0.0.1:3306/db_redis?serverTimezone=Asia/ShanghaicharacterEncoding=utf8useUnicode=trueuseSSL=false
# Redis
redis:
port: 6379
host: 192.168.10.101
timeout: 3000
password: 123456
database: 2
# Swagger
swagger:
base-package: com.javaedge.follow
title: 慕课美食社交食客API接口文档
# 配置 Eureka Server 注册中心
eureka:
instance:
prefer-ip-address: true
instance-id: ${spring.cloud.client.ip-address}:${server.port}
client:
service-url:
defaultZone: http://localhost:8080/eureka/
service:
name:
ms-oauth-server: http://ms-oauth2-server/
ms-diners-server: http://ms-diners/
mybatis:
configuration:
map-underscore-to-camel-case: true # 开启驼峰映射
logging:
pattern:
console: '%d{HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n'实体类代码语言:javascript复制@ApiModel(description = "食客关注实体类")
@Getter
@Setter
public class Follow extends BaseModel {
@ApiModelProperty("用户ID")
private int dinerId;
@ApiModelProperty("关注用户ID")
private Integer followDinerId;
}业务流程共同关注Sets 拥有去重 (我们不能多次关注同一用户) 功能 。一个用户我们存贮两个集合:一个是保存用户关注的人 另一个是保存关注用户的人。RedisKeyConstantfollowing(“following:”, “关注集合Key”),
followers(“followers:”, “粉丝集合Key”),

用JAVA的DEA算法衡量社交媒体页面的流行度
Measuring the Social Media Popularity of Pages with DEA in JAVA原文作者:Vasilis Vryniotis原文地址:http://blog.datumbox.com/measuring-the-social-media-popularity-of-pages-with-dea-in-java/译者微博:@从流域到海域译者博客:blog.csdn.net/solo95用JAVA的DEA算法衡量社交媒体页面的流行度在前面的文章中,我们讨论了数据包络分析(Data Envelopment Analysis)技术,我们已经看到它如何被用作一个有效的非参数排序算法。在这篇博文中,我们将开发出一个JAVA数据包络分析的实例,我们将用它来评估网络上的网页和文章的社交媒体流行度。该代码是开源的(在GPL v3 license下),您可以从Github免费下载。更新:Datumbox机器学习框架现在是开源的,可以免费下载。查看包com.datumbox.framework.algorithms.dea以查看Java中Data Envelopment Analysis的实现。数据包络分析在JAVA中的实现代码是用JAVA编写的,可以直接从Github下载。它是根据GPLv3许可的,所以可以随意使用它,修改它,或者再分发。该代码实现了数据包络分析(Data Envelopment Analysis)算法,使用lp_solve库来解决线性规划问题,并使用Web搜索引擎优化分析(Web SEO Analytics )索引提取的数据,以构建基于Facebook,Google Plus和推特上分享的一个混合的社交媒体页面流行度矩阵。在前面的文章中介绍了算法的所有理论部分,在源代码中可以找到关于其实现的详细的javadoc注释。(原博文之后数据包络分析(Data Envelopment Analysis)算法及其实现全部简称了DEA,请读者注意,译者注。)下面我们提供一个关于其架构实现的高级别描述:1. lp_solve 5.5 library为了解决各种线性规划问题,我们使用一个名为lp\_solve的开源库。某些特定的lib是用ANSI C编写的,并使用JAVA包装来调用库方法。因此,在运行代码之前,您必须在您的系统上安装lp_solve。该库的二进制文件在[Linux和Windows都可以使用,您可以在lp_solve文档中阅读更多有关安装的信息。在尝试运行JAVA代码之前,请确保您的系统上安装了(相关的)特定库。有关安装和配置库的任何问题,请参阅lp_solve文档。2.DataEnvelopmentAnalysis Class这是DEA算法的主要实现类。它实现了一个名为estimateEfficiency()的公共方法,它获取记录的Map并返回它们的DEA得分。3. DeaRecord ObjectDeaRecord是一个特殊的对象,用于存储我们记录的数据。由于DEA需要分离输入和输出,因此DeaRecord对象将以DEA可以处理的方式分别存储我们的数据。4. SocialMediaPopularity ClassSocialMediaPopularity是一个应用程序,它使用DEA来评估社交媒体网络上Facebook的like,Google的 +1和twitter的Tweets的网页流行度。它实现了两个受保护的方法:calculatePopularity()和estimatePercentiles()以及两个公共方法loadFile()和getPopularity()。calculatePopularity()使用DEA实现根据社交媒体计数来估计页面的得分数。estimatedPercentiles()方法获取DEA分数并将其转换为百分位数。总的来说,百分比比DEA分数更容易解释; 因此当我们说一个网页的流行分数是70%时,这意味着该网页比70%的其他网页更受欢迎。为了能够估计一个特定页面的流行度,我们必须有一个包含其他页面的社交媒体数据的数据集。这是有原因的,因为需要预测哪个网页是受欢迎的,哪些不是,您必须能够将其与网络上的其他页面进行比较。为此,我们使用来自以txt格式提供的Web SEO分析索引的小型的匿名样本。您可以通过从网页上的更多页面提取社交媒体计数来构建自己的数据库。(社交媒体计数,比如点赞数、转发数、评论数)loadFile()方法用于加载DEA的上述统计信息,getPopularity()方法是一种易于使用的方法,可以获取Facebook的like,Google的+1和一个页面的Tweets数量,并以此评估其在社交媒体上的流行度。如何使用数据包络分析的JAVA实现在DataEnvelopmentAnalysisExample类中,我提供了2个不同的关于如何使用代码的例子。第一个例子直接使用DEA方法来根据它们的输出(ISSUES,RECEIPTS,REQS)和输入(STOCK,WAGES)来评估组织单位的效率。这个例子来自DEAzone.com的一篇文章。代码语言:txt复制Map<String, DeaRecord> records = new LinkedHashMap<>();
records.put("Depot1", new DeaRecord(new double[]{40.0,55.0,30.0}, new double[]{3.0,5.0}));
//...adding more records here...
DataEnvelopmentAnalysis dea = new DataEnvelopmentAnalysis();
Map<String, Double> results = dea.estimateEfficiency(records);
System.out.println((new TreeMap<>(results)).toString());第二个示例使用我们的社交媒体流行度应用程序,通过使用来自社交媒体的数据来评估页面的流行度,例如Facebook的like,Google的+1和Tweets。所有的社交媒体计数都被标记为输出,我们传递给DEA一个空的输入向量。代码语言:txt复制SocialMediaPopularity rank = new SocialMediaPopularity();
rank.loadFile(DataEnvelopmentAnalysisExample.class.getResource("/datasets/socialcounts.txt"));
Double popularity = rank.getPopularity(135, 337, 9079); //Facebook likes, Google +1s, Tweets
System.out.println("Page Social Media Popularity: "+popularity.toString());必要的扩展(上面)所提供的代码只是DEA如何被用作排名算法的一个例子。为了改进其实现,需要进行下面的扩展:1.加速(算法的)实现特定的DEA算法实现会评估数据库中所有记录的DEA得分。由于我们需要解决如同数据库中记录数量那样多的线性规划问题,这使得实现变得缓慢。如果我们不需要计算所有记录的分数,那么我们可以显著地加快执行速度。因此,该算法的小扩展可以使我们更好地控制哪些记录应该被解决掉,哪些只能被用作约束。2.扩大社交媒体统计数据库(这篇文章所)提供的社交媒体统计数据库由来自Web SEO Analytics索引的1111个样本组成。为了能够估计更准确的流行(度)分数,需要更大的样本。您可以通过统计来自网络上更多页面的社交媒体计数来创建自己的数据库。3.添加更多的社交媒体网络该实现使用Facebook的喜欢,Google的+1和推文的数量来评估文章的受欢迎程度。不过,来自其他社交媒体网络的指标可以很容易地被考虑在内。您只需要从您感兴趣的网络中构建一个社交媒体数据库,然后扩展SocialMediaPopularity类来处理它们。关于实施的最终意见为了能够扩展(算法的)实现,您必须对Data Envelopment Analysis的工作原理有一个很好的理解。这在前面的文章中已经介绍过了,所以在继续进行任何更改之前,请确保您阅读了之前的教程。此外,为了使用JAVA代码,您必须在您的系统中安装lp\_solve库(参见上文)。如果你在一个有趣的项目中使用这个实现,那么就给我们一条线索,我们将在我们的博客上展示你的项目。另外,如果你喜欢这篇文章,请花点时间在Twitter或Facebook分享。

社交网络邮箱分析
作者:Multiangle
链接:https://www.zhihu.com/question/41676600/answer/113216461
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
分析了6000封左右邮件,对收件人之间的关系进行了简单的分析,也没什么严密的分析计划,分析到哪就写到哪吧
------------------------------------- update 7.27 ------------↓↓↓↓--------------------------------------------------------
1.首先来看收发邮件数
在6000封邮件中,涉及了600个左右的邮箱
单看发送邮件的数目,前五强邮箱分别是
[email protected] 645封 [email protected] 645封 [email protected] 200封 [email protected] 149封 [email protected] 147封
单看接收和抄送的数目,则前五强分别是
[email protected] 2224封 [email protected] 1030封 [email protected] 656封 [email protected] 649封 [email protected] 540封
具体的一些信息如下图所示(按照发送邮件数目排序)
如果按照发件数或者收件数对各邮箱进行排序,都可以看到社交分析中常见的指数曲线
令我比较惊讶的是,在对发送邮件数取对数以后,所得到的结果仍旧是一条指数曲线。如下图所示。
这表明,这个竞选团队中极少数人有着极大的话语权。毕竟在求对数以后一般是得到一条直线的,例如微博中排名前几千的大V的粉丝数分布,就像下面这个图(原谅我的灵魂画技)
纵轴在接近0的地方会迅速向0靠近,这是由于对数函数本身的性质导致的。
2. 邮箱之间的社交分析(SNA)
这一部分的分析就比较好玩了,首先使用PageRank算法来计算各个邮箱的重要性。
结果发现收发最频繁的两个邮箱重要性反而不怎么高
可以看到PageRank值最高的邮箱是[email protected], 达到了0.07, 看名字似乎是负责对外推送消息的。排第二的是[email protected], 似乎与民主党的经济事务有关。
对上述社交网络进行可视化表示,在使用ForceAtlas2展开以后,得到如下图所示
其中节点表示邮箱,边代表邮箱间发送的邮件。点的颜色深度与收发邮件的数目有关,而点的大小则与PageRank值有关。可以看到上面有两个非常深的节点,分别是[email protected](左上)和[email protected](右下)。而最大的节点即[email protected] . 所以说啊,邮件往来频繁的也不见得重要性就高,真正重要的人都躲在后面闷声发大财。
从上面还可以看到竞选团队很明显的分成左上和右下两个部分,这个后面会讲
还有一点,上面的图有很多排成很密集的小白点, 比如说红线框起来的部分
这些有很多是外部邮箱,而且往往排在一起的那些邮箱都只与一个邮箱进行单线联系。虽然大部分只是进行了一次通信,不过也可以借此看出每个人负责哪一部分工作。下方红线部分的邮箱大部分是媒体,包括网络媒体和传统媒体,以及一些LGBT网站,教师工会等等,主要由MirandaL联系。而左上部分的邮箱比较杂,包括一些服务软件公司,策略咨询公司,金融服务公司,服装公司等。总的来讲是维持竞选团队正常运行的,主要由KaplanJ联系。
由MirandaL负责联系的有(主要看靠下红框,我随机抽了一些,一个个在Google上查后缀,这一部分是最累的)
由Kaplan J 负责联系的有
3. 社区发现
如果在第二步的基础上使用社区发现算法,就能够将整个竞选团队分成若干个子社区,如下图所示
一种颜色即代表了一个子社区。通过这个可以看到,算法显然比肉眼要更加精确,除了区分出绿色的子社区以外,还将右下角的大块分成了蓝色,紫色和橙色三个子社区。
绿色部分的大人物有
[email protected],
[email protected] 等。
紫色部分不用说了,最明显的DNCPress@ http://dnc.org
橙色部分不知道干嘛的,比较有分量的是[email protected]
蓝色部分我也不知道是干嘛的,没有特别显眼的人物。但是从位置上来看,估计是竞选团队中的普通人员,负责日常事务和分析。
------------------------------------- update 7.28 ----------↓↓↓↓----------------------------------------------------------
4.邮件数目与日期的关系
邮件大部分是从今年4月20号以后开始的。首先绘制每天的邮件数目变化
可以看到在从4月20日到5月25日的一个月时间里,邮件数呈现明显的周期变化。细心的人应该已经猜到了,这是由于周末的缘故。几乎所有的低谷都发生在周六和周末。看来他们的双休制度执行的不错,加班情况不明显。
看完了低谷,再来看几个几个邮件数目比较高的日期: 5/4, 5/10, 5/17. 显然,这几天肯定有大事情发生。我跑去GoogleTrend 搜了下democratic party的搜索指数,结果发现跟邮件数是高度吻合的
其中橙色代表邮件数目,蓝色代表搜索指数。为了将两组数据放在一张图里,我对邮件数进行了等比例缩减。
跑去Democracy Now! 翻了翻之前的新闻,在忽略掉大量Trump的八卦以后,找到了那几天的大新闻
5/4 Ted Cruz 退选
5/10 Sanders 拿下了 West Virginia Primary (我之前不太关注这些,不知道这个该怎么翻)
5/17 Sanders 拿下了 Oregon Primary, 而Hillary 拿下了Kentucky
5.神秘的小团体
在之前的关系图中,还有一个点没讲,就是左上角的那一坨黑点
可以看出来这坨黑点内部交流十分紧密,而与外界联系十分的少,只通过少数人与Kaplan J 联系。非常神秘的样子。那么这个小团体里究竟是哪些人呢?首先要列出这些人的邮箱。这些人中任何一人都与名单中其他所有人有过联系
代码语言:javascript复制[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
我查了一些人的资料,因为我对它们也不熟,所以只列个大概资料。
代码语言:javascript复制邮箱 [email protected]
姓名 Jackson Dunn
简介:Jackson Dunn is a Senior Managing Director in the Strategic Communications segment at FTI Consulting, and is based in Washington, D.C. He also serves as head of the segment’s Public Affairs practice in the Americas. 大意是做咨询工作代码语言:javascript复制邮箱 [email protected]
姓名 Brian Zuzenak
职务 Political Director at Gov. Terry McAuliffe
根据LinkedIn上的资料,此人目前就职于Common Good VA
曾经就职于Democratic Congressional Campaign Committee, Kate Marshall for Congress,
Missouri Democratic Party代码语言:javascript复制邮箱 [email protected]
姓名 Jonathan Mantz
目前就职 BGR Group
曾经就职 Barbour Griffith Rogers, Hillary Clinton for President, DSCC代码语言:javascript复制邮箱 [email protected]
姓名 Michael Halle
Director, Battleground Analytics and Strategy at Hillary for America
暂时就只搜4位,其他各位感兴趣的可以去Google搜,还是挺好搜的
可以看出来,这些人大部分是属于咨询机构,看起来是专门进行出谋划策的=。=
------------------------------------- update 7.26 ----------↓↓↓↓----------------------------------------------------------
写个比较无关的,看到很多人对 @XY Lee 写的感兴趣,花了一个晚上+上午写了个分析邮件往来关系的单线程小爬虫来玩玩,很简陋而且代码也比较乱,实现的功能也比大神差远了,不过能生成基本的社交关系数据。至于分析嘛,是用gephi来完成的,很好玩的一个软件,号称SNA的matlab,可以做pagerank,社区发现等一些算法。代码放在GitHub - multiangle/HillaryEmailAnalysis ,注意要用到networkx库。
所有分析用到的工具:
python3.4 + networkx 库
gephi
excel
当然,如果不想用爬虫下邮件,我这有下了一晚上的成果,大概6k封的社交关系数据,还有已经生成的供gephi使用的gexf格式文件链接: http://pan.baidu.com/s/1qYpdVB2 密码: 9fax

DZ论坛性能优化
DZ论坛是一款功能十分强大的bbs系统。但是由于功能的强大也使其变得很臃肿。当服务器性能一般的情况下,打开dz的速度也就很一般了。本文将通过自己的实践来告诉大家如何来提高论坛的加载速度。论坛页面缓存优化全局--性能与优化缓存论坛首页有效期:设置论坛首页缓存更新的时间,单位为秒,0 为关闭(关闭以后,缓存系数将不再起作用),建议设置为 900。此功能只针对游客缓存帖子有效期:设置帖子页面缓存更新的时间,单位为秒,0 为关闭。请根据实际情况进行调整,建议设置为 900。缓存目录:默认为 data/threadcache 目录,如果您需要将其指定为其他目录,请确定您指定的目录有可写权限缓存系数:页面缓存功能可以将会员经常访问的主题临时缓存起来,缓解大型论坛服务器压力。缓存阀值范围 0 - 100,建议设置为 40 ,0 为关闭。在磁盘空间允许的情况下,适当调高缓存系数,可以提高缓存效果。服务器优化是否优化更新主题浏览量>>是查看数开启防刷新:>>是附件下载量延迟更新:>>是禁止浏览器缓冲:>>否最大在线人数:>>根据自己的实际情况而定关闭session机制:>>是内存优化(重要)内存的快慢直接影响的程序的加载程度。在这里我们利用redis来优化我们的内存。首先,在宝塔面板中安装redis修改config/config_global.php文件内容如下代码语言:javascript复制$_config['memory']['prefix'] = '3DAD6r_';
$_config['memory']['redis']['server'] = '127.0.0.1';
$_config['memory']['redis']['port'] = 6379;
$_config['memory']['redis']['pconnect'] = 0;
$_config['memory']['redis']['timeout'] = '';
$_config['memory']['redis']['requirepass'] = '';
$_config['memory']['redis']['serializer'] = 1;保存完成后重启php和apacher这样便完成了redis的安装版权属于:逍遥子大表哥本文链接:https://cloud.tencent.com/developer/article/1921469按照知识共享署名-非商业性使用 4.0 国际协议进行许可,转载引用文章应遵循相同协议。

社交关系+大数据=?
有个不太靠谱的命题:如何让赵本山和迈克尔乔丹搭上关系?其实很简单,通过分析两个人的社交圈子,兴趣爱好等,最终可以找出一条线路能让他们两个人认识,这就是隐藏其中的大数据魅力之一点点……随着互联网的冲击,UGC(用户产生内容)不断发展,社交网络已经不断普及并深入人心,用户可以随时随地在网络上分享内容,由此产生了海量的用户数据。这些数据并不是我们想象中的那样冷冰冰、枯燥的数据,而是更加活生生、有趣的数据;这些数据不同于以往单纯的数字,它们声色结合、图文并茂。比如,Facebook用户每天共享的东西超过40亿,Twitter每天处理的数据量超过3.4亿;而每分钟Tumblr博客作者会发布2.7万个新帖子,Instagram用户会共享3600张新照片……随着Facebook、Twitter、LinkedIn、微信等社交媒体的流行,对社交关系的数据挖掘成为近几年的一个技术热点。玩的核心是消费者洞察在一般商业前提下,社交大数据挖掘的目的,是投其消费者所好。
不可否认,一个正在改变我们的生活、工作和思维方式的新浪潮正悄悄来到我们身边,这或许就是大数据(Big Data)导致的一个还不可名状的时代。当下,社交大数据正在对企业,甚至于一些行业带来深刻的变革。下面,让我们来细数一下吧!首先,与传统的营销方式相比,利用大数据营销,从前期的曝光,中期的转化,到后期的购买行为都是可监测的。效果可评估是大数据带来的最实质性影响。其次,在社交环节,越来越多消费者通过社交媒体反馈自己对企业产品、品牌形象的看法,这个过程会产生许多有价值信息,甚至包括一些潜在的市场需求。对一个企业来说,这些信息不仅可能使他们调整原有产品,甚至催生新的商业模式。消费者洞察,是大数据的核心价值。第三,大数据对某些行业来讲,意义更加不同。比如电影行业,金融行业,大数据能够起到预估性、前瞻性作用,企业可以据此建立一些模型对消费者行为进行分析。同时,这又是一个移动盛行的时代,与传统互联网相比,移动互联网时代更加强调“社交”和“互动”。人们随时随地可以和朋友问候交流、分享资讯,只要带上手机,整个社交圈也就装在口袋里。交互性增强带来的效果是,不但产品可以为用户带来效用,用户反过来也能为产品导入流量。一个网友如果在微博上发文夸赞一家餐厅,经由他的社交圈的转发和扩散,就将为这家餐厅带来更多的访客。这个特征,也为移动互联网时代的商业创新指出了一个方向,那就是基于用户身份的信息交互和社交应用。当下,所有行业都在积极拥抱移动互联浪潮,当然金融业也无法作壁上观。唯有移动起来的金融,才具备在下一个周期继续参与竞争的生命力。这其中,应用社交化的趋势和大数据,将对金融行业带来更多新的机遇,并将使金融行业逐步移动化、社交化,产生新的具有移动互联网特点的金融模式。这种金融模式将具有成本低廉、便捷的特点,能够使人们不受时间和地点的限制享受金融服务。总之,进入大数据时代,金融行业的客户信息、交易信息、资产信息、信用信息等数据经过有效采集和整理分析,将会成为具有价值的数据信息。内部数据结合外部数据将形成具有重要价值的数据资产,可以有效帮助金融企业进行精准营销,降低运营费用,提高欺诈管理水平,提高信用风险管理水评,为决策提供有效支持,同时帮助金融企业了解客户需求,开发出符合客户需要,具有创新精神的新产品。未来社交关系与大数据还将在互联网贷款、购买保险、证券投资等发挥极大作用。金融和数据拥有天然的数据化基因,因为金融本身就是信息和数据,做金融的本质就是做信用。大数据技术提供的有据可查的信用数据,为构建互联网金融信用体系提供了保障。什么时候隐私可以成为伪命题?社交大数据掘金路上,隐私问题忡忡。当然,深度的社交大数据挖掘中最敏感的问题仍然是用户隐私的问题。社交网站从一诞生起就与这个问题相伴相生,随着大数据时代的到来,隐私问题显得越发重要。在未来掘金社交数据的道路上,一方面要为用户提供更加精准便捷的良好服务,另一方面也要注重对用户隐私的保护。只有符合用户需求和用户安全的商业利益,才能成为可持续的商业利益。
可见,移动互联网、社交网络、云计算、大数据等新技术的不断涌现,加剧了互联网与金融业在客户管理、风险控制、渠道建设、商业模式、战略等层面广泛的融合和创新,不难想象,在不久的将来,真正能带来改变的互联网金融一定是由深谙互联网思维,立足小额信用贷款服务,涉及海量用户,注重数据资产,耐心长远的公司所推动的。只有这样,才是符合大数据的趋势,才能拥有长期的核心竞争力。但不可否认,无论选择与社交网络进行品牌联合,还是借助丰富而强大的数据系统实现精准定向,亦或求同存异定制产品打通,社交关系与大数据的结合,不仅搅动了金融业,而且演变为整个商业社会乃至人情社会的制高点工具问题,即将催生真正的互联网与金融领导者。版权声明:转载文章均来自公开网络,仅供学习使用,不会用于任何商业用途,如果出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜,联系邮箱:[email protected]。转载大数据公众号文章请注明原文链接和作者,否则产生的任何版权纠纷与大数据无关。

社交的基本逻辑
最近两个月学习了一门有关社交的课程,回想起自己这些年在社交上成功的案例、吃过的亏,印证了课程中的很多观点。所以写篇简单的文章,将课程中一些抽象的内容总结一下。学习社交的目的更好地进行社交,成为社交达人。提升自己的社交直觉、情商。快速建立对自己有价值的社交圈。从而对自己方方面面带来帮助。快速找到匹配自己、对自己有价值的合作伙伴。能更好地从全局来掌控社交及合作进程。哪些行为是合作社交,是为了寻求合作。合作的定义请问度娘。合作的形式,则非常广泛:一个简单的形式,例如一个普通职场员工的求职:做简历展示自己,与面试官的谈判,最终签署劳动合同,就职工作。这就算是一个建立合作的过程。又如:合伙创业、风险投融资、交友、共同做某件事(例如开发开源框架)……价值吸引原则这个社会,是一个合作、互利共生的社会。社会中任何形式的合作,必然是基于价值导向的。合作的前提,正是价值的吸引原则。你对对方所能带来的价值,包含多种多样,例如:生活价值、生存价值、事业价值、财富价值、心理价值、精神价值……而当你价值太低,或者价值过于单一时,很难找到人愿意与你合作。你会发现你连一个好的工作都找不到、没人愿意与你合伙创业、你的企业融不到资……所以一个个体(人、企业),一定要给社会提供多维度、立体的价值。而非单一价值。当你有价值时,自然会不断有合作者上门找你。另外,你寻求合作时,也应该寻求有价值的合作者。例如,寻求融资,不能只看对方给予的估值和现金。周末活动,也要参与对自己有价值的活动。人的精力、时间有限,不要去做一些无谓的社交,浪费自己的人生。(再次重申,这里的价值,不只是物质,还可以是精神)价值的体现酒好,还怕巷子深。在合作前、正常社交时,你本身的价值,需要以某种形式,以社群中体现出来。要体现哪些价值,应该针对你的目标合作方来决定。目的是要能吸引到你的目标合作方。价值的体现,需要注意适度。过度,则对方会认为你装逼;不够,则价值不够吸引对方。体现的形式,则需要找合适的、高效的媒介。常见的媒介有:聊天、照片、演讲、朋友、同事、互联网、移动互联网、朋友圈、头条、微博、公众号、其它自媒体等……。除了价值体现,还要注意对自身严重缺点的提升,以及包装。看到这,就能很好地理解,为什么很多商人欠了一屁股债,借钱也要继续开着豪车。^-^能量守恒合作,应该是平等的。不平等的合作,很难长久。要保持一个长期正常的合作关系,合作双方的能量需要尽量平等。能量,也叫合作的动能,可以理解为某一方要与对方进行合作的需求程度、渴望程度。合作过程中,某方的动能越大,该方的价值越低。越想得到,越得不到!所以,在合作时,特别在初期,要控制自己的动能、控制自己的需求感。最好的状态是我方能掌控合作双方的动能,进而能促成利于我方的合作。无欲而求,是合作的最高境界。这是反人性的!也是一种修炼!(你明明想得到,但是要控制自己达到一种不想得到的状态。)小技巧:关注对方的缺点,而不是优点,能帮助你降低你的动能。情商要做到能量守恒,掌控双方的动能,需要有很好的情商、社交直觉。我认为,情商 = 30% 自我情绪的掌控 + 70% 他人情绪及思维的掌控。所以,情商高的人,不但能控制好自我的情绪(动能),也要能很好的识别他人的情绪(动能),并使用沟通技巧来引导他人的情绪。要识别他人的情绪,需要有良好的社交直觉。而社交直觉需要依靠不断的实践,才能慢慢变强。没有实践的机会,也要创造机会,或者可以多看多听社交达人的实践,并总结经验。社交直觉必须提升上来,因为,你的合作方可能已经在此领域实战多年,对方的社交直觉可能远远高过你。而引导对方情绪,则是通过很多的沟通技巧来实现(语言、行为)。此为更高阶的能力,更是需要通过实战不断提升。合作的阶段吸引阶段
此阶段就是双方通过价值吸引原则,初步接触,一个不断的筛选与被筛选的过程。关系建立长期合作关系
长期合作关系的维护,是一门再次合作用于纪念的话其实,由于我的总结中省略了很多课程中关键的无法公开的内容,所以本文的内容其实比较抽象,没太多操作层面的干货。不过,此文更重要的意义在于纪念,以便于多年后的自我回顾。工作后的这些年,我深入研究的领域不多:2007年至今,主要研究领域是 IT;自我认为小有成就,个人发布数万行代码的开源框架、公司的技术一把手、薪水不低,也算是跻身行业头部。2013 年互联网金融暴发后,至今,我主要研究领域是理财投资;自我认为依然小有成就,理财投资能力~可能~已经进入行业头部,当然,还需要后续的确认和提升。而在 2018 年起,因为一些事,无意间接触并学习了这个神秘的课程,觉得自己突然间对很多事情有了新的认识。以至于,对自己的人生都有了新的规划。它将是我接下来会花很多时间来研究的、第三个非常重要的领域。以我目前的认知,我认为它将会对我的人生、我的事业、我的家庭,产生深远的影响!我很庆幸,能在关键的时刻遇到关键的老师!从小,不论是学习阶段,还是工作阶段,对于任何我想要做的事,都会很专注、努力。性格也很倔,对于我认定的事,失败只会让我更加努力。加上认为自己不笨,所以我自信,只要给予一定的时间,我做任何事都可以做得很好!所以我对自己在这个领域的成长,充满信心!时间,是最好的试金石,2018,遇见未知的自己,拭目以待……

VoC客户之声的价值与八爪鱼的实践
01. 什么是客户之声?客户之声(Voice of the Customer,简称VoC)是消费者对于品牌、产品、服务等内容的反馈。根据国际知名研究机构Forrester的定义:“公司通过VoC项目收集和分析客户反馈,找到客户体验提升方向,并追踪提升效果。为了应对运行VoC项目所面临的复杂挑战,客户体验专家可以寻求不同供应商的帮助完成VoC项目的部分或全部内容。VoC是指收集、分析客户反馈数据,挖掘数据价值并用于指导商业决策的一整套方案。”我们在很多时候都需要做 VoC ,例如做市场 、行业及产品调研时,在销售过程中,在售后服务过程中等等。VoC 已经成为企业非常重要的一种工具而得到广泛应用,同时, VoC 作为当下兴起的经济模式“客户体验管理(Customer Experience Management,,简称CEM)”中不可或缺的组成部分,也显得尤为重要。数字化转型的浪潮正影响着用户,让他们产生多渠道、多类型的反馈数据。要了解客户体验就需要将分散在不同渠道的反馈数据进行整合分析,透过数据理解客户的需求痛点。从收集来的反馈数据里倾听客户的声音,并将其转化为可执行的商业见解是VoC的核心目的。02. 客户之声的价值在哪里?首先我们需要明确一点:VoC洞察并非某个人、某个部门的事,而是整个公司各个部门共同的事,包括产品、品牌、服务、营销等。一套VoC解决方案的上线,需要公司从战略的角度给予支持,促进产品、品牌、服务、营销跨部门的流程优化,进而在各个环节洞察客户之声,为客户提供更好的体验。为什么VoC客户之声如此重要?因为VoC数据可以在以下多个方面帮助到企业增长:对于企业高层领导而言:可以了解当下市场情况及未来发展趋势;了解行业的发展现状及未来走向;为公司发展决策提供数据支持。对于产品部门而言:可以帮助企业优化产品,长期保持竞争力。调研并确定企业为客户提供什么样的产品和服务;帮助了解用户需求及痛点,从用户反馈中挖掘新的机会和增长点,为新产品的开发提供线索及指导策略。对于市场部门而言:可以帮助挖掘消费者情报和竞品情报。识别产品和服务的关键特性,分析产品市场宣传中的重点与用户关注点之间的差异;建立客户体验及满意度的基本测量指标,以此来测量改进成果,确定客户的使用体验及满意度的关键驱动因素;挖掘竞品情报,在产品的全生命周期,找到产品与竞品的差异点,确定企业和产品在哪些方面进行改进。在互联网高度发达时代,社交媒体或电商平台的一条负面评论,都可能劝退想要购买的新客户,对品牌口碑造成非常大的负面影响。我们必须以客户为中心,为客户提供良好的体验。Bain公司(全球领先的战略咨询公司)的研究发现,良好的客户体验可以创造出巨大的价值:擅长客户体验的公司的的收入比竞争对手高出4-8%卓越的体验可将客户生命周期价值提高6-14倍许多国外品牌都在上线VoC解决方案后证明:基于数据驱动的VoC解决方案可以有效地帮助品牌企业提高客户生命周期价值并降低客户流失率,从而实现业绩的持续增长。VoC的真正价值在于:使品牌整个组织架构都以客户为中心,帮助品牌更快地进行内部调整,并根据客户表达的意图和需求采取行动,在各个环节为客户提供最佳体验。在当今的大数据时代,掌握更多详尽且真实准确的客户之声数据,才更有机会赢得市场先机,拔得头筹。03. 常见的客户之声涵盖类型提起VoC客户之声,我们通常会想到反馈调研。我们平时在浏览官网或邮件的时候会经常收到过关于某一产品或服务的打分问卷(评分范围在1~5或1~10)。这些调研构成了大部分VoC项目的核心。反馈调研的目的有两个:一是评估客户体验水平;二是(对于更成熟的企业而言)采取措施进一步提升客户体验。常见的客户反馈调研类型包括客户满意度(CSAT)、客户费力度(CES)、和净推荐值(NPS)等。除了反馈调研之外,VoC客户之声通常还包括电商评论、新闻媒体及评论、社交媒体评论、垂直行业媒体及论坛、客服在线聊天、电话和工单等等。针对品牌舆情监控的问题,可以从各大新闻资讯网站和社交媒体平台上能获得很多有效的客户之声,包括客户对品牌推文的评论、客户对品牌营销种草活动的反应、关于品牌某事件的讨论从出现→发酵→达到峰值→降低→最终消失的动态走势监控。电商评论:近年来国内电商业务高速发展,几乎所有的品牌都建立了线上销售渠道,电商评论是十分重要的客户之声来源。品牌在多个平台售卖很多产品,一个产品动辄几十万上百万的评论,蕴藏着巨大价值。新闻媒体及评论:相对于个人用户而言,新闻媒体发布的消息能够在短时间内飞速传播,产生更深远的影响,用户也会在新闻下发布自己的想法,因此对于主流新闻媒体的新闻报道及评论监测也至关重要。社交媒体:国内的微信、微博、抖音等是非常重要的社交媒体平台,这些平台上每天有大量动态表达对品牌的看法。
垂直行业媒体及论坛:不同行业的用户有着各自的垂直论坛,如汽车用户的垂直论坛汽车之家、爱卡汽车、懂车帝;旅游类用户经常使用携程、去哪儿、马蜂窝;美妆护肤类用户则更偏好小红书和微博。汽车行业VoC采集示例客服在线聊天:每天可能有上万的客户通过各个平台的在线聊天与品牌的客服产生互动。包括品牌自己的客服系统、京东的叮咚、淘宝的旺旺等。VoC洞察是企业面向客户解决,进而提升客户体验,保持可持续性发展的有效方式。八爪鱼依托强大的采集能力基础,已经帮助过汽车、家电、3C、美妆等多个行业的客户收集VoC信息,助力企业增长,在VoC领域具有丰富的理论基础和实操经验。
如果您有客户之声相关的数据需求,可以扫描以下二维码咨询我们的顾问(或直接搜索微信号:BANXIANCEM),了解详细内容。

语音社交APP系统开发,提供纯粹的语音社交
我们不难发现,语音社交app的应用十分广泛,像音乐电台、游戏开黑、语音游戏等场景下都有它们的身影。语音聊天交友app需要为用户提供长时间、高频次语音连麦互动功能,在网络抖动时保证语音通话流畅、延迟小、卡顿低、音质好。经过几年的沉淀,语音直播系统源码打造得更加完善,如果说玩法是吸引用户的先锋兵,那么语音直播的声音魅力与实质内涵却是能否留存用户的关键。在社交交友方面,语音直播系统将建立多个版块,以拉近交友距离,为用户提供纯粹语音社交环境。和传统直播方式不同,语音直播app强调的是不看颜值,靠音值。定位于声音市场解锁新型的社交形式。从功能机制上来讲,一款语音社交App需要包含以下的功能:登录板块:支持手机验证码登陆,QQ、微信等三方登陆,已经写好接口首页板块:可查看关注的直播间,查看大厅房间列表,交友功能,搜索功能直播间板块:认证可以开房间,查看房间分类,进行房间的编辑管理,关注、私信、查看在线人数,查看排行榜,可以进行礼物的打赏,直播间小游戏的互动,可以进行麦位管理 ,分享直播间,充值。个人中心板块:基本信息的编辑修改(用户名,等级,性别,账号,头像),粉丝和关注点击查看,我的钱包钻石数量及充值,购买靓号,收益结算,余额兑换,等级勋章,好友邀请,账号与安全的设置,帮助与反馈等。搭建相关准备:1.服务器,是最基本的准备,前期4核8G5M带宽,就可以支持前期基本运营,后期可根据在线人数升级服务器。2.域名:域名一般建议使用运营者自己实名备案的,如果是购买的别人的,在运营中可能会掉,域名掉了,APP也就访问不了了。只有把域名解析到服务器上,网络才能找到你的。3.短信验证码和登陆方式登录验证。4.充值支付:最为常见的就是微信支付和支付宝支付。语音聊天app也是社交app中的一种,在这个浮躁看颜的现代社会,通过语音社交,有些不方便与身边人说,但又不吐不快的事,也不必压制于心,说给陌生人听听也是好的,且只出声,不露脸的交流方式也更令人觉得安全。文字比图像更能传递信息,语音比视频更有想象空间,有时候,没有图像带给人的刻板印象,只靠声音带来的虚幻想象会更令人着迷。

腾讯多媒体实验室亮相GBA-IAS 2019声学论坛,深度分享音频前沿技术
12月16日,由中国香港科技大学深圳研究院主办的GBA-IAS 2019声学论坛(GREATER BAY AREA -INTERNATIONAL ACOUSTICS SYMPOSIUM),在深圳正式召开。随着虚拟现实技术的发展,音视频行业对3D音频等技术的需求也更加强烈,本此论坛以“感知与声音”为主题,来自国内外众多知名大学、科研机构的多名心理学、声学、信号处理和计算机科学的专家出席,对各自团队的研究进展和新思路进行了分享与交流。在音视频领域积累多年的腾讯多媒体实验室团队受邀参会,腾讯多媒体实验室高级总监商世东、专家研究员肖玮、王燕南等就多媒体实验室的音频前沿算法及应用进行了分享。
(GBA-IAS 2019声学论坛,与会专家合影)
多媒体实验室成立于2016年,专注音视频通信技术的前瞻性研究,包括全球实时音视频网络优化、音视频处理、音视频标准、多媒体编解码前沿算法研究、计算机视觉图像处理、基于AI的音频语音增强、声音美化及音视频质量评测等,在实时音视频通信等技术领域积累了十余年的研究经验,一直保持业界的技术领先性。商世东详细介绍了多媒体实验室的音频技术全景图、音频端到端方案的技术框架以及5G时代下音频技术发展面临的挑战和机会。
“腾讯多媒体实验室,对于声学领域的技术发展和产业落地始终秉持着开放的态度,也希望能和行业的企业、高校等机构共同合作,一起推动声学领域技术的进步和落地应用。”商世东介绍道,随后,商世东主持了基于球面谐波技术和声音场景分类的空间声学研讨会,与来自澳大利亚国立大学的Thushara教授和华南理工大学的师生展开了热烈的讨论。
(腾讯多媒体实验室高级总监 商世东)
高效率音频超分算法的无限可能
腾讯多媒体实验室专家研究员肖玮,基于多媒体实验室在高效率音频超分领域的进展,同与会专家进行了深入的交流与探讨。作为腾讯天籁音频解决方案的重要支撑,音频超分算法具有无需修改网络协议,无需额外数据传输,人工生成高频频谱提升用户主观体验的特点。“我们知道丰富的高频声音信号能够带来更加出色的听觉体验,但在实际应用中,受设备采样率等因素影响,我们时常会遇到不含高频信号的窄带语音,从而对听感产生影响。”肖玮介绍道。
为了解决这一问题,行业内已经公开一些利用深度学习的思路,完成宽带频段重建的工作;但由于对数据的强依赖,外加模型体积过大,复杂度也相对较高,难以部署在客户端。为了解决这一问题,多媒体实验室将深度学习技术与经典语音信号技术处理、心理模型等技术进行融合,通过轻量级建模,从而克服了一般深度学习算法中对数据的过度依赖以及网络模型过大等问题,仅2MB的技术模型就可轻松部署于各类客户端,同时保证宽带频段的重建精度和质量。此外,肖玮还向与会专家现场进行demo演示,就超分算法如何面对真实应用场景、优化建模方法以及功能扩展等方面与与会专家进行了深度交流。
目前这一算法已部署至腾讯会议,实现由窄带语音输入到宽带语音输出的转换;此外,在提升听障人士语音通信体验领域,超分算法也具备着巨大的应用前景。
(腾讯多媒体实验室专家研究员 肖玮)
深度学习算法助力语音增强
腾讯多媒体实验室专家研究员王燕南,就实验室在语音增强、伴奏分离等领域的研究进展进行了分享。在录音过程中,由于环境和采集设备的局限性,可能会捕捉到多种不同的声音,而在采访等场景中,我们很可能只需要一到两种声音,那么应该如何将有用的声音分离出来呢?为了解决这一问题,多媒体实验室提出基于神经网络深度学习的概率学习框架。
以往处理这类问题,业内人通常会采用一种名为常规最小均方误差的训练准则,进行深度学习,在信号处理的过程中,这一模型能够通过矩阵式的运算,让输出的信号尽可能接近输入的信号。由于较高的计算量难以满足即时通信环境下的需求,无法实现高效的语音分离,多媒体实验室自研了基于深度神经网络的非线性谱映射单通道语音分离的最大似然法。简单说来,这一方法是基于概率模型对海量语料数据进行深度学习,从而实现高清晰度与高效的语音分离工作,同时由于计算量的降低,它还具备更出色的泛用性,能够适用于更多的场景,诸如语音增强、伴奏分离等。
此外,王燕南还针对深度学习算法在应用中面临的挑战,如模型的鲁棒性(在极低信噪比、数据失配等情况下的效果)、计算量优化的挑战等内容,和与会专家进行了交流。
(腾讯多媒体实验室专家研究员 王燕南)
名校师生Lab Tour,深度开展校企交流
会后,腾讯多媒体实验室向澳大利亚国立大学、中国香港科技大学以及华南理工大学的师生发出邀请,一同前往腾讯多媒体实验室参观访问,并就未来进一步展开校企合作进行了热烈的探索与讨论。
目前,仅在音频领域,多媒体实验室所打造的包括唱歌修音、语音增强、端到端音频评估等解决方案,已在腾讯公司内外的众多产品中进行应用。此外,多媒体实验室有近50项提案被下一代视频编码标准VVC/H.266采纳。在虚拟现实(VR)、点云(PCC)、网络传输协议 (DASH)、多媒体系统(OMAF、CMAF、NBMP)等相关多媒体标准中,也取得了突破性进展,获得多项标准核心专利,多名团队成员在多个全球标准组织担任董事、编辑、领域主席等重要席位。与此同时,多媒体实验室也大力投入国家自主标准建设,成为国际行业标准不可忽视的影响者。

币聪财经-新秀社交媒体内容之王STEEM目前处于多月斐波纳契重要支撑位
在过去的24小时交易中,加密货币Steem的价格下跌了2.24%。目前,Steem的交易价格为1.40美元,过去7个交易日内价格小幅上涨0.9%。Steem由联合创始人Ned Scott和Daniel Larimer于2016年推出。Daniel Larimer是一位经验丰富的加密开发人员,负责开发BitShares,Steem以及最近的EOS等项目。Steem平台开始成为基于区块链的社交媒体网络,允许内容创作者和社交媒体参与者获得奖励。Steemit平台是所有魔术发生的地方。内容创建者创建他们的内容并将其发布到Steemit平台,供其他用户前来查看。然后,用户可以选择喜欢,分享和赞成内容,以及向他们喜爱的内容创建者提供小额捐赠。Steemit令人着迷的是它完全分散了。它不像reddit那样在中央服务器上运行。相反,它是在区块链上运行的,并且非常流畅,除非你被告知,否则你无法告诉它是基于区块链的。该平台获得了大量的支持,每天都有大量的内容创作者。有关Steem和Steemit的更多信息,请参阅我们的“ 什么是Steem ”指南和Steemit的评论。这个27个月大的硬币目前在整个行业的整体市值排名中排名第36位。加密货币目前的市值总计为3.72亿美元。随着加密货币在过去30个交易日下跌17.51%,过去90个交易日下跌64%,它有重大损失。让我们继续分析Steem长期的价格行为。价格分析 STEEM / USD - 长期 - 每月图表分析上面的超长期月度图表,其中每个柱形代表1个月的时间段,我们可以看到加密货币经历了一个令人难以置信的长期看涨运行,在两个波浪中分开,整个2017年价格行动从低点0.15美元开始在2017年4月2日,并在2018年1月3日升至9.25美元的历史新高。这是前所未有的价格上涨,从低到高共计3,700%。我们可以看到市场在创出历史新高之后开始滚动。价格行动曾在.618斐波纳契回撤中短暂获得支撑,定价为3.62美元。这是从上述整个看涨运行中测量的回撤。价格行动未能保持在这一水平之上并继续下跌,直到它在目前交易的位置获得支撑,在.886斐波纳契回撤价格为1.18美元。我们可以看到这一支撑位受1.272斐波纳契延伸下行支撑,价格为1.27美元。这个向下的斐波那契延伸是从2018年1月看到的整个看跌波动来衡量的。让我们继续分析最近一段时期的价格走势,以突出任何潜在的支撑和阻力区域。STEEM / USD - 中期 - 每日图表从上述中期市场分析市场,我们可以看到,2018年4月价格行动从2018年4月1日的1.32美元的低点开始并在2018年4月27日延伸至4.76美元的高点时,价格走势较小。这是从低到高的总价格上涨250%。5月份市场继续走低,跌破100日均线,直至获得长期支撑.786斐波纳契回撤价格为2.09美元。然而,市场未能保持这一水平并且在6月份继续下跌,直到获得支撑位于.886斐波纳契回撤位1.18美元。短期下行1.272斐波那契延伸的价格为1.37美元,进一步支撑了这一支撑区域。如果在过去一年中看到的看跌轨迹仍在继续,我们预计将在.886斐波纳契回撤位置再次获得大幅支撑,定价为1.18美元。如果看跌压力可以推动市场低于这个水平,我们预计即时支撑位于中期下行1.414斐波那契延伸定价0.98美元,随后下行1.618斐波那契延伸定价0.43美元。或者,如果市场看涨势头可能增加,我们预计直接阻力位于1.80美元附近的月度高位。预计长期阻力位于此水平之上.786斐波纳契回撤位于2.09美元。值得一提的是,由于100日均线位于该区域附近,目前徘徊在2美元左右的区域,因此这一阻力位将需要大幅动能。RSI指标目前正在略微看跌交易,略低于50手。如果我们预期看涨势头重新进入市场,我们将需要看到RSI突破50手并继续缓慢上涨。让我们继续分析长期相对于比特币的价格行为。STEEM / BTC - 长期 - 每月图表从长期来看分析相对于比特币的市场,我们可以看到2017年是一个令人难以置信的看涨年份,因为价格行动从2017年3月13日的8,825 SATS低点开始,并在6月9日延伸至99,998 SATS的历史新高,2017年。这是从低到高的价格上涨1,500%。市场在2017年下半年开始下跌,直到2017年12月找到趋势的底部。我们可以看到价格走势继续下行再次下跌。市场目前处于长期支撑位.886斐波那契回撤价格为16,436 SATS。此Fibonacci回撤是从上面的整个看涨运行轮廓测量的。让我们继续在最近一段时间内进一步分析市场,以突出潜在的支撑和阻力区域。STEEM / BTC - 长期 - 每日图表在较短的时间内分析市场,我们可以看到,当价格行动从2017年12月7日的8,825 SATS低点开始并在2018年1月25日升至60,359 SATS的高点后,STEEM再次看涨。这是价格上涨总计610%。在创下历史新高后,市场继续下跌,在2月份跌至100日移动平均线,直到短期内获得支撑.786斐波纳契回撤价格为20,041 SATS(以黑色绘制)。这个短期的斐波那契回撤是从上面概述的整个610%的价格上涨来衡量的。市场继续在4月份进行另一次较小的看涨运行,就像加密货币市场的其他部分一样,但在5月和6月期间延续,直到它在长期目前交易时获得支撑.886斐波纳契回撤(以黄金计算)售价16,436 SATS。如果市场继续看跌压力,我们预计即时支撑位于短期.886斐波纳契回撤(以黑色绘制),定价为14,916 SATS。如果市场确实将其做得如此之低,那么到目前为止它将在2018年创造新的交易低点。或者,如果多头可以重返市场,我们预计当前阻力位于100天移动平均线,目前徘徊在23,000 SATS手柄附近,随后是长期.786斐波纳契回撤,定价为25,890 SATS。原文:https://www.investinblockchain.com/price-analysis-steem/作者:Yaz Sheikh编译:bsatoshi稿源译:https://www.bsatoshi.com

喜欢社交就去社交,不必刻意去减少|SNF 社交斋戒特写之一
“我错过了一个亿的红包呀!”小X语速很快地说出这句话,脸上露出痛心的表情。专业年会那天晚上,群里人人发大红包,她自然也发了,却因为斋戒没法一直守在群里拼手速,所以除了自己的红包以外一个红包也没抢到。 刚刚过去的十五天对她而言有些艰难。 ——1800个好友的社交达人 收到斋戒是在一个周日晚上的七点钟,斋戒将在一个小时后开始。正在看电影的小X匆忙编辑了一条朋友圈:“我参加了一个社交网络斋戒活动,马上要进入斋戒期,每天只能用30min微信,大家可以用其他任何方式联系我。”配图用的是社交网络斋戒计划的手环照片。“当时我就是有点措手不及的感觉。”她回忆说。 在所有斋戒计划的参与者中,小X也是微信好友数量最多的之一。现在的1800多个是她已经删过几百个之后的结果。 小X是国内最早进入网络社交领域的用户。2004年,还是初中生的小X就开始在网上做粉丝团,活跃在现在已经被腾讯关闭的QQ聊天室,在论坛回帖,在雅虎部落发言,当过2003年上线的百度贴吧的第一批吧主,还是新浪博客的元老博主。微博内测时,小X也是第一批用户。现在,她运营着自己的微信公共号、会录歌发布、也会在映客上直播。好友中,既有身边的同学、曾经的同事,还有豆瓣来的豆友。 “好友里面,微博过来的比较少,粉丝都爱加QQ。所以说我对社交软件研究得比较多,也好奇减少微信使用对生活的影响有什么影响,为什么大家都离不开微信呢?当然,参与活动的初衷还是想减少无效社交,更专注在生活和学习上。”就怀着这样的小心思她参加了这一次的斋戒实验。 ——社交不该让我患得患失 在避免无效社交这点上,小X觉得斋戒取得了一些成效,她说:“有些人在联络时发现有些困难,没那么方便,就不想再联络,这些人可能本来就不很重要,所以丢失了一些这样的人挺好的;有些人你确实不想联系,这也是一个借口,可以不去辛苦维系这种关系了。” 曾经小X不太愿意删一些曾经有交集但是由于客观或主观因素已经疏远了的朋友。患得患失让她开始产生了一些焦虑,“他不会在你朋友圈点赞,你也不会去他朋友圈点赞,以后也没有联系,为什么要存在在彼此的微信里面?”她有时会这样问自己。她开始有意调整自己的社交关系。她打算区分出来有些朋友确实是以后不会联系的,哪些朋友是还有可能联系的。她愿意把更多的重心放在志同道合的人身上,简化弱关系和一些酒肉朋友。 “以前我是那种很辛苦在维系所有关系的人,非常累。微信上很多人,以前天天在一起的也有,当你的圈子变了以后,很久没有联系,发现根本就回不到以前的状态了。有些二十几年的朋友,但他跟你三观真的不合,你们以后还是往两个方向走,辛苦地维持这段关系为什么呢?就因为交情久吗?现在就觉得没有必要,所以斋戒期间我开始改变自己的交友策略。” 小X最喜欢与有着同样偶像的粉丝朋友交往。在她看来,粉丝至少在喜欢同一个明星这件事情上是契合的,因此不管三观合不合,彼此之间都能够非常信任,不会在意他人的背景。2008年,她刚上大学,是毛孩的粉丝。去参加西安粉丝见面时人生地不熟的她遇到了一个非常棒的西安本土粉丝,不仅成为了小X那次行程的最佳向导,也在日后成为了她的密友。 小X一直觉得信息秒回是最好的聊天技巧。斋戒之后,她却改变了自己有消息必回的强迫症。“以前有人一直给我发信息到我都有点不耐烦聊不下去了我就会回消息说你不要跟我说话了。但是现在就可能你给我发十条消息我都不会回,因为觉得没有必要。”这让她在吃饭或者聊天的时候更加专注,不会频繁的查看手机,这个习惯也在斋戒后留了下来。 ——陷入错失恐惧 小X没有数过自己的微信群数量,但她觉得可能超过了一百个。她并不喜欢在群里聊天,除非是自己开启一个话题,或者话题以自己为主。”有的时候,被@了,就要回去看到底是哪里提到了我?结果翻了好久,发现是@所有人。”说道这里,她也笑了起来。 斋戒初期,她回归了微博和QQ,刷淘宝的时间也大大增加,有时还会下意识打开和微信APP图标很像的某软件,总的手机使用时间并没有下降。即使是后来其他软件的使用时间整体下降了,小X仍然没有感受到自己注意力更加集中,反而感到心理压力有些增加。“微信消息虽然你没看,但收到了嘛,有很多待处理的消息在那里,内心还是有点儿惦记的。收到了生日祝福也没有回复,这些东西你肯定还是有一点儿放不下的。”她说。 关闭了微信消息提醒之后,自己打开微信的频率反而更高。因为总是担心错过什么重要消息,隔不到一个小时她就要点开一次微信,当进入微信界面看到朋友圈或是订阅号的小红点,又忍不住刷一刷,时间总是超出计划要求,这也让她格外烦躁。 导师开会的通知被发在了微信群里并提到所有人,没有人因为小X的斋戒宣言而额外用其他方式抄送给她。课程的老师也把期末复习的重要资料放在了一个个课程群里。“文件一下就刷过去了,还得回头找,因为考试要用也不能不看,把资料收藏下来,也要打开微信的收藏夹去看。”小X有点烦恼,她希望课代表能给每个选课同学发送统一的邮件,”但是没办法,都是在微信群里发,不知道这个世界为什么变成这个样子。”因为期末考试的一些要求、资料,这些事情我都往后推了。但凡要用微信去交流的事情,都想往后拖,等着斋戒结束之后再做。”其实能不能在自习室坐下去可能和控制社交网络使用或许并没有那么相关,而本质上是个人的特质:“可能我不是特别爱学习,特别勤奋的那种人,社会活动比较多一些;如果说那种比较勤奋的人,可能刚好微信关了,他就可以静下心来一直好好学习,但是我并没有因为这件事情就把这些东西断了,有微信和没微信都不会让我注意力集中在重要的事情上。” 斋戒第三天,小X重新打开了消息提醒,甚至有一段时间,小X在等待着斋戒的结束,甚至有些着急。 ——喜欢社交就去社交,不必刻意减少 小X的在英国的好朋友就为了和她保持联络被迫新下载了QQ。她准备斋戒后好好和几个朋友解释一下情况:“其实有三五个朋友是应该经常联系的,但因为斋戒就没有联系,本来以为不用微信我的社交会转到别的方式,但是事实上没有人愿意跟你一起转。我其实是在等着斋戒结束,觉得可以好好地找他们说这件事情了。” 斋戒的第一天正是11号的晚上,双十二购物节的开端,“我妈微信跟我说要我帮她抢京东的电器,我就跟她说我不能上微信,我妈很生气,就让我表弟去买,把我排除了。后来有一天我爸要买羽绒服,在微信上发了很多图片给我,让我帮他挑,我也没办法做到。”她没想到斋戒还能惹得妈妈生了气。 斋戒结束后的第二天,小X的微信全天使用时长又到达了5、6个小时的水平。除了补斋戒期间的微信课程群中错失的信息用去的1.5小时,小X觉得剩下的4个小时就是回到了斋戒前的水平。但是每次用微信的时候她都感到有点儿愧疚,回完消息就立刻退出后台,这似乎也是斋戒无意中留下来的“后遗症”。 但是冷静下来,小X收获的最大感悟就是:不喜欢社交也不用强迫他社交,喜欢社交就去社交,也不用刻意去减少。 小X解释道:“有的人会觉得自己特别不擅长社交,或者是很烦这么多社交,其实社交这个事情的多和少与你的个人发展可能没关系,因为我有朋友就是那种一天可能就看一次手机的人,你永远找不到这个人,但也没有人缘不好或者引起其他问题。每个人找到自己舒服的状态就OK。而对我来说,我觉得社交是我生活中最大的一部分,我也应该学会享受这样的生活方式。”小X坦然说道。

报告|移动IM厂商从何种途径有效的教育企业用户?
T客汇官网:tikehui撰文 |移动信息化研究中心分析师 于秀欣近年来,企业级IM市场越来越火热,随着移动互联网的来临,移动IM也备受企业级市场的青睐,企业希望将此成为员工沟通交流的载体,但是在互联网信息铺天盖地的现在,从何种渠道有效的教育企业用户是却是厂商的一大困扰。
重要说明:本文中的中小型企业是指500人以下的企业,中大型企业是指500人以上的企业。1.移动IM走在“企业标配工具”的路上根据数据显示,超过半数的企业已使用移动IM。由于移动IM即时性强、可追溯性强,很多企业更愿意通过移动IM进行试水。那么厂商是从何种渠道有效的教育企业用户的呢?2. 厂商利用线上信息渠道教育用户颇见成效数据表明,在移动IM企业用户中,通过移动社交媒体、专业技术、产品论坛和传统互联网媒体获取信息是企业用户最常用的途径。其中,有46%的用户通过移动社交媒体获取信息,有45%的用户通过专业技术、产品论坛获取信息,有36%的用户通过传统互联网媒体获取信息。值得注意的是:这三种途径也是企业用户认为最有效的途径!原因在于,线上信息渠道提供的信息量大,信息传播范围广,更新速度快,企业用户可以从中发现很多有价值的信息,越来越多的“行业专家”倾向于在媒体网站、产品论坛发表自己的观点,信息价值不断提升;而线下渠道相对与线上信息渠道提供的信息量较少,信息更新速度较慢,比如通过系统集成商获取产品信息。企业用户通过系统集成商获取移动IM产品信息的频率也比较高,但是却并不认为这种途径有效的,系统集成商提供的信息虽然专业性强,但是时效性却相对较低。3. “教育”“高颜值”用户,“第三方咨询”应该更专业中小型企业常通过移动社交媒体、专业技术、产品论坛和传统互联网媒体获取信息,并且认为这三种途径是最有效的信息获取途径,与总体的变化趋势相同。中大型企业更倾向于通过专业技术、产品论坛、系统集成商、传统互联网媒体、第三方信息咨询机构、厂商销售部门和移动社交媒体获取移动IM产品信息,但是在这几种获取产品信息的途径中,第三方信息咨询机构获取信息的有效性较低。原因在于,对于中大型企业而言,其使用IM的应用场景更为复杂,对产品稳定性、高并发承载能力、还有信息安全性有更高的要求,而第三方信息咨询机构可能对企业用户的业务特点、客户属性,以及企业内部的业务流程了解并不深入,不能满足中大型企业对移动IM的产品开发、系统咨询、技术服务等方面高要求。因此,目前国内缺乏专业的第三方信息咨询机构,企业用户很难从其获取有效的信息。

java 论坛_5 个最好用的 Java 开源论坛系统
大家好,又见面了,我是你们的朋友全栈君。大家好!我是 Guide 哥,Java 后端开发。一个会一点前端,喜欢烹饪的自由少年。最近有点小忙。但是,由于前几天答应了一位读者自己会推荐一些开源的论坛系统,所以,昨晚就简单地熬了个夜,对比了很多个开源论坛系统之后,总结成了这篇文章。这篇文章我一共推荐了 5 个论坛类开源项目,除了有 1 个是基于 PHP 开发之外,其他都是基于 Java ,并且大部分都是基于 Spring Boot 这个主流框架来做的。欢迎小伙伴们在评论区补充啊!ღ( ´・ᴗ・` )比心1. NiterForumGithub 地址:https://github.com/yourkevin/NiterForum[1]官网地址:https://niter.cn/forumStar : 0.5k简介:尼特社区-NiterForum-一个论坛程序,几乎具有一个论坛/社区所应该有的全部功能-后端 Springboot/MyBatis/Maven/MySQL-前端 Thymeleaf/Layui-可供初学者,学习、交流使用。技术栈: 后端 Springboot + MyBatis + Maven + MySQL 前端 Thymeleaf + Layui推荐等级 :⭐⭐⭐⭐⭐评价:可以说 NiterForum 提供了一个论坛所能提供的所有功能,功能特性覆盖的非常全面。但这并不是这次推荐他的主要原因。作为本次论坛项目中第一个推荐的项目,NiterForum 的 NB 之处就是:他提供 NiterApp,完美适配了 NiterForum,支持 app 端扫码登录!2. SymphonyGithub 地址:https://github.com/88250/symphony[2]官网地址:https://ld246.com/[3]Star : 0.7k简介: 一款用 Java 实现的现代化社区(论坛/问答/BBS/社交网络/博客)系统平台。技术栈: Latke (作者自研的以 JSON 为主的 Java Web 框架)+jsoup[4] + Jodd[5]推荐等级 :⭐⭐⭐⭐评价:讲真,Symphony 是笔者目前见过的论坛项目中功能最齐全的一款(没有之一),满足多维需求:面向内容、面向知识问答、面向用户分享、交友、游戏等。而且 Symphony 风格时尚,充满创新、好玩的特性。交互体验一级棒。这个项目的缺点也很明显,那就是项目使用的技术栈不是主流,比较小众(不过,作者自研 Java Web 框架的精神还是非常值得赞赏的!)。sym3. 码问社区Github 地址:https://github.com/codedrinker/community[6]官网地址:http://www.mawen.co/?sort=hot[7]Star : 1.1k简介:开源论坛、问答系统,现有功能提问、回复、通知、最新、最热、消除零回复功能。技术栈:SpringBoot + MyBatis+MySQL/H2+Flyway推荐等级 :⭐⭐⭐⭐⭐评价:码问社区的作者是阿里巴巴的一位大佬,开源了很多有意思的项目,码问社区就是其中一款,采用 SpringBoot + Vue 等主流技术栈打造,并配有整个开发过程的视频讲解[8]。实战项目首推。4. MDclubGithub 地址:https://github.com/zdhxiong/mdclub[9]官网地址:https://community.mdclub.org/[10]Star : 0.5k简介:MDClub 漂亮、轻量且好用,它能让在线讨论变得更加轻松愉悦技术栈:PHP+MySQL推荐等级 :⭐⭐⭐⭐评价 :MDclub 是一款简约风格的论坛项目。漂亮、轻量且容易上手。代码实现基于 MDUI 框架,分层分明。网站适配多种终端,从手机、ipad 到大屏显示器,均能自动适配,并且提供根据操作系统的主题,自动切换亮色主题和暗色主题。这个特性真的超赞的~mdclub.png5. 朋也社区Github 地址:https://github.com/tomoya92/pybbs[11]官网地址:https://tomoya92.github.io/pybbs/[12]Star : 1.1 k简介:更实用的 Java 开发的社区(论坛)技术栈:Spring-Boot + Mybatis-Plus + MySQL推荐等级 :⭐⭐⭐⭐评价:朋也社区基于 Java 语言,采用主流的 Java Web 开发框架(SpringBoot)进行开发。个人觉得朋也社区最大的亮点是在设计层面上支持高度的可定制化。要实现这点很不容易,需要有很强的设计能力,并且朋也社区在实现过程对于各种集成的服务支持配置化(可随意开启或关闭)。如果有帮助的话,不要吝啬你们手中的在看和赞!“怼”起来!以上 4 本优质原创 PDF 私信我回复“资料”即可免费领取。发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/156741.html原文链接:https://javaforall.cn

借势AI系列:人工智能驱动的舆情分析与社交媒体监测【技术应用与实战示例】
随着社交媒体的广泛使用,舆情分析和社交媒体监测在企业、政府和媒体机构中变得至关重要。人工智能(AI)的进步为舆情分析提供了强大的技术支持,帮助分析和预测社交媒体平台上的趋势和情绪。本文将探讨如何使用AI技术实现有效的舆情分析,并提供相应的代码实例。一、舆情分析的背景与重要性在当前的数字化时代,社交媒体已成为人们获取信息、表达观点的重要渠道。舆情分析通过监测和分析社交平台上的数据,帮助机构了解公众情绪和趋势,支持决策制定。传统的人工分析往往难以应对数据规模大、信息更新频繁等挑战,而人工智能的引入使得舆情分析能够更加高效、精准。二、基于人工智能的舆情分析技术2.1 自然语言处理(NLP)在舆情分析中的应用自然语言处理是舆情分析的核心技术。NLP方法用于文本处理、情感分析、主题提取等,帮助机器理解并分析社交媒体文本。以下是NLP在舆情分析中的主要应用:文本预处理:对社交媒体文本进行分词、去除停用词、词干化等操作。情感分析:通过机器学习模型或深度学习模型,识别文本中的情绪倾向(如正面、中性或负面)。主题建模:提取社交媒体文本中出现的主要话题,帮助监测热点事件和趋势。2.2 常用的机器学习模型在舆情分析中,常用的机器学习模型包括情感分类模型(如支持向量机、朴素贝叶斯)和深度学习模型(如卷积神经网络CNN、长短期记忆网络LSTM)。此外,预训练的语言模型(如BERT、GPT-3)因其强大的语义理解能力,广泛应用于舆情分析。image-20241031193141964三、利用Python进行舆情分析:代码实例在本节中,我们将使用Python、NLP和机器学习技术,通过获取Twitter数据实现舆情分析的基本流程。3.1 数据获取可以使用Twitter的API接口收集数据(需要注册并获取API密钥),本文为了演示,将模拟收集到的数据。代码语言:python代码运行次数:2复制Cloud Studio 代码运行import pandas as pd
# 模拟数据集
data = {
"text": [
"I love the new product! It's amazing!",
"The recent update is terrible and disappointing.",
"Looking forward to the new features in the next release!",
"The product is overpriced and not worth it.",
"Excellent customer service and support!",
"The latest release has so many bugs, very frustrating."
],
"label": [1, 0, 1, 0, 1, 0] # 1: Positive, 0: Negative
}
df = pd.DataFrame(data)
print(df.head())3.2 数据预处理在进行分析之前,需要对文本数据进行清洗和预处理,包括去除标点符号、停用词以及转换为小写。代码语言:python代码运行次数:1复制Cloud Studio 代码运行import re
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
import nltk
nltk.download("stopwords")
nltk.download("punkt")
# 数据清洗函数
def preprocess_text(text):
# 移除标点符号
text = re.sub(r"[^\w\s]", "", text)
# 转换为小写
text = text.lower()
# 去除停用词
tokens = word_tokenize(text)
tokens = [word for word in tokens if word not in stopwords.words("english")]
return " ".join(tokens)
# 应用数据清洗
df["cleaned_text"] = df["text"].apply(preprocess_text)
print(df[["text", "cleaned_text"]].head())3.3 情感分析模型构建接下来,使用逻辑回归(Logistic Regression)模型进行情感分类。为简单起见,我们将使用scikit-learn库进行模型训练。代码语言:python代码运行次数:0复制Cloud Studio 代码运行from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report
# 特征提取
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(df["cleaned_text"])
y = df["label"]
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 训练逻辑回归模型
model = LogisticRegression()
model.fit(X_train, y_train)
# 预测并评估
y_pred = model.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))3.4 使用BERT进行情感分析(进阶)我们还可以利用BERT模型进行更复杂的情感分析。BERT模型需要较强的计算资源,这里仅展示代码框架。代码语言:python代码运行次数:0复制Cloud Studio 代码运行from transformers import pipeline
# 使用预训练的BERT模型进行情感分析
sentiment_pipeline = pipeline("sentiment-analysis")
# 示例文本分析
texts = [
"I love the new product! It's amazing!",
"The recent update is terrible and disappointing."
]
# 输出分析结果
for text in texts:
print(sentiment_pipeline(text))四、实时监测与可视化舆情分析的一个关键环节是实时监测和可视化数据变化。可以通过API定时获取数据并更新分析结果,展示在可视化平台上(例如Tableau、PowerBI)。4.1 数据可视化示例代码语言:python代码运行次数:1复制Cloud Studio 代码运行import matplotlib.pyplot as plt
# 模拟正负情绪的比例数据
sentiment_counts = df["label"].value_counts()
sentiment_counts.plot(kind="bar", color=["blue", "red"])
plt.title("Sentiment Analysis")
plt.xlabel("Sentiment")
plt.ylabel("Count")
plt.xticks([0, 1], ["Negative", "Positive"], rotation=0)
plt.show()image-20241031193120844五、舆情分析的挑战与应对策略虽然人工智能在舆情分析中提供了强大的工具,但其在实际应用中面临许多挑战。以下将详细讨论主要挑战,并探讨如何通过改进技术和方法来应对这些问题。5.1 数据量与数据质量社交媒体平台每天生成大量的数据,实时分析的需求导致处理这些数据变得尤为困难。除此之外,社交媒体数据的质量参差不齐,存在大量的噪声信息(如广告、重复内容、虚假消息等),这些噪声会干扰分析结果。应对策略:数据清洗与预处理:使用去噪算法和文本过滤器来清理无关或误导性内容,从而提高数据质量。实时流处理技术:借助Kafka、Spark Streaming等实时数据流处理工具,能够高效地处理和分析海量数据。使用大规模分布式计算:云计算平台(如AWS、Google Cloud)提供的分布式计算和存储支持,能够提高处理大规模社交媒体数据的能力。5.2 语言多样性和语境理解在社交媒体上,人们使用不同的语言和方言,且语境多变,传统的NLP模型很难正确解读这些信息。特定的表达、情绪和文化背景可能导致模型对情感和话题的误判。应对策略:多语言模型:采用多语言预训练模型(如mBERT、XLM-R),这些模型可以处理多种语言的文本,有助于提高分析准确性。语境增强技术:通过强化学习(Reinforcement Learning)和语境理解技术,可以让模型在特定语境中更好地捕捉情绪和态度。人工校准:结合专家的人工审核,特别是在关键事件和敏感主题上,确保分析的准确性和可靠性。image-202410311932086385.3 实时性需求与高效性舆情的实时性对监测系统提出了较高的要求,而人工智能模型的复杂性往往会影响响应速度,尤其是深度学习模型在处理实时数据时的性能瓶颈较为明显。应对策略:模型轻量化:采用蒸馏(Distillation)、剪枝(Pruning)等技术压缩模型,提高其响应速度。缓存机制:对热点话题进行缓存,使其在多次访问时快速响应。边缘计算:将部分计算任务分配至边缘设备或本地服务器,降低云端的计算压力。5.4 社交媒体平台限制社交媒体平台对数据获取设置了许多限制,尤其在数据隐私法规(如GDPR)和平台策略(如API速率限制)的约束下,获取和处理数据可能面临较大困难。应对策略:使用合法数据源:确保数据获取的合法性,使用平台提供的API或第三方数据提供商。构建匿名数据分析流程:在数据分析过程中遵循隐私保护原则,避免个人信息的泄露。利用代理及缓存机制:在合理合规的情况下,适当利用缓存和代理服务,优化API速率使用。六、AI技术在舆情分析中的新趋势随着人工智能的发展,越来越多的新技术被引入到舆情分析中,为未来的应用带来了许多新的可能性。image-202410311932565736.1 深度学习和自监督学习传统的有监督学习在大量标注数据的需求上存在瓶颈,而自监督学习利用未标注的数据生成标签,有望在舆情分析中发挥更大作用。应用实例:使用自监督BERT模型进行舆情分析BERT等自监督学习模型已经在NLP领域取得了显著成果。以下代码展示了如何使用自监督BERT模型处理舆情数据:代码语言:python代码运行次数:1复制Cloud Studio 代码运行from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
# 加载BERT自监督学习模型
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased")
# 示例文本
texts = [
"This product is revolutionary and outstanding!",
"I'm very disappointed with the recent changes."
]
# 数据预处理
inputs = tokenizer(texts, return_tensors="pt", padding=True, truncation=True)
outputs = model(**inputs)
logits = outputs.logits
predictions = torch.argmax(logits, dim=-1)
# 输出预测结果
print("Predicted Labels:", predictions)6.2 强化学习与动态话题检测强化学习(RL)能够自适应地调整舆情分析的监测策略。例如,在话题突发时自动调整模型参数,使分析系统更加灵活。动态话题检测应用示例通过将强化学习与动态话题检测算法结合,系统可以根据实时变化的社交媒体数据,自动检测和聚类新兴话题。Python中可以使用Dynamic Topic Model(DTM)库实现这种分析。代码语言:python代码运行次数:0复制Cloud Studio 代码运行from dtm import DynamicTopicModel
# 模拟文本数据
documents = [
"New updates are rolling out soon.",
"The latest product has some interesting features.",
"The update has some major bugs, and users are frustrated."
]
# 构建动态话题模型
dtm = DynamicTopicModel(n_topics=3)
dtm.fit(documents)
# 输出话题模型结果
print("Topic Distributions:", dtm.get_topic_words())6.3 大规模预训练模型(如GPT-4)的应用大规模预训练模型具有强大的语义理解能力,可以更加细致地分析社交媒体内容的情感、立场等信息。GPT-4等模型支持上下文的深度理解,使其在复杂话题和长文本分析中具备优势。使用GPT-4生成舆情摘要GPT-4可以自动生成舆情摘要,帮助舆情监测团队快速理解关键内容和观点。以下为伪代码展示GPT-4的应用(需OpenAI API支持):代码语言:python代码运行次数:0复制Cloud Studio 代码运行import openai
# 设置API密钥
openai.api_key = "your-api-key"
# 输入长文本
long_text = "Here goes the social media data text..."
# 生成舆情摘要
response = openai.Completion.create(
engine="text-davinci-004",
prompt=f"Summarize the following social media text: {long_text}",
max_tokens=150
)
# 输出摘要
print("Summary:", response["choices"][0]["text"].strip())七、未来展望:人工智能驱动的智能舆情分析系统人工智能在舆情分析中的应用已逐渐成熟,未来的趋势将更加注重系统的自动化、智能化和个性化。以下是AI驱动的智能舆情分析系统的几大展望:7.1 自适应的情绪和立场识别未来的舆情分析系统将更注重语义的细腻处理,不仅限于情绪分析,还会结合立场分析、情感增强等技术,帮助企业更全面地了解用户的意图和立场。例如,通过识别评论中的细微语气,自动判断用户是潜在客户还是流失风险较大的用户。7.2 可解释的舆情分析模型舆情分析的结果对商业决策影响巨大,系统的解释性变得尤为重要。未来的模型将更加关注可解释性,使分析结果透明化。例如,基于注意力机制的模型可以指出预测情绪的关键词或句子,帮助用户理解情感来源。7.3 个性化舆情推送和危机预警未来的系统将能够根据用户需求,进行个性化的舆情推送和危机预警,帮助品牌和政府机构更精准地掌握公众意见。例如,通过分析潜在危机迹象,智能系统可以自动向相关团队发出预警,提前采取措施应对。image-20241031193228734总结在数字化时代,舆情分析与社交媒体监测已经成为企业、政府和各类组织的重要任务。利用人工智能技术,这些任务得以高效、精准地完成。本文从多角度探讨了人工智能在舆情分析中的应用,包括数据获取、情感分析、主题建模、趋势预测等方面,并提供了相应的代码实例,展示了如何运用现代AI工具进行舆情监测。舆情分析面临的挑战,如数据质量、语言多样性、实时性需求等,促使技术不断演进。通过结合自监督学习、多语言模型、强化学习等新兴技术,舆情分析的准确性和效率得到了显著提升。此外,随着深度学习和大规模预训练模型的发展,系统能够更好地理解复杂的情感和语境,为用户提供更为全面的分析结果。展望未来,智能舆情分析系统将朝着自适应、可解释和个性化的方向发展。通过引入更先进的算法和模型,舆情监测将变得更加灵活、敏锐,能够更好地满足组织在动态环境中的需求。这不仅将提升舆情管理的效率,也将为决策者提供更具洞察力的支持。随着技术的不断演变,舆情分析的领域将继续扩展,带来更广泛的应用可能性和商业价值。

基于Spark进行社交媒体数据处理和分析:热点话题、用户情感分析与舆论控制
目录摘要前言社交媒体数据处理和分析舆论控制结束语摘要:本文将介绍如何使用Spark对社交媒体数据进行处理和分析,以生成热点话题、用户情感分析等,并讨论一下如何利用这些分析结果来控制舆论方向,文中将提供详细的代码示例,以帮助读者理解和实践这些技术。前言作为技术圈的一员,想必大家对圈内的先进技术都有很大的敏感度,比如在当今社交媒体普及的时代,以及自媒体“横行”的时代,海量的社交媒体数据包含着丰富的信息和洞察力,我们也是这些信息的直接受众,但是作为技术人对这些信息不仅仅是“被动接收”的状态,我们也要通过技术手段去深挖和利用这些数据信息。从技术角度来看,通过对这些数据进行处理和分析,我们可以获得有关用户行为、热点话题、情感倾向等方面的信息。那么本文就来分享一下借助Spark这样的大数据处理框架,我们能够高效地处理大规模的社交媒体数据,并从中提取有价值的分析结果。所以,本文将介绍如何使用Spark对社交媒体数据进行处理和分析,以生成热点话题、用户情感分析等,并讨论一下如何利用这些分析结果来控制舆论方向,文中将提供详细的代码示例,以帮助读者理解和实践这些技术。社交媒体数据处理和分析由于笔者本身也是相关领域的新手,也是以学习者的身份来写和分享这个话题的内容,肯定会有很多瑕疵和不妥之处,还请相关领域的大佬不吝指正,也欢迎各位读者在评论区留言交流。那么接下来就来分享一下关于社交媒体数据处理和分析的关键步骤,具体如下所示。1、数据收集先来处理数据收集,首先我们需要收集社交媒体数据,其实这一步操作可以通过API访问社交媒体平台来实现,比如某博、小某书等,这里举得例子以可以收集的社交媒体数据来讲,以脸书为例,通过这些API,我们可以获得用户发布的帖子、评论、转发等数据。2、数据清洗和预处理通过上一步关于数据收集之后,接下来就是对收集到的数据进行处理,因为收集到的社交媒体数据往往包含噪声、重复项和无效信息,所以数据清洗和预处理是必不可少的步骤,这里包括去除重复数据、过滤垃圾信息、处理缺失值等。以下是一个使用Spark进行数据清洗和预处理的简单示例,具体的示例代码如下所示:代码语言:actionscript复制from pyspark.sql import SparkSession
from pyspark.sql.functions import col
spark = SparkSession.builder.getOrCreate()
# 读取社交媒体数据
data = spark.read.json("social_media_data.json")
# 去除重复项
data = data.dropDuplicates()
# 过滤垃圾信息
data = data.filter(col("text").isNotNull())
# 处理缺失值
data = data.fillna({"sentiment": "unknown"})3、热点话题分析紧接着是对当前频率比较高、热门话题的分析处理,通过处理后的社交媒体数据,我们可以了解当前的热点话题和讨论趋势,这可以通过对用户的帖子和话题标签进行分析来实现。同样,这里也是举一个使用Spark进行热点话题分析的简单示例,具体的示例代码如下所示:代码语言:actionscript复制# 提取话题标签
hashtags = data.select("hashtags")
# 统计话题出现次数
top_topics = hashtags.rdd.flatMap(lambda x: x).countByValue()
# 获取热门话题
top_topics = sorted(top_topics.items(), key=lambda x: x[1], reverse=True)[:10]
# 打印热门话题
for topic, count in top_topics:
print(f"话题:{topic},次数:{count}")4、用户情感分析通过上面对于热点话题的分析处理之外,还可以对参与话题的用户的观点、看法以及感情相关的分析,也就是除了热点话题,我们还可以分析用户对特定话题或事件的情感倾向,这可以通过对用户的帖子进行情感分析来实现。这里也举一个使用Spark进行用户情感分析的简单示例,具体的示例代码如下所示:代码语言:actionscript复制from pyspark.ml import Pipeline
from pyspark.ml.feature import Tokenizer, StopWordsRemover
from pyspark.ml.classification import LogisticRegression
from pyspark.ml.feature import CountVectorizer
# 分词和去除停用词
tokenizer = Tokenizer(inputCol="text", outputCol="words")
stopwords_remover = StopWordsRemover(inputCol="words", outputCol="filtered_words")
# 特征提取
count_vectorizer = CountVectorizer(inputCol="filtered_words", outputCol="features")
# 情感分类模型
lr = LogisticRegression(featuresCol="features", labelCol="sentiment")
# 构建流水线
pipeline = Pipeline(stages=[tokenizer, stopwords_remover, count_vectorizer, lr])
# 拟合模型
model = pipeline.fit(data)
# 进行情感预测
predictions = model.transform(data)
# 打印用户情感倾向
sentiments = predictions.select("text", "sentiment", "prediction")
sentiments.show()舆论控制通过上面关于热门话题的全方位分析之后,我们可以通过这些分析结果有所洞察,尤其是可以根据这些结果把握舆论导向,也就是说社交媒体数据的处理和分析不仅可以为我们提供有关热点话题和用户情感的信息,还可以用于舆论控制。所以通过监控和分析社交媒体上的讨论,我们可以了解公众对特定事件或话题的态度,并针对性地进行宣传或引导。毕竟不是专业的舆情领域的从业者,所以这里以程序员的角度来看舆论控制这个课题。个人觉得舆论控制的具体方法是需要根据情况而异的,但还是有一些常见的技术手段来做舆论控制,具体如下所示:情感引导:通过在社交媒体上发布积极的信息,引导用户的情感倾向,传递正能量。舆论扩散:通过社交媒体的传播特性,将特定信息迅速扩散给更多的用户,以最短的速度来把控舆论导向。虚假信息识别:通过分析社交媒体上的信息,识别和揭示虚假信息,以维护舆论的真实性和公正性,让谣言快速的“戛然而止”。但是除了上面几个常用手段,需要注意的是,舆论控制必须要在遵守道德和法律的规范,不能用于不正当的目的或伤害他人的利益,需要在法律的框架内进行。结束语通过上文关于基于Spark进行社交媒体数据处理和分析,热点话题、用户情感分析与舆论控制的介绍,想必大家对这块的内容都有深入的了解吧,还是那句话,由于笔者在该领域能力的限制,本文内容只做简单的分享和交流,还请各位读者指正。而且本文只是简单的介绍了使用Spark进行社交媒体数据处理和分析的方法,并展示了如何生成热点话题、用户情感分析以及控制舆论方向,这些技术可以帮助我们更好地理解社交媒体数据中的信息和洞察,并在适当的情况下应用于舆论引导和管理。通过深入理解和实践这些技术,作为开发者的我们,可以更好地应对社交媒体时代的挑战,为社会提供更准确、有用的信息,并促进社会的良好发展,最终实现技术改变生活的目的。

社交的进化(上)|需求演变与社交网络发展
最近,语音社交软件 Clubhouse 借助埃隆·马斯克(Elon Musk)的分享火爆全球。一时间,大批的听众蜂拥而至,直接让 Clubhouse 成为全球最受关注的社交软件之一。从互联网诞生之起,社交产品就一直热情不减,越来越多的人加入社交产品这场持久战。本文不讨论 Clubhouse ,想尝试从发展的角度聊聊社交的进化。一、人类社会对社交需求的演变人类社会对社交需求的演变经历了从最基本的物质和生存需求,到精神层面的需求,再到信息需求的过程。远古时期的人类社会,由于生产力低下,人们的行为以解决最简单的生存问题为主,即争夺水源、获取食物以及寻找休憩之地。而在这个过程中,合作与协调是最简单且有效的行为方式。这其实就是社交的起源。在当时没有语言体系的互动与交互下,人类通过社交帮助自己更好的生存,此时人类对社交的需求也仅仅是满足最基本的物质和生存需求。随着进化,人类逐渐“获得”智能。当懂得如何制作和使用工具时,人类社会开始变得有一点点不一样了。生产力的提高,使得人类的物质生活开始变得富足,自我意识也开始慢慢觉醒。就像人类简史所描述的,人类开始走向那个充满想象力的世界。随着人们构建出越来越多的故事,有了更多的不同的具体的场景,并且每个人都被赋予了更加具体的社会关系,此时的社交需求也逐渐地从物质转移到了精神层面。这里的精神层面是指是否认可彼此所在的故事,是否相信彼此的故事,以及是否愿意进入彼此的故事。在互联网时代,随着沟通成本的降低,人们的连接与互动方式更加丰富,人们也越发的愿意在互联网平台分享自己的故事,寻找属于自己新的故事,在更高的程度上追寻自己内心的认同感以及满足感。所以我们可以知道,社交的演变是从人类之间的互动开始的,并且依托于彼此之间的社会关系,产生了基于物质的需求以及精神的需求。直到如今,随着移动网络时代的不断深化,人们产生了对社交的第三个需求:信息需求。二、信息时代下网络社交与娱乐的发展上文提到的人类对信息的需求是我们当下这个时代的产物。从互联网社交与娱乐发展的历史维度来看:2002 年之前的互联网,Web 1.0 以匿名的信息获取功能为主;2002 年以后,Web 2.0 革命爆发,互联网越来越强调互动,论坛、博客、内容分享等社交媒体日益发展壮大,与现实生活的关系日益紧密,视频、音频等多媒体形式的地位也变得重要;Web 3.0 阶段,人们开始以完全的虚拟生活为娱乐主体,旨在满足精神世界,而现实生活反而仅仅是娱乐的辅助形式。智能设备和无线宽带的普及,使得随时随地浸入虚拟生活变得很容易实现。人们既是内容的消费者又是内容的生产者,人人皆媒体。我们正处于Web 3.0 这个阶段。对于当下的用户来说,新媒体不仅仅是他们获得信息的渠道,也是他们社会关系的一种新的依存空间。在复制、拓展现实中的社会结构与社会关系的同时,新媒体自身作为一种新型社会的属性也日益明晰,而线上、线下社会之间的界限也越来越模糊,逐渐形成了某种意义上的虚拟社会。虚拟与现实的关系,就像一个已经配平的化学方程式。我们可以从虚拟走向现实,也可以从现实通往虚拟。这在某种意义上正如Pony马化腾所言,我们正在走向一个“全真互联网”的新时代。三、“全真互联网”——未来社交的期待去年年底,腾讯内部出了一本2020年度特刊《三观》—— “以一年为单位,记录腾讯的成长和主要变化”,Pony(马化腾)亲自为这本书写了前言,其重要性不言自明。在这篇名为《以正为本,迎难而上》的文章当中,马化腾向腾讯人提出了三个要求:第一是向内看,以一种用户的心态去本能地捕捉用户价值,不是用理性,而是用本能。第二是去一线,无论To B还是To C,每个人都要打破传统界限,尽可能去一线寻找解决问题的方法和思路。第三是往前看,抓住关键机会。最近几年,腾讯深耕“产业互联网”,阿里提出“新零售”,百度则在发力“人工智能”,试图实现弯道超车,其它小巨头也纷纷提出了各自的发展策略,比如小米的“物联网”,京东的“智慧零售”……那么站在整个互联网行业高度,在马化腾的眼中,未来的关键机会是什么?站在2020年末尾,马化腾提出了他对未来的预判——“现在,一个令人兴奋的机会正在到来,移动互联网十年发展,即将迎来下一波升级,我们称之为全真互联网。”什么是“全真互联网”?百度百科目前还没有“全真互联网”的词条,其它搜索结果也显示,在马化腾之外,目前还没有人使用过这个全新概念。综合其文章来看,“全真互联网”的重点是两个字:全和真。所谓全,传统互联网经济大多直接面向消费者,也即是To C,而如今的互联网则在纷纷转型To B,试图去推动企业端进行升级。比如电商界都在推动产业带升级,提出智能制造,反向定制,扶持国产品牌,而腾讯和字节跳动则发布了腾讯会议、飞书等企业级产品。接下来,我们将进入一个打通消费互联网和产业互联网的时代。所谓真,传统的互联网经济,我们都叫它虚拟经济、线上经济。比如我们在淘宝买衣服,只能看到美化了之后的卖家秀,买回家之后的买家秀很可能惨不忍睹。当电商直播崛起,买家与卖家已经能够跳过过度ps的图片,直接上真实视频展示。未来随着“AI试衣”技术成熟,消费者则能“足不出门试遍天下衣”。对“全真”还有一个更为全面的理解是“虚实结合”。我的理解,这正呼应张正友博士提出的“虚实集成世界”。那什么是虚实集成世界?本文下篇会进行详细的介绍。小结随着社会演变和网络发展。当下实时通信、音视频、算法推荐等技术已经走向成熟,5G手机正在普及,各大商场则正在以低廉的价格向消费者普及VR、AR体验。底层技术的升级,新技术与新硬件、新软件的融合,将带来线上与线下的一体化,带来实体与电子在不同场景的新运用。按照Pony(马化腾)的观点:当虚拟世界和真实世界的大门打开,从消费者互联网到产业互联网,将产生无数的应用场景,不仅社交,通信、游戏……当下的各个行业,或许都值得再做一遍。 “我相信又一场大洗牌即将开始。就像移动互联网转型一样,上不了船的人将逐渐落伍。”参考文献资料rct studio:游戏中的社交与慰藉:在不断内卷的时代,寻找另一个孤独的自己经济消费洞察:下一个风口?马化腾提出的“全真互联网”到底啥意思?

用JAVA的DEA算法衡量社交媒体页面的流行度
Measuring the Social Media Popularity of Pages with DEA in JAVA原文作者:Vasilis Vryniotis原文地址:http://blog.datumbox.com/measuring-the-social-media-popularity-of-pages-with-dea-in-java/译者微博:@从流域到海域译者博客:blog.csdn.net/solo95用JAVA的DEA算法衡量社交媒体页面的流行度在前面的文章中,我们讨论了数据包络分析(Data Envelopment Analysis)技术,我们已经看到它如何被用作一个有效的非参数排序算法。在这篇博文中,我们将开发出一个JAVA数据包络分析的实例,我们将用它来评估网络上的网页和文章的社交媒体流行度。该代码是开源的(在GPL v3 license下),您可以从Github免费下载。更新:Datumbox机器学习框架现在是开源的,可以免费下载。查看包com.datumbox.framework.algorithms.dea以查看Java中Data Envelopment Analysis的实现。数据包络分析在JAVA中的实现代码是用JAVA编写的,可以直接从Github下载。它是根据GPLv3许可的,所以可以随意使用它,修改它,或者再分发。该代码实现了数据包络分析(Data Envelopment Analysis)算法,使用lp_solve库来解决线性规划问题,并使用Web搜索引擎优化分析(Web SEO Analytics )索引提取的数据,以构建基于Facebook,Google Plus和推特上分享的一个混合的社交媒体页面流行度矩阵。在前面的文章中介绍了算法的所有理论部分,在源代码中可以找到关于其实现的详细的javadoc注释。(原博文之后数据包络分析(Data Envelopment Analysis)算法及其实现全部简称了DEA,请读者注意,译者注。)下面我们提供一个关于其架构实现的高级别描述:1. lp_solve 5.5 library为了解决各种线性规划问题,我们使用一个名为lp\_solve的开源库。某些特定的lib是用ANSI C编写的,并使用JAVA包装来调用库方法。因此,在运行代码之前,您必须在您的系统上安装lp_solve。该库的二进制文件在[Linux和Windows都可以使用,您可以在lp_solve文档中阅读更多有关安装的信息。在尝试运行JAVA代码之前,请确保您的系统上安装了(相关的)特定库。有关安装和配置库的任何问题,请参阅lp_solve文档。2.DataEnvelopmentAnalysis Class这是DEA算法的主要实现类。它实现了一个名为estimateEfficiency()的公共方法,它获取记录的Map并返回它们的DEA得分。3. DeaRecord ObjectDeaRecord是一个特殊的对象,用于存储我们记录的数据。由于DEA需要分离输入和输出,因此DeaRecord对象将以DEA可以处理的方式分别存储我们的数据。4. SocialMediaPopularity ClassSocialMediaPopularity是一个应用程序,它使用DEA来评估社交媒体网络上Facebook的like,Google的 +1和twitter的Tweets的网页流行度。它实现了两个受保护的方法:calculatePopularity()和estimatePercentiles()以及两个公共方法loadFile()和getPopularity()。calculatePopularity()使用DEA实现根据社交媒体计数来估计页面的得分数。estimatedPercentiles()方法获取DEA分数并将其转换为百分位数。总的来说,百分比比DEA分数更容易解释; 因此当我们说一个网页的流行分数是70%时,这意味着该网页比70%的其他网页更受欢迎。为了能够估计一个特定页面的流行度,我们必须有一个包含其他页面的社交媒体数据的数据集。这是有原因的,因为需要预测哪个网页是受欢迎的,哪些不是,您必须能够将其与网络上的其他页面进行比较。为此,我们使用来自以txt格式提供的Web SEO分析索引的小型的匿名样本。您可以通过从网页上的更多页面提取社交媒体计数来构建自己的数据库。(社交媒体计数,比如点赞数、转发数、评论数)loadFile()方法用于加载DEA的上述统计信息,getPopularity()方法是一种易于使用的方法,可以获取Facebook的like,Google的+1和一个页面的Tweets数量,并以此评估其在社交媒体上的流行度。如何使用数据包络分析的JAVA实现在DataEnvelopmentAnalysisExample类中,我提供了2个不同的关于如何使用代码的例子。第一个例子直接使用DEA方法来根据它们的输出(ISSUES,RECEIPTS,REQS)和输入(STOCK,WAGES)来评估组织单位的效率。这个例子来自DEAzone.com的一篇文章。代码语言:txt复制Map<String, DeaRecord> records = new LinkedHashMap<>();
records.put("Depot1", new DeaRecord(new double[]{40.0,55.0,30.0}, new double[]{3.0,5.0}));
//...adding more records here...
DataEnvelopmentAnalysis dea = new DataEnvelopmentAnalysis();
Map<String, Double> results = dea.estimateEfficiency(records);
System.out.println((new TreeMap<>(results)).toString());第二个示例使用我们的社交媒体流行度应用程序,通过使用来自社交媒体的数据来评估页面的流行度,例如Facebook的like,Google的+1和Tweets。所有的社交媒体计数都被标记为输出,我们传递给DEA一个空的输入向量。代码语言:txt复制SocialMediaPopularity rank = new SocialMediaPopularity();
rank.loadFile(DataEnvelopmentAnalysisExample.class.getResource("/datasets/socialcounts.txt"));
Double popularity = rank.getPopularity(135, 337, 9079); //Facebook likes, Google +1s, Tweets
System.out.println("Page Social Media Popularity: "+popularity.toString());必要的扩展(上面)所提供的代码只是DEA如何被用作排名算法的一个例子。为了改进其实现,需要进行下面的扩展:1.加速(算法的)实现特定的DEA算法实现会评估数据库中所有记录的DEA得分。由于我们需要解决如同数据库中记录数量那样多的线性规划问题,这使得实现变得缓慢。如果我们不需要计算所有记录的分数,那么我们可以显著地加快执行速度。因此,该算法的小扩展可以使我们更好地控制哪些记录应该被解决掉,哪些只能被用作约束。2.扩大社交媒体统计数据库(这篇文章所)提供的社交媒体统计数据库由来自Web SEO Analytics索引的1111个样本组成。为了能够估计更准确的流行(度)分数,需要更大的样本。您可以通过统计来自网络上更多页面的社交媒体计数来创建自己的数据库。3.添加更多的社交媒体网络该实现使用Facebook的喜欢,Google的+1和推文的数量来评估文章的受欢迎程度。不过,来自其他社交媒体网络的指标可以很容易地被考虑在内。您只需要从您感兴趣的网络中构建一个社交媒体数据库,然后扩展SocialMediaPopularity类来处理它们。关于实施的最终意见为了能够扩展(算法的)实现,您必须对Data Envelopment Analysis的工作原理有一个很好的理解。这在前面的文章中已经介绍过了,所以在继续进行任何更改之前,请确保您阅读了之前的教程。此外,为了使用JAVA代码,您必须在您的系统中安装lp\_solve库(参见上文)。如果你在一个有趣的项目中使用这个实现,那么就给我们一条线索,我们将在我们的博客上展示你的项目。另外,如果你喜欢这篇文章,请花点时间在Twitter或Facebook分享。

基于 Go 语言开发在线论坛(三):访问论坛首页
1、整体流程
前面两篇教程学院君分别给大家介绍了基于 Go 语言构建在线论坛的整体设计以及数据表的创建、模型类的编写,今天我们来看看如何在服务端处理用户请求。用户请求的处理流程如下:客户端发送请求;服务端路由器(multiplexer)将请求分发给指定处理器(handler);处理器处理请求,完成对应的业务逻辑;处理器调用模板引擎生成 HTML 并将响应返回给客户端。接下来我们按照这个流程来编写服务端代码。2、定义路由器这里我们基于 gorilla/mux 来实现路由器,所以需要安装对应依赖:代码语言:javascript复制go get github.com/gorilla/mux然后我们遵循仿照 Laravel 框架对 Go 路由处理器代码进行拆分这篇教程介绍的组织架构将路由器定义在 routes 目录下的 router.go 中:
代码语言:javascript复制package routes
import "github.com/gorilla/mux"
// 返回一个 mux.Router 类型指针,从而可以当作处理器使用
func NewRouter() *mux.Router {
// 创建 mux.Router 路由器示例
router := mux.NewRouter().StrictSlash(true)
// 遍历 web.go 中定义的所有 webRoutes
for _, route := range webRoutes {
// 将每个 web 路由应用到路由器
router.Methods(route.Method).
Path(route.Pattern).
Name(route.Name).
Handler(route.HandlerFunc)
}
return route
}将所有路由定义在同一目录的 routes.go 中:代码语言:javascript复制package routes
import "net/http"
// 定义一个 WebRoute 结构体用于存放单个路由
type WebRoute struct {
Name string
Method string
Pattern string
HandlerFunc http.HandlerFunc
}
// 声明 WebRoutes 切片存放所有 Web 路由
type WebRoutes []WebRoute
// 定义所有 Web 路由
var webRoutes = WebRoutes{
}3、启动 HTTP 服务器最后在项目根目录下的 main.go 中引入上述路由器来启动 HTTP 服务器:代码语言:javascript复制package main
import (
. "github.com/xueyuanjun/chitchat/routes"
"log"
"net/http"
)
func main() {
startWebServer("8080")
}
// 通过指定端口启动 Web 服务器
func startWebServer(port string) {
r := NewRouter()
http.Handle("/", r) // 通过 router.go 中定义的路由器来分发请求
log.Println("Starting HTTP service at " + port)
err := http.ListenAndServe(":" + port, nil) // 启动协程监听请求
if err != nil {
log.Println("An error occured starting HTTP listener at port " + port)
log.Println("Error: " + err.Error())
}
}具体代码含义已经在注释中介绍清楚了,这里我们指定 HTTP 服务器监听 8080 端口,使用的路由器正是上述 router.go 中 NewRouter 方法返回的 mux.Router 指针类型实例,这里可以看到引用的时候并没有带上包名前缀,之所以可以这么做是因为通过如下这种方式引入的 routes 包:代码语言:javascript复制. "github.com/xueyuanjun/chitchat/routes"注意到前面的 . 别名,通过这种方式引入的包可以直接调用包中对外可见的变量、方法和结构体,而不需要加上包名前缀。还有一种方式是通过 _ 别名引入,这样一来只会调用该包里定义的 init 方法,我们在上篇教程引入 go-sql-driver/mysql 包时就是这么做的:代码语言:javascript复制_ "github.com/go-sql-driver/mysql"4、处理静态资源
在线论坛涉及到前端静态资源文件的处理,我们可以在 startWebServer 方法中新增如下这两行代码:代码语言:javascript复制r := NewRouter() // 通过 router.go 中定义的路由器来分发请求
// 处理静态资源文件
assets := http.FileServer(http.Dir("public"))
r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", assets))
http.Handle("/", r) // 应用路由器到 HTTP 服务器
...其中 http.FileServer 用于初始化文件服务器和目录为当前目录下的 public 目录。
然后在第二段代码中指定静态资源路由及处理逻辑:将 /static/ 前缀的 URL 请求去除 static 前缀,然后在文件服务器查找指定文件路径是否存在(public 目录下的相对地址)。比如 URL 请求路径为 http://localhost:8080/static/css/bootstrap.min.css,对应的查找路径是:代码语言:javascript复制<application root>/public/css/bootstrap.min.css对于静态资源文件直接返回文件内容,不会进行额外处理。5、编写处理器实现1)首页处理器方法做好上述准备工作后,接下来,我们来创建论坛首页的路由处理器,在 handlers 目录下新增一个 index.go 来定义首页的处理器方法:代码语言:javascript复制package handlers
import (
"github.com/xueyuanjun/chitchat/models"
"html/template"
"net/http"
)
// 论坛首页路由处理器方法
func Index(w http.ResponseWriter, r *http.Request) {
files := []string{"views/layout.html", "views/navbar.html", "views/index.html",}
templates := template.Must(template.ParseFiles(files...))
threads, err := models.Threads();
if err == nil {
templates.ExecuteTemplate(w, "layout", threads)
}
}2)创建视图模板这里我们使用 Go 自带的 html/template 作为模板引擎,需要传入位于 views 目录下的视图模板文件,这里传入了多个模板文件,包括主布局文件 layout.html:代码语言:javascript复制{{ define "layout" }}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=9">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>ChitChat</title>
<link href="/static/css/bootstrap.min.css" rel="stylesheet">
<link href="/static/css/font-awesome.min.css" rel="stylesheet">
</head>
<body>
{{ template "navbar" . }}
<div class="container">
{{ template "content" . }}
</div> <!-- /container -->
<script src="/static/js/jquery-2.1.1.min.js"></script>
<script src="/static/js/bootstrap.min.js"></script>
</body>
</html>
{{ end }}顶部导航模板 navbar.html:代码语言:javascript复制{{ define "navbar" }}
<div class="navbar navbar-default navbar-static-top" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/">
<i class="fa fa-comments-o"></i>
ChitChat
</a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="/">Home</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li><a href="/login">Login</a></li>
</ul>
</div>
</div>
</div>
{{ end }}以及首页视图模板 index.html:代码语言:javascript复制{{ define "content" }}
<p class="lead">
<a href="/thread/new">Start a thread</a> or join one below!
</p>
{{ range . }}
<div class="panel panel-default">
<div class="panel-heading">
<span class="lead"> <i class="fa fa-comment-o"></i> {{ .Topic }}</span>
</div>
<div class="panel-body">
Started by {{ .User.Name }} - {{ .CreatedAtDate }} - {{ .NumReplies }} posts.
<div class="pull-right">
<a href="/thread/read?id={{.Uuid }}">Read more</a>
</div>
</div>
</div>
{{ end }}
{{ end }}引入多个视图模板是为了提高模板代码的复用性,因为对于同一个应用的不同页面来说,可能基本布局、页面顶部导航和页面底部组件都是一样的,关于视图模板的细节,我们在后面视图模板部分会详细介绍,这里简单了解下即可。
3)渲染视图模板我们可以从数据库查询群组数据并将该数据传递到模板文件,最后将模板视图渲染出来,对应代码如下:代码语言:javascript复制threads, err := models.Threads();
if err == nil {
templates.ExecuteTemplate(w, "layout", threads)
}编译多个视图模板时,默认以第一个模板名作为最终视图模板名,所以这里第二个参数传入的是 layout,第三个参数传入要渲染的数据 threads,对应的渲染逻辑位于 views/index.html 中:代码语言:javascript复制{{ range . }}
<div class="panel panel-default">
<div class="panel-heading">
<span class="lead"> <i class="fa fa-comment-o"></i> {{ .Topic }}</span>
</div>
<div class="panel-body">
Started by {{ .User.Name }} - {{ .CreatedAtDate }} - {{ .NumReplies }} posts.
<div class="pull-right">
<a href="/thread/read?id={{.Uuid }}">Read more</a>
</div>
</div>
</div>
{{ end }}其中 {{ range . }} 表示将处理器方法传入的变量,这里是 threads 进行循环。4)注册首页路由最好,我们在 routes/routes.go 中注册首页路由及对应的处理器方法 Index:代码语言:javascript复制import "github.com/xueyuanjun/chitchat/handlers"
// 定义所有 Web 路由
var webRoutes = WebRoutes{
{
"home",
"GET",
"/",
handlers.Index,
},
}6、访问论坛首页访问论坛首页之前,我们将相应的前端资源文件拷贝到 public 目录下,此时项目整体目录结构如下:注:对应的前端资源可以从项目的 Github 仓库获取:https://github.com/nonfu/chitchat.git。然后我们在项目根目录下运行如下代码启动 HTTP 服务器:代码语言:javascript复制go run main.go然后我们在浏览器访问论坛首页 http://localhost:8080:一切与预期一致,下篇教程,我们将基于 Cookie + Session 实现用户认证并创建群组和主题。

Facebook发布虚拟社交平台Spaces,开启全新社交时代
Facebook在一年一度的开发者大会上发布了全新的虚拟社交平台Spaces,将拉近现实和虚拟的距离,实现无缝社交。时下的网络交友方式已经花样百出,人们再也不用担心孤身一人无人问津,只要愿意,随时可以结识天下好友。大名鼎鼎的Facebook如今也不满于单调的网络社交,他们发布了全新的虚拟社交平台Spaces,将结合VR技术拉近社交距离。戴上你的VR眼镜,进入Spaces中,可以利用简单步骤创造出代表自己的卡通人物,还可以自定义发型、脸型、五官、肤色等。但这些卡通人物的美化做的有些抽象,因此颜控玩家可能要对此失望了。创建好人物后,你可以让虚拟人物在Spaces进行社交行为,邀请其他脸书好友或者接受邀请来进入到虚拟世界中。乍一看这种模式有点像EA的模拟人生系列游戏。据悉,用户能够在Spaces中和朋友面对面聊天,用3D虚拟画笔涂鸦、观看影片,以及把玩物品。通过Messenger通讯功能,能够和网络对面的真实世界的朋友进行视频通话,甚至连AR滤镜也能够同步使用,增加了互动的趣味性。遗憾的是,该应用目前为测试版,需配合facebook旗下Oculus的Rift VR眼罩及Touch控制器来进行体验。如果你没有这个设备也没关系,可以受朋友邀请进去体验。Facebook Spaces目前只针对Oculus Rift推出,未来将会扩展到其他VR平台上,应用可以预见也会越来越丰富。

BBS论坛(十三)
13.1点击更换图形验证码(1)front/signup.html代码语言:javascript复制 <div class="form-group">
<div class="input-group">
<input type="text" class="form-control" name="graph_captcha" placeholder="图形验证码">
<span class="input-group-addon captcha-addon">
<img id="captcha-img" class="captcha-img" src="{{ url_for('front.graph_captcha') }}" alt="">
</span>
</div>
</div>(2)static/front/css/signup.css代码语言:javascript复制.sign-box {
width: 300px;
margin: 0 auto;
padding-top: 50px;
}
.captcha-addon {
padding: 0;
overflow: hidden;
}
.captcha-img {
width: 94px;
height: 32px;
cursor: pointer;
}代码语言:javascript复制body {
background: #f3f3f3;
}
.outer-box {
width: 854px;
background: #fff;
margin: 0 auto;
overflow: hidden;
}
.logo-box {
text-align: center;
padding-top: 40px;
}
.logo-box img {
width: 60px;
height: 60px;
}
.page-title {
text-align: center;
}
.sign-box {
width: 300px;
margin: 0 auto;
padding-top: 50px;
}
.captcha-addon {
padding: 0;
overflow: hidden;
}
.captcha-img {
width: 94px;
height: 32px;
cursor: pointer;
}(3)static/common/zlparam.js代码语言:javascript复制var zlparam = {
setParam: function (href,key,value) {
// 重新加载整个页面
var isReplaced = false;
var urlArray = href.split('?');
if(urlArray.length > 1){
var queryArray = urlArray[1].split('');
for(var i=0; i < queryArray.length; i++){
var paramsArray = queryArray[i].split('=');
if(paramsArray[0] == key){
paramsArray[1] = value;
queryArray[i] = paramsArray.join('=');
isReplaced = true;
break;
}
}
if(!isReplaced){
var params = {};
params[key] = value;
if(urlArray.length > 1){
href = href + '' + $.param(params);
}else{
href = href + '?' + $.param(params);
}
}else{
var params = queryArray.join('');
urlArray[1] = params;
href = urlArray.join('?');
}
}else{
var param = {};
param[key] = value;
if(urlArray.length > 1){
href = href + '' + $.param(param);
}else{
href = href + '?' + $.param(param);
}
}
return href;
}
};(4)static/front/js/signup.js代码语言:javascript复制$(function () {
$('#captcha-img').click(function (event) {
var self= $(this);
var src = self.attr('src');
var newsrc = zlparam.setParam(src,'xx',Math.random());
self.attr('src',newsrc);
});
});(5)front/signup.html中引用js和css代码语言:javascript复制 <script src="{{ static('common/zlparam.js') }}"></script>
<script src="{{ static('front/js/front_signup.js') }}"></script>
<link rel="stylesheet" href="{{ static('front/css/front_signup.css') }}">现在点击验证码,就可以更换验证码了。13.2.短信验证码(1)utils/alidayu.py代码语言:javascript复制# 仙剑论坛-阿里大于短信验证码sdk
import hashlib
from time import time
import logging
import requests
class AlidayuAPI(object):
APP_KEY_FIELD = 'ALIDAYU_APP_KEY'
APP_SECRET_FIELD = 'ALIDAYU_APP_SECRET'
SMS_SIGN_NAME_FIELD = 'ALIDAYU_SIGN_NAME'
SMS_TEMPLATE_CODE_FIELD = 'ALIDAYU_TEMPLATE_CODE'
def __init__(self, app=None):
self.url = 'https://eco.taobao.com/router/rest'
self.headers = {
'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8',
"Cache-Control": "no-cache",
"Connection": "Keep-Alive",
}
if app:
self.init_app(app)
def init_app(self,app):
config = app.config
try:
self.key = config[self.APP_KEY_FIELD]
self.secret = config[self.APP_SECRET_FIELD]
self.sign_name = config[self.SMS_SIGN_NAME_FIELD]
self.api_params = {
'sms_free_sign_name': config[self.SMS_SIGN_NAME_FIELD],
'sms_template_code': config[self.SMS_TEMPLATE_CODE_FIELD],
'extend': '',
'sms_type': "normal",
"method": "alibaba.aliqin.fc.sms.num.send",
"app_key": self.key,
"format": "json",
"v": "2.0",
"partner_id": "",
"sign_method": "md5",
}
except Exception as e:
logging.error(e.args)
raise ValueError('请填写正确的阿里大鱼配置!')
def send_sms(self,telephone,**params):
self.api_params['timestamp'] = str(int(time() * 1000))
self.api_params['sms_param'] = str(params)
self.api_params['rec_num'] = telephone
newparams = "".join(["%s%s" % (k, v) for k, v in sorted(self.api_params.items())])
newparams = self.secret + newparams + self.secret
sign = hashlib.md5(newparams.encode("utf-8")).hexdigest().upper()
self.api_params['sign'] = sign
resp = requests.post(self.url,params=self.api_params,headers=self.headers)
data = resp.json()
try:
result = data['alibaba_aliqin_fc_sms_num_send_response']['result']['success']
return result
except:
print('='*10)
print("阿里大于错误信息:",data)
print('='*10)
return False(2)exts.py代码语言:javascript复制alidayu = AlidayuAPI()(3)config.py代码语言:javascript复制ALIDAYU_APP_KEY = 'LTxxxxxxBBfT8Q'
ALIDAYU_APP_SECRET = 'SRxxxxxx8IL8LhJ'
ALIDAYU_SIGN_NAME = '仙剑论坛网站'
ALIDAYU_TEMPLATE_CODE = 'SMS_136xxx947'(4)perfect_bbs.py代码语言:javascript复制alidayu.init_app(app)(5)common/views.py代码语言:javascript复制# common/views.py
__author__ = 'derek'
from flask import Blueprint,request
from exts import alidayu
from utils import restful
from utils.captcha import Captcha
bp = Blueprint("common",__name__,url_prefix='/c')
@bp.route('/sms_captcha/')
def sms_captcha():
telephone = request.args.get('telephone')
if not telephone:
return restful.params_error(message='请输入手机号码')
#生成四位数的验证码
captcha = Captcha.gene_text(number=4)
if alidayu.send_sms(telephone,code=captcha):
return restful.success()
else:
# return restful.params_error(message='短信验证码发送失败!')
return restful.success()(6)signup.html代码语言:javascript复制 <script src="{{ static('common/zlajax.js') }}"></script>
<link rel="stylesheet" href="{{ static("common/sweetalert/sweetalert.css") }}">
<script src="{{ static("common/sweetalert/sweetalert.min.js") }}"></script>
<script src="{{ static("common/sweetalert/zlalert.js") }}"></script>
<script src="{{ static('common/zlparam.js') }}"></script>
<script src="{{ static('front/js/front_signup.js') }}"></script>
<link rel="stylesheet" href="{{ static('front/css/front_signup.css') }}">(7)front_signup.js代码语言:javascript复制$(function () {
$("#sms-captcha-btn").click(function (event) {
event.preventDefault();
var self = $(this);
//获取手机号码
var telephone = $("input[name='telephone']").val();
//使用js的正则判断手机号码,如果不合法,弹出提示框,直接return回去
if (!(/^1[3578]\d{9}$/.test(telephone))) {
zlalert.alertInfoToast('请输入正确的手机号');
return;
}
zlajax.get({
'url': '/c/sms_captcha?telephone='+telephone,
'success': function (data) {
if(data['code'] == 200){
zlalert.alertSuccessToast('短信验证码发送成功');
self.attr("disabled",'disabled');
var timeCount = 60;
var timer = setInterval(function () {
timeCount--;
self.text(timeCount);
if(timeCount <= 0){
self.removeAttr('disabled');
clearInterval(timer);
self.text('发送验证码');
}
},1000);
}else{
zlalert.alertInfoToast(data['message']);
}
}
});
});
});13.3.短信验证码加密(1)common/forms.py代码语言:javascript复制from apps.forms import BaseForm
from wtforms import StringField
from wtforms.validators import regexp,InputRequired
import hashlib
class SMSCaptchaForm(BaseForm):
salt='dfurtn5hdsesjc*^nd'
telephone=StringField(validators=[regexp(r'1[3578]\d{9}')])
timestamp=StringField(validators=[regexp(r'\d{13}')])
sign=StringField(validators=[InputRequired()])
def validate(self):
result=super(SMSCaptchaForm, self).validate()
if not result:
return False
telephone=self.telephone.data
timestamp=self.timestamp.data
sign=self.sign.data
sign2=hashlib.md5((timestamp+telephone+self.salt).encode('utf-8')).hexdigest()
if sign==sign2:
return True
else:
return False(2)front/views.py代码语言:javascript复制# common/views.py
__author__ = 'derek'
from flask import Blueprint,request
from exts import alidayu
from utils import restful
from utils.captcha import Captcha
from .form import SMSCaptchaForm
bp = Blueprint("common",__name__,url_prefix='/c')
# @bp.route('/sms_captcha/')
# def sms_captcha():
# telephone = request.args.get('telephone')
# if not telephone:
# return restful.params_error(message='请输入手机号码')
# #生成四位数的验证码
# captcha = Captcha.gene_text(number=4)
# if alidayu.send_sms(telephone,code=captcha):
# return restful.success()
# else:
# # return restful.params_error(message='短信验证码发送失败!')
# return restful.success()
@bp.route('/sms_captcha/',methods=['POST'])
def sms_captcha():
# telephone+timestamp+salt
form=SMSCaptchaForm(request.form)
if form.validate():
telephone=form.telephone.data
captcha=Captcha.gene_text(number=4)
if alidayu.send_sms(telephone,code=captcha):
return restful.success()
else:
# return restful.paramas_error(message='参数错误')
return restful.success()
else:
return restful.params_error(message='参数错误')(3)front_signup.js代码语言:javascript复制$(function () {
$("#sms-captcha-btn").click(function (event) {
event.preventDefault();
var self = $(this);
//获取手机号码
var telephone = $("input[name='telephone']").val();
//使用js的正则判断手机号码,如果不合法,弹出提示框,直接return回去
if (!(/^1[3578]\d{9}$/.test(telephone))) {
zlalert.alertInfoToast('请输入正确的手机号');
return;
}
var timestamp = (new Date).getTime();
var sign = md5(timestamp + telephone + 'dfurtn5hdsesjc*^nd');
zlajax.post({
'url': '/c/sms_captcha/',
'data': {
'telephone': telephone,
'timestamp': timestamp,
'sign': sign
},
'success': function (data) {
if (data['code'] == 200) {
zlalert.alertSuccessToast('短信验证码发送成功');
self.attr("disabled", 'disabled');
var timeCount = 60;
var timer = setInterval(function () {
timeCount--;
self.text(timeCount);
if (timeCount <= 0) {
self.removeAttr('disabled');
clearInterval(timer);
self.text('发送验证码');
}
}, 1000);
} else {
zlalert.alertInfoToast(data['message']);
}
}
});
});
});(4)front/signup.html代码语言:javascript复制 <meta name="csrf-token" content="{{ csrf_token() }}">
<script src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.min.js"></script>13.4.验证码缓存把front/views里面的图形验证码放到common/views.py下面common/views.py代码语言:javascript复制# common/views.py
__author__ = 'derek'
from flask import Blueprint, request,make_response
from exts import alidayu
from utils import restful, zlcache
from .form import SMSCaptchaForm
from utils.captcha import Captcha
from io import BytesIO
bp = Blueprint("common", __name__, url_prefix='/c')
# @bp.route('/sms_captcha/')
# def sms_captcha():
# telephone = request.args.get('telephone')
# if not telephone:
# return restful.params_error(message='请输入手机号码')
# #生成四位数的验证码
# captcha = Captcha.gene_text(number=4)
# if alidayu.send_sms(telephone,code=captcha):
# return restful.success()
# else:
# # return restful.params_error(message='短信验证码发送失败!')
# return restful.success()
@bp.route('/sms_captcha/', methods=['POST'])
def sms_captcha():
# telephone+timestamp+salt
form = SMSCaptchaForm(request.form)
if form.validate():
telephone = form.telephone.data
captcha = Captcha.gene_text(number=4)
if alidayu.send_sms(telephone, code=captcha):
zlcache.set(telephone, captcha) # 验证码保存到缓存中
return restful.success()
else:
# return restful.paramas_error(message='参数错误')
zlcache.set(telephone, captcha) # 测试用
return restful.success()
else:
return restful.params_error(message='参数错误')
@bp.route('/captcha/')
def graph_captcha():
text,image = Captcha.gene_graph_captcha()
zlcache.set(text.lower(),text.lower())
out = BytesIO()
image.save(out,'png') #指定格式为png
out.seek(0) #把指针指到开始位置
resp = make_response(out.read())
resp.content_type = 'image/png'
return resp

BBS论坛(十七)
17.首页导航条实现和代码抽离(1)temlates/common/_head.html代码语言:javascript复制<meta name="csrf-token" content="{{ csrf_token() }}">
<script src="http://cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>
<link href="http://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<script src="http://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script src="{{ url_for('static',filename='common/zlparam.js') }}"></script>
<script src="{{ url_for('static',filename="common/zlajax.js") }}"></script>
<link rel="stylesheet" href="{{ url_for('static',filename='common/sweetalert/sweetalert.css') }}">
<script src="{{ url_for('static',filename='common/sweetalert/sweetalert.min.js') }}"></script>
<script src="{{ url_for('static',filename='common/sweetalert/zlalert.js') }}"></script>(2)cms/cms_base.html代码语言:javascript复制<head>
<meta charset="UTF-8">
<title>{% block title %}{% endblock %}</title>
<link rel="stylesheet" href="{{ static('cms/css/base.css') }}">
<script src="{{ static('cms/js/base.js') }}"></script>
{% include "common/_head.html" %}
{% block head %}{% endblock %}
</head>(3)front/front_base.html代码语言:javascript复制<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
{% include "common/_head.html" %}
<title>{% block title %}{% endblock %}</title>
{% block head %}{% endblock %}
</head>
<body>
<nav class="navbar navbar-default">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse"
data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/">仙剑论坛</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li class="active"><a href="#">首页 <span class="sr-only">(current)</span></a></li>
</ul>
<form class="navbar-form navbar-left">
<div class="form-group">
<input type="text" class="form-control" placeholder="请输入关键字">
</div>
<button type="submit" class="btn btn-default">搜索</button>
</form>
<ul class="nav navbar-nav navbar-right">
<li><a href="{{ url_for('front.signin') }}">登录</a></li>
<li><a href="{{ url_for('front.signup') }}">注册</a></li>
</ul>
</div><!-- /.navbar-collapse -->
</div><!-- /.container-fluid -->
</nav>
{% block body %}
{% endblock %}
</body>
</html>(4)front/front_index.html代码语言:javascript复制{% extends "front/front_base.html" %}
{% block title %}
仙剑论坛
{% endblock %}
{% block head %}
{% endblock %}
{% block body %}
论坛首页
{% endblock %}(5)front/views.y代码语言:javascript复制@bp.route('/')
def index():
return render_template('front/front_index.html')

BBS论坛(十一)
11.1.前台用户模型创建(1)apps/front/models.py首先安装:pip install shortuuid代码语言:javascript复制class FrontUser(db.Model):
__tablename__ = "front_user"
id = db.Column(db.String(100),primary_key=True,default=shortuuid.uuid)
telephone = db.Column(db.String(11),nullable=False,unique=True)
username = db.Column(db.String(50),nullable=False)
_password = db.Column(db.String(100),nullable=False)
email = db.Column(db.String(50),unique=True)
realname = db.Column(db.String(50))
avatar = db.Column(db.String(100))
signature = db.Column(db.String(100))
gender = db.Column(db.Enum(GenderEnum),default=GenderEnum.UNKNOW)
join_time = db.Column(db.DateTime,default=datetime.now)
def __init__(self,*args,**kwargs):
#如果传入的参数里面有‘password’,就单独处理
if "password" in kwargs:
self.password = kwargs.get("password")
#处理完后把password pop出去
kwargs.pop("password")
#剩下的参数交给父类去处理
super(FrontUser, self).__init__(*args,**kwargs)
@property
def password(self):
return self._password
#保存密码的时候加密
@password.setter
def password(self, raw_password):
self._password = generate_password_hash(raw_password)
def check_password(self, raw_password):
result = check_password_hash(self.password, raw_password)
return result(2)manage.py代码语言:javascript复制@manager.option('-t','--telephone',dest='telephone')
@manager.option('-u','--username',dest='username')
@manager.option('-p','--password',dest='password')
def create_front_user(telephone,username,password):
user = FrontUser(telephone=telephone,username=username,password=password)
db.session.add(user)
db.session.commit()(3)生成表和添加前台用户代码语言:javascript复制python manage.py db migrate
python manage.py db upgrade添加用户代码语言:javascript复制python manage.py create_front_user -t 18888888888 -u huge -p 11111111.2.注册界面完成(1)front/views.py代码语言:javascript复制class SignupView(views.MethodView):
def get(self):
return render_template('front/signup.html')
bp.add_url_rule('/signup/',view_func=SignupView.as_view('signup'))(2)common/images/logo.jpg放一张logo图片(3)front/front_signup.html代码语言:javascript复制{% from 'common/_macros.html' import static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>仙剑账号注册</title>
<script src="http://cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>
<link href="http://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<script src="http://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<style>
body{
background:#f3f3f3;
}
.outer-box{
width: 854px;
background: #fff;
margin: 0 auto;
overflow: hidden;
}
.logo-box{
text-align: center;
padding-top: 40px;
}
.logo-box img{
width: 60px;
height: 60px;
}
.page-title{
text-align: center;
}
.sign-box{
width: 300px;
margin: 0 auto;
padding-top: 50px;
}
</style>
</head>
<body>
<div class="outer-box">
<div class="logo-box">
<a href="/">
<img src="{{ static('common/images/logo.jpg') }}" alt="">
</a>
</div>
<h2 class="page-title">仙剑账号注册</h2>
<div class="sign-box">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" name="telephone" placeholder="手机号码">
<span class="input-group-btn">
<button class="btn btn-default">发送验证码</button>
</span>
</div>
</div>
<div class="form-group">
<input type="text" class="form-control" name="sms_captcha" placeholder="短信验证码">
</div>
<div class="form-group">
<input type="text" class="form-control" name="username" placeholder="用户名">
</div>
<div class="form-group">
<input type="password" class="form-control" name="password1" placeholder="密码">
</div>
<div class="form-group">
<input type="password" class="form-control" name="password2" placeholder="确认密码">
</div>
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" name="graph_captcha" placeholder="图形验证码">
<span class="input-group-addon">
验证码
</span>
</div>
</div>
<div class="form-group">
<button class="btn btn-warning btn-block">立即注册</button>
</div>
</div>
</div>
</body>
</html>效果: