P-SIF长文本表示方法

目录

一、论文的核心思想

二、文档向量(长文本表示)形成具体步骤

三、中文数据集代码实战

1、增量训练词向量

2、生成单词的主题词向量

3、文档向量计算

四、下游任务


          目前处理长文本任务有两种方案,一种是基于关键词抽取的表示方案,它抽取一定数量的关键词,用这些关键词的含义来表示整个文本的含义,然后基于关键词来做分类和文本相似任务。这里会存在积累误差,抽取关键词的阶段往往我们抽取的关键词的准确率很难保证,因为关键词抽取对于人来说都是一个比较困难的任务。第二个方案就是基于bert系列的。由于bert系列对于文本长度有很大的限制,一般要求是不多余512字。在bert的基础上提出各种tricks——对文本数据做下采样——每次去除一条文本数据的部分数据——具体如何取滑窗呀,首句,中间句,尾句等。这两种方案在一定的业务场景下效果是很差的,最近看了一篇有关长文本向量表示的论文,里面的方案感觉是一个比较不错的方案,论文提供了算法原理和完整的实验代码。我将其在中文数据集上,做了一些实验,做一个记录和分享。论文原文地址P-SIF: Document Embeddings Using Partition Averaging

一、论文的核心思想

        回顾一下一般句向量的表示方法——简单的词向量加权平均可以很好的表示一个句向量,在很多任务下,比复杂的seqtoseq神经网络的效果都要好。在长文本或者文档级别的业务场景下,很自然的就会把上面的加权平均的算法移植过来,但是实验证明它的效果会大大下降。关键的原因是,长文本或者文档中不同的句子可能主题是不一样的,因此它们中的词的主题也是不同的,简单的直接加权平均来表示文档向量,就会把主题这个关键信息忽略掉。为了解决上面的问题,论文提出了一种新的方法P-SIF——分区的词平均模型。它保留了词向量据平局加权的简单性,也考虑了文档的主题结构。它能够学习到特定的主题向量,然后把这些向量链接起来,最终形成一个文档向量。

以上图片来自论文截图,相同的词在不同的空间中具有不同的主题,含义也就不一样。所以基于这一点出发要很好的表示一个文档,就需要考虑不同的主题。

其实这里的论文中核心思想就是把文档中的词进行聚类,划分到不同的主题空间中,然后使用这些词在主题空间中的概率与词向量自身做运算,然后concat起来,就得到了文档向量。它就可以用在下游任务中了,在长文本上具有一定的提升,相对于其他的一些方法。

二、文档向量(长文本表示)形成具体步骤

1、清洗语料,分词,训练词向量,得到每个词的类似word2vec词向量。

2、基于以上的词向量,进行GMM(高斯)聚类,得到每个词的聚类结果——每个词的主题类别和概率,id和idx_prob。

3、基于1中的词向量,2中的聚类结果,以及语料中的每个词的TFIDF得分,三者做乘法运算,得到每个单词的主题向量表示——topic_vector。

4、文档向量计算,a、针对语料中的词频,设计一个权重算法得出每个词的权重。

                                       b、基于上述的topic_vector与a中的权重相乘,然后把每个词的词向量直接相加,就得到文本的初始主题向量。

                                        c、做归一化处理。假如聚类数目太多,后续还有需要进行降维处理,例如PCA——主成分分析法。

以上就是P-SIF算法文档向量的形成,后面就可以使用这个文档向量进行下有任务了。论文中给出的一些数据集中的文本相似和文本分类效果提升很明显,同时又是无监督的,具有一定的意义。

三、中文数据集代码实战

1、增量训练词向量

这里直接使用gensim包中的Word2Vec来进行增量或者全量训练词向量,自己选择就好!

from gensim.models import Word2Vec
import os
import json
from tqdm import tqdm
import pandas as pd
from gensim.models.word2vec import PathLineSentences
import time

def train_word2vec_model(path):
    model = Word2Vec.load('pretrain_model/word2vec/word2vec.model')
    print('pre model:', model)

    #训练词向量
    new_model = trainning_word2vec(path,model)
    print('new_model',new_model)
    model_save_path = os.path.join('dataset_word2vec_model','update','word2vec.model')
    new_model.save(model_save_path)
    new_wv_words = new_model.wv.index2word
    print('len(new_wv_words)', len(new_wv_words))



def trainning_word2vec(path,model):
    """
    增量训练词向量,数据集比较大,所以需要用到PathLineSentences()这种方法,当然还有其他的
    :param path:
    :param model:
    :return:
    """
    t1 = time.time()
    sentence_path = os.path.join(path, 'sentence_cut')
    model.build_vocab(PathLineSentences(sentence_path),update=True) #注意update = True 这个参数很重要
    model.train(PathLineSentences(sentence_path),total_examples=model.corpus_count,epochs=50)
    t2 = time.time()
    print('tainning word2vec_update %.4f seconds'%(t2-t1))
    return model


if __name__ == '__main__':
    print('开始训练word2vec!')
    path = 'data_set'
    train_word2vec_model(path)
    print('训练word2vec完成!')

2、生成单词的主题词向量

这里使用到了GMM高斯聚类算法,同时也要计算语料中的词频。这里的难点是怎么选取一个合适的聚类数目,应该有一定的定量的评定标准,这里我没有做详细的研究,代码里也没有去评估。

import os
import json
import numpy as np
from tqdm import tqdm
from sklearn.mixture import GaussianMixture
import pandas as pd
import time
import pickle
from sklearn.feature_extraction.text import TfidfVectorizer,CountVectorizer
"""
根据聚类数目、词频和word2vec向量构造了每个词的主题向量
"""

num_features = 100
def create_word_topic_vectors():
    """
    读取聚类结果、和数据文本,形成主题词向量
    :return:
    """
    print('create_word_topic_vectors begin!')

    topic_vector_save_dir = 'topic_vector'
    sentence_cut_save_dir = 'data_set/sentence_cut'

    word_idf_dict = get_tfidf_features(sentence_cut_save_dir)


    n_clusters = [5,10,15,20,25,30]
    model_json_path = os.path.join('task_word_vector','model.json')
    model_wv_index2word_txt_path = os.path.join('task_word_vector', 'model_wv_index2word.txt')
    word_vectors_npy_path = os.path.join('task_word_vector', 'word_vectors.npy')
    t1 = time.time()
    model = json.load(open(model_json_path,'r'))
    t2 = time.time()
    print('load model.json %.4f' % (t2 - t1))

    t1 = time.time()
    word_vectors = np.load(word_vectors_npy_path,allow_pickle=True)
    t2 =time.time()
    print('load word_vectors.npy %.4f'%(t2-t1))
    model_wv_index2word = []
    with open(model_wv_index2word_txt_path, 'r') as f:
        lines = f.readlines()
    for line in tqdm(lines):
        model_wv_index2word.append(line.strip('\n'))
    # cluster_result = cluster_GaussianMixture_cluster(model,n_clusters,model_wv_index2word,word_vectors,cluster_result_save_dir,word_idf_dict,topic_vector_save_dir)
    load_word_vecotr_cluster_result(model,model_wv_index2word,word_idf_dict,topic_vector_save_dir)
    # get_word_topic_vectors(model,model_wv_index2word,cluster_result,word_idf_dict,topic_vector_save_dir)
    print('create_word_topic_vectors finished!')

def get_tfidf_features(sentence_cut_save_task_path):
    """
    :param sentence_cut_save_task_path:
    :return:
    """

    sentences_gen = get_sentence(sentence_cut_save_task_path)
    corpus = []
    for sentences in sentences_gen:
        for sentence in sentences:
            corpus.append(sentence)
    print('len(corpus)',len(corpus))

    # t1 = time.time()
    # 这个统计和我自己实现的有差别
    # cv = CountVectorizer()
    # cv_fit = cv.fit_transform(corpus)
    #
    # word_counts = cv.vocabulary_
    #
    #
    # word_counts =  dict(sorted(word_counts.items(),key=lambda x:x[1],reverse=True))
    #
    # with open('task_word_vector/word_counts.txt','w') as f:
    #     for k,v in word_counts.items():
    #         s = k +" " + str(v)
    #         f.write(s+'\n')
    #
    # t2 = time.time()
    # print('统计词频时间 %.4f s' % (t2 - t1))


    t1 = time.time()
    #这个没有太看明白,要去看看理论
    tfv = TfidfVectorizer(strip_accents='unicode',dtype=np.float32)
    tfv.fit_transform(corpus)
    features = tfv.get_feature_names()
    idfs = tfv._tfidf.idf_ #这个API真的是没有用过呀
    word_idf_dict = {}
    for feature,idf in zip(features,idfs):
        word_idf_dict[feature] = idf
    t2 = time.time()
    # with open('task_word_vector/word_idf_dict.txt','w') as f:
    #     for k ,v in word_idf_dict.items():
    #         s = k + " " + str(v)
    #         f.write(s+'\n')
    print('get_tfidf_features %.4f s'%(t2-t1))
    return word_idf_dict


def get_sentence(path):
    """
    内存太大了,电脑装不下,换用生成器试试
    :param path:
    :return:
    """
    files = os.listdir(path)
    sentence = []
    for file in files:
        file_path = os.path.join(path, file)
        with open(file_path, 'r') as f:
            for line in tqdm(f, desc='read sentence_cuts'):
                line = line.strip()
                sentence.append(line)
                if len(sentence) >= 500:
                    yield sentence
                    sentence = []


def get_word_topic_vectors(model,model_wv_index2word,cluster_result,word_idf_dict,path):
    """
    :param model:
    :param model_wv_index2word:
    :param cluster_result:
    :param word_idf_dict:
    :param path:
    :return:
    """
    num_features = 100
    if not os.path.exists(path):
        print('create path:', path)
        os.makedirs(path)
    for dic in tqdm(cluster_result,desc='clusters word_topic_vectors computing'):
        prob_wordvecs = {}
        dic_word = dic['word']
        dic_prob = dic['proba']
        word_map_prob = dict(zip(dic_word,dic_prob))
        n_cluster = int(dic['n_cluster'])
        for word in tqdm(model_wv_index2word,desc='computing'):
            prob_wordvecs[word] = np.zeros(n_cluster *  num_features, dtype="float32")
            for index in range(0,n_cluster):
                try:
                    prob_wordvecs[word][index * num_features:(index+1)*num_features] = np.array(model[word]) * word_map_prob[word][index] * word_idf_dict[word]
                except Exception:
                    continue
        s = str(n_cluster)+'_cluster_topic_vectors.pkl'
        save_path  = os.path.join(path,s)
        pickle.dump(prob_wordvecs,open(save_path,'wb'))


def load_word_vecotr_cluster_result(model,model_wv_index2word,word_idf_dict,topic_vector_save_dir):
    num_features = 100
    files = os.listdir('word_vecotr_cluster_result')

    for file in tqdm(files,desc='load_word_vecotr_cluster_result and clusters word_topic_vectors computing'):
        #读取聚类向量结果
        cluster_dic = {}
        file_path = os.path.join('word_vecotr_cluster_result',file)
        df = pd.read_csv(file_path)
        words = df['word']
        cluster_id = df['cluster_id']
        cluster_proba = list(df['cluster_proba'])
        idx_proba_float = []
        for ele in cluster_proba:
            ele = [float(e) for e in ele.strip('[').strip(']').split(',')]
            idx_proba_float.append(ele)

        cluster = file.split('_')[0]
        cluster_dic['n_cluster'] = cluster
        cluster_dic['word'] = words
        cluster_dic['idx'] = cluster_id
        cluster_dic['proba'] = idx_proba_float

        #computing topic vectors
        dic_word = cluster_dic['word']
        dic_prob = cluster_dic['proba']
        word_map_prob = dict(zip(dic_word, dic_prob))
        n_cluster = int(cluster_dic['n_cluster'])
        s = str(n_cluster) + '_cluster_topic_vectors.json'
        save_path = os.path.join(topic_vector_save_dir, s)
        with open(save_path,'w') as f:
            for word in tqdm(model_wv_index2word, desc='computing'):
                prob_wordvecs = {}
                prob_wordvecs[word] = np.zeros(n_cluster * num_features, dtype="float32")
                for index in range(0, n_cluster):
                    try:
                        prob_wordvecs[word][index * num_features:(index + 1) * num_features] = np.array(model[word]) * \
                                                                                               word_map_prob[word][
                                                                                                   index] * \
                                                                                               word_idf_dict[word]
                    except Exception:
                        continue
                prob_wordvecs[word] = prob_wordvecs[word].tolist()
                f.write(json.dumps(prob_wordvecs,ensure_ascii=False))
                f.write('\n')

            # pickle.dump(prob_wordvecs, open(save_path, 'wb'))





def cluster_GaussianMixture_cluster(model,n_clusters,model_wv_index2word,word_vectors,cluster_result_save_dir,word_idf_dict,topic_vector_save_dir):
    """
    :param model: 词向量模型
    :param n_clusters: 聚类数目列表
    :param model_wv_index2word: 词向量中的词
    :param word_vectors: 词向量
    :param cluster_result_save_dir: 聚类保存文件路径
    :param word_idf_dict: tfidf评分
    :param topic_vector_save_dir: 主题向量保存路径
    :return:
    """

    cluster_result = []
    for n_cluster in n_clusters:
        cluster_dic = {}
        print('clustering begin!')
        t1 = time.time()
        clf = GaussianMixture(n_components=n_cluster,covariance_type='tied',init_params='kmeans',max_iter=50)
        idx = clf.fit_predict(word_vectors)
        idx_proba = clf.predict_proba(word_vectors)
        t2 = time.time()
        print('clustering finished!')
        print('times %.4f'%(t2-t1))

        s = str(n_cluster)+'_cluster_GaussianMixture.csv'
        save_path = os.path.join(cluster_result_save_dir,s)
        df = pd.DataFrame()
        df['word'] = model_wv_index2word
        df['cluster_id'] = idx
        df['cluster_proba'] = idx_proba.tolist()
        df.to_csv(save_path,index=False)
        cluster_dic['n_cluster'] = n_cluster
        cluster_dic['word'] = model_wv_index2word
        cluster_dic['idx'] = idx
        cluster_dic['proba'] = idx_proba
        cluster_result.append(cluster_dic)


        # computing topic vectors
        dic_word = cluster_dic['word']
        dic_prob = cluster_dic['proba']
        word_map_prob = dict(zip(dic_word, dic_prob))
        n_cluster = int(cluster_dic['n_cluster'])
        s = str(n_cluster) + '_cluster_topic_vectors.json'
        save_path = os.path.join(topic_vector_save_dir, s)
        with open(save_path, 'w') as f:
            for word in tqdm(model_wv_index2word, desc='computing'):
                prob_wordvecs = {}
                prob_wordvecs[word] = np.zeros(n_cluster * num_features, dtype="float32")
                for index in range(0, n_cluster):
                    try:
                        print('np.array(model[word])', np.array(model[word]))
                        print('word_map_prob[word][index]', word_map_prob[word][index])
                        print('word_idf_dict[word]', word_idf_dict[word])
                        prob_wordvecs[word][index * num_features:(index + 1) * num_features] = np.array(model[word]) * \
                                                                                               word_map_prob[word][
                                                                                                   index] * \
                                                                                               word_idf_dict[word]
                    except Exception:
                        continue
                print('prob_wordvecs[word]', prob_wordvecs[word])
                prob_wordvecs[word] = prob_wordvecs[word].tolist()
                print('prob_wordvecs[word]', prob_wordvecs[word])
                time.sleep(500)
                f.write(json.dumps(prob_wordvecs, ensure_ascii=False))
                f.write('\n')

    return cluster_result

if __name__ == '__main__':
    create_word_topic_vectors()

3、文档向量计算

首先需要设计一个权重算法,来衡量每个词在语料中的一个权重。论文作者如下设计:

def bulding_word_frequency_and_weight(words_gen):
    """
    统计词频信息,得到词的权重
    :param senteces_res: 每一个任务的数据集
    :return:
    """
    print('bulding_word_frequency_and_weight begin!')

    weight_dict = Counter(words_gen)

    total = 0
    for v in weight_dict.values():
        total += v


    a_weight = 0.1 #这个值可以调整
    for word in tqdm(weight_dict,desc='get word weight'):
        prob = weight_dict[word]*1.0/total
        weight_dict[word] = a_weight*1.0/(a_weight*1.0+prob)

    print('bulding_word_frequency_and_weight finished!')
    return weight_dict

基于上述权重和前文提到的主题词向量,做乘法运算后,然后把每个词向量直接加起来,就可以得到文档主题向量表示:

import  os
import json
from sklearn.externals import joblib
from tqdm import tqdm
import numpy as np
from collections import Counter
import pandas as pd
import time
import gc #garbage collector)


n_featurs = 100
def load_topic_vector():
    """
    加载topic_vector
    :return: topic_vector_res {‘jieba’:dic,}
    dic = {'iflytek_public':subdic,}
    subdic = {'10':vecots,}
    vecots为单词的主题向量
    """
    topic_vector_dir = 'topic_vector'
    dirs = os.listdir(topic_vector_dir)
    topic_vector_res = {}
    for dir in tqdm(dirs,desc='load topic vectors'):
        clusters_pkl_file_path = os.path.join(topic_vector_dir,dir)#topic_vector/jieba/iflytek_public/10_cluster_topic_vectors.pkl
        cluster_topic_vectors = joblib.load(clusters_pkl_file_path)
        cluster = dir.split('_')[0]
        topic_vector_res[cluster] = cluster_topic_vectors

    return topic_vector_res


def get_sentence():
    """
    """
    path = 'data_set/sentence_cut/patent_collegesentence_cuts.txt'
    all_sentences = []
    count = 0 #只取10W条
    with open(path,'r') as f:
        try:
            for line in tqdm(f):
                line = line.strip().split(' ')
                all_sentences.append(line)
                count += 1
                if count >= 100000:
                    break
        except Exception:
            print(Exception)
    print('only extract 10w sentences')
    return all_sentences



def get_document_vectors():
    """
    获取文档向量,给文档进行向量化
    :return:
    """
    docment_vectors_dir = 'docment_vectors'#文档向量保存路径
    words_gen = get_sentence_words('data_set/sentence_cut')
    weight_dict = bulding_word_frequency_and_weight(words_gen)  # 得到词频和权重
    all_sentences = get_sentence()
    load_topic_vector_and_compute_vectors(all_sentences,weight_dict,docment_vectors_dir)

    # for k,v in topic_vector_res.items():
    #     n_cluster = k
    #     topic_vectors = v
    #
    #     docment_vectors_cluster_save_path = os.path.join(docment_vectors_dir, n_cluster)
    #     compute_doucment_vector(all_sentences,topic_vectors,n_cluster,docment_vectors_cluster_save_path,weight_dict)


def get_sentence_words(path):
    files = os.listdir(path)
    for file in files:
        file_path = os.path.join(path, file)
        with open(file_path, 'r') as f:
            for line in tqdm(f, desc='read sentence_cuts'):
                line = line.strip().split(' ')
                for word in line:
                    yield word

def load_topic_vector_and_compute_vectors(all_sentences,weight_dict,docment_vectors_dir):
    topic_vector_dir = 'topic_vector'
    files = os.listdir(topic_vector_dir)
    for file in tqdm(files, desc='load topic vectors and compute doucment_vector'):
        if file != '25_cluster_topic_vectors.json' or file != '30_cluster_topic_vectors.json':
            cluster = file.split('_')[0]
            clusters_json_file_path = os.path.join(topic_vector_dir,file)
            cluster_topic_vector = load_topic_vector_from_json(clusters_json_file_path)
            docment_vectors_cluster_save_path = os.path.join(docment_vectors_dir, str(cluster))
            compute_doucment_vector(all_sentences,cluster_topic_vector,cluster,docment_vectors_cluster_save_path,weight_dict)
            del cluster_topic_vector
            gc.collect()


def load_topic_vector_from_json(clusters_json_file_path):
    topic_vector_dic = {}
    with open(clusters_json_file_path,'r') as f:
        for line in tqdm(f,desc='load_topic_vector_from_json'):
            temp_dic = json.loads(line)
            for k,v in temp_dic.items():
                topic_vector_dic[k] = np.array(v)
    return topic_vector_dic



def compute_doucment_vector(all_sentences,topic_vectors,n_cluster,docment_vectors_cluster_save_path,weight_dict):
    if not os.path.exists(docment_vectors_cluster_save_path):
        print('create ',docment_vectors_cluster_save_path)
        os.makedirs(docment_vectors_cluster_save_path)
    docment_vectors_npy_save_path = os.path.join(docment_vectors_cluster_save_path,'document_vectors.npy')
    doucment_vectors = computing_doucment_vectors(all_sentences, topic_vectors, weight_dict,n_cluster)  # datas是单个json文件全部文本的单词
    np.save(docment_vectors_npy_save_path, doucment_vectors)
    del doucment_vectors
    gc.collect()



def bulding_word_frequency_and_weight(words_gen):
    """
    统计词频信息,得到词的权重
    :param senteces_res: 每一个任务的数据集
    :return:
    """
    print('bulding_word_frequency_and_weight begin!')

    weight_dict = Counter(words_gen)

    total = 0
    for v in weight_dict.values():
        total += v


    a_weight = 0.1 #这个值可以调整
    for word in tqdm(weight_dict,desc='get word weight'):
        prob = weight_dict[word]*1.0/total
        weight_dict[word] = a_weight*1.0/(a_weight*1.0+prob)

    print('bulding_word_frequency_and_weight finished!')
    return weight_dict


def computing_doucment_vectors(all_sentences,topic_vectors,weight_dict,n_cluster):
    """

    :param res_all_words_A_content:
    :param res_all_words_R_content:
    :param topic_vectors:
    :param weight_dict:
    :param n_cluster:
    :return: A_content_doucment_vectors,R_content_doucment_vectors
    """
    n_cluster = int(n_cluster)
    doucment_vectors = []
    for words in tqdm(all_sentences,desc='computing_doucment_vectors'):
        sentence_vector = np.zeros(n_cluster * n_featurs, dtype='float32')
        for word in words:
            try:
                sentence_vector += topic_vectors[word] * weight_dict[word]
            except Exception:
                pass
        norm = np.sqrt(np.einsum('...i,...i', sentence_vector, sentence_vector))
        if norm != 0:
            sentence_vector /= norm
        doucment_vectors.append(sentence_vector)
    doucment_vectors = np.array(doucment_vectors)


    print('doucment_vectors comupting finished!')
    return doucment_vectors


if __name__ == '__main__':
    print('Begin')
    get_document_vectors()
    print('Finish')

四、下游任务

在iflytek_public长文本数据集,使用P-SIF方法做了文本分类和相似任务。

"""
分类任务,得到了长文本的向量,直接采用机器学习算法来做,可以使用LIGHTGBM算法,另外一个可以尝试神经网络(优化)

相似度任务, 找出每篇文档最相似的10篇文档

后面的优化方向,word2vec的维度
"""
import os
import json
import numpy as np
from lightgbm import LGBMClassifier
from sklearn.metrics import f1_score,precision_score,accuracy_score,recall_score
import time
from DataSet import MyDataset
from torch.utils.data import DataLoader
from classfication_model import MyClassificationModel
import torch
from torch.optim.lr_scheduler import ReduceLROnPlateau,StepLR
import torch.nn.functional as F
from tqdm import tqdm
import pandas as pd
import scipy.spatial
import csv
import random
def classfification_task():
    result_dir = 'downstream_task_result/classification_result'
    label_dict = get_labels()
    docment_vectors = load_docment_vectors()
    for tool_k,tool_v in docment_vectors.items():
        result_tool_path = os.path.join(result_dir,tool_k)
        for task_k,task_v in tool_v.items():
            result_tasl_path = os.path.join(result_tool_path, task_k)
            for cluster_k,cluster_v in task_v.items():
                result_cluster_path = os.path.join(result_tasl_path, cluster_k)
                if not os.path.exists(result_cluster_path):
                    print('create ',result_cluster_path)
                    os.makedirs(result_cluster_path)
                dev_vectors = None
                dev_labels = None
                train_vectors = None
                train_labels = None
                test_vectors = None
                print('cluster_k',cluster_k)
                for name,vectors in cluster_v.items():
                    if name == 'dev':
                        dev_vectors = vectors
                        dev_labels = label_dict[name]
                    elif name == 'train':
                        train_vectors = vectors
                        train_labels = label_dict[name]
                    else:
                        test_vectors = vectors
                # do_classificating_use_LGBMClassifier(train_vectors,train_labels,dev_vectors,dev_labels,test_vectors)

                model = MyClassificationModel(n_cluster=int(cluster_k),n_feature=100)
                do_classificating_MyClassificationModel(model,train_vectors,train_labels,dev_vectors,dev_labels,test_vectors,result_cluster_path)


def do_classificating_MyClassificationModel(model,train_vectors,train_labels,dev_vectors,dev_labels,test_vectors,result_cluster_path):
    batch_size = 128
    train_data = MyDataset(train_vectors,train_labels)
    dev_data = MyDataset(dev_vectors,dev_labels)
    test_data = MyDataset(test_vectors)

    train_iter = DataLoader(dataset=train_data, batch_size=batch_size, shuffle=True)
    dev_iter = DataLoader(dataset=dev_data, batch_size=batch_size, shuffle=True)
    test_iter = DataLoader(dataset=test_data, batch_size=batch_size, shuffle=True)
    train(train_iter,dev_iter,model,result_cluster_path)
    best_model_path = os.path.join(result_cluster_path,'MyClassificationModel.pkl')
    model = torch.load(best_model_path)
    predict(test_iter,model,result_cluster_path)


def train(train_iter,dev_iter,model,result_cluster_path):

    train_accs = []
    dev_accs = []

    model.to('cuda')
    # 初始学习率
    optimizer_params = {'lr': 1e-3, 'eps': 1e-8}
    optimizer = torch.optim.Adam(model.parameters(), **optimizer_params)
    scheduler = ReduceLROnPlateau(optimizer, mode='max', factor=0.8, min_lr=1e-7, patience=5, verbose=True,
                                  eps=1e-8)  # mode max表示当监控量停止上升时,学习率将减小;min表示当监控量停止下降时,学习率将减小;这里监控的是loss因此应该用min
    early_stop_step = 1000
    epochs = 200
    last_improve = 0  # 记录上次提升的step
    flag = False  # 记录是否很久没有效果提升
    dev_best_acc = 0
    correct = 0
    total = 0
    global_step = 0
    for epoch in range(epochs):
        for step, batch in tqdm(enumerate(train_iter), desc='Train iteration:'):
            global_step += 1
            optimizer.zero_grad()
            batch = tuple(t.to('cuda') for t in batch)
            input = batch[0]
            # print('train input.size', input.size())
            # print('train input',input)
            label = batch[1]
            # print('train label.size', label.size())
            # print('train label',label)

            model.train()
            output = model(input)
            loss = F.cross_entropy(output, label)
            loss.backward()
            optimizer.step()

            total += label.size(0)
            _, predict = torch.max(output, 1)
            correct += (predict == label).sum().item()

            train_acc = correct / total
            if (step + 1) % 5 == 0:
                print('Train Epoch[{}/{}],step[{}/{}],tra_acc{:.6f} %,loss:{:.6f}'.format(epoch, epochs, step,
                                                                                          len(train_iter),
                                                                                          train_acc * 100, loss.item()))
            if (step) % 20 == 0:
                dev_acc, dev_loss = dev(model, dev_iter)
                if dev_best_acc < dev_acc:
                    dev_best_acc = dev_acc
                    path = os.path.join(result_cluster_path,'MyClassificationModel.pkl')
                    torch.save(model, path)
                    last_improve = global_step
                    train_accs.append(train_acc)
                    dev_accs.append(dev_best_acc)
                print("DEV Epoch[{}/{}],step[{}/{}],tra_acc{:.6f} %,dev_acc{:.6f} %,best_dev_acc{:.6f} %,train_loss:{:.6f},dev_loss:{:.6f}".format(epoch, epochs, step, len(train_iter), train_acc * 100, dev_acc * 100, dev_best_acc * 100,loss.item(), dev_loss.item()))

            if global_step - last_improve >= early_stop_step:
                print("No optimization for a long time, auto-stopping...")
                flag = True
                break
        scheduler.step(dev_best_acc)
        if flag:
            break


    train_result_path = os.path.join(result_cluster_path,'train_result.txt')
    with open(train_result_path,'w') as f:
        for train_acc,dev_acc in tqdm(list(zip(train_accs,dev_accs)),desc='save train process accurate'):
            s = 'train_acc:'+ str(train_acc)+"  " +'dev_acc:'+ str(dev_acc)
            f.write(s+"\n")



def dev(model,dev_iter):
    model.eval()
    loss_total = 0
    with torch.no_grad():
        correct = 0
        total = 0
        for step, batch in tqdm(enumerate(dev_iter), desc='dev iteration:'):
            batch = tuple(t.to('cuda') for t in batch)
            input = batch[0]
            label = batch[1]
            output = model(input)
            loss = F.cross_entropy(output, label)
            loss_total += loss
            total += label.size(0)
            _, predict = torch.max(output, 1)
            correct += (predict == label).sum().item()
        res = correct / total
        return res, loss_total / len(dev_iter)

def predict(test_iter,model,result_cluster_path):
    result = []
    with torch.no_grad():
        for step, batch in tqdm(enumerate(test_iter), desc='predict iteration:'):
            batch = tuple(t.to('cuda') for t in batch)
            input = batch[0]
            output = model(input)
            _, predict = torch.max(output, 1)
            result.extend(predict.tolist())
    path = os.path.join(result_cluster_path,'predict_result.txt')

    df = pd.DataFrame()
    df['predict_label'] = result
    df.to_csv(path, index=False )

    return result



def do_classificating_use_LGBMClassifier(train_vectors,train_labels,dev_vectors,dev_labels,test_vectors):
    print('do_classificating')
    t1 = time.time()
    clf = LGBMClassifier(random_state=2,n_jobs=3)
    clf.fit(train_vectors,train_labels)

    dev_pred = clf.predict(dev_vectors)
    f1 = f1_score(dev_labels, dev_pred, average='macro')
    pre = precision_score(dev_labels, dev_pred, average='micro')
    acc = accuracy_score(dev_labels, dev_pred)
    recall = recall_score(dev_labels, dev_pred, average='micro')
    t2 = time.time()
    print('train and devlization finished in %.4f seconds'%(t2-t1))
    print('LGBMClassifier f1:', f1)
    print('LGBMClassifier pre:', pre)
    print('LGBMClassifier recall:', recall)
    print('LGBMClassifier acc:', acc)
    print('classificating finished!')

    time.sleep(50)


def load_docment_vectors():
    dir = 'docment_vectors'
    tool_dirs = os.listdir(dir)
    docment_vectors_res = {}
    for tool_dir in tool_dirs:
        tool_dir_path = os.path.join(dir,tool_dir)
        task_dirs = os.listdir(tool_dir_path)
        tool_dic ={}
        for task_dir in task_dirs:
            task_dic = {}
            if task_dir == 'iflytek_public':
                task_dir_path = os.path.join(tool_dir_path,task_dir)
                cluster_dirs = os.listdir(task_dir_path)
                for cluster_dir in cluster_dirs:
                    cluster_dic = {}
                    cluster_dir_path = os.path.join(task_dir_path,cluster_dir)
                    npy_files = os.listdir(cluster_dir_path)
                    for npy_file in npy_files:
                        npy_file_name = npy_file.split('_')[0]
                        npy_file_path = os.path.join(cluster_dir_path,npy_file)
                        vectors = np.load(npy_file_path)
                        cluster_dic[npy_file_name] = vectors
                    task_dic[cluster_dir] = cluster_dic
                tool_dic[task_dir] = task_dic
        docment_vectors_res[tool_dir] = tool_dic

    return docment_vectors_res




def get_labels():
    iflytek_public_dir = 'data_set/iflytek_public'
    files = os.listdir(iflytek_public_dir)

    label_dict = {}
    for file in files:
        if file != 'labels.json' and file != 'test.json':
            name = file.split('.')[0]
            labels = []
            file_path  = os.path.join(iflytek_public_dir,file)
            with open(file_path,'r') as f:
                lines = f.readlines()
            for line in lines:
                dic = json.loads(line)
                label = int(dic['label'])
                labels.append(label)
            label_dict[name] = labels

    return label_dict

def similarity_task():
    similaritytask_result = 'downstream_task_result/similaritytask_result'
    sentences = get_train_sentences()
    docment_vectors = load_docment_vectors()
    for tool_k, tool_v in docment_vectors.items():
        similaritytask_tool_save_path = os.path.join(similaritytask_result,tool_k)
        for task_k, task_v in tool_v.items():
            similaritytask_task_save_path = os.path.join(similaritytask_tool_save_path,task_k)
            for cluster_k, cluster_v in task_v.items():
                similaritytask_cluster_save_path = os.path.join(similaritytask_task_save_path,cluster_k)
                for name, vectors in cluster_v.items():
                    if name == 'train':
                        train_vector = vectors
                        df = pd.DataFrame()
                        df['text'] = sentences
                        df['vector'] = train_vector.tolist()
                        do_similaritying(df,similaritytask_cluster_save_path)


def do_similaritying(df,similaritytask_cluster_save_path):
    if not os.path.exists(similaritytask_cluster_save_path):
        print('create similaritytask_cluster_save_path: ',similaritytask_cluster_save_path)
        os.makedirs(similaritytask_cluster_save_path)
    csv_save_path = os.path.join(similaritytask_cluster_save_path,'similarity.csv')
    csv_headers = ['text_a','text_b','simi']
    with open(csv_save_path,'w') as f:
        writer = csv.writer(f)
        writer.writerow(csv_headers)
        v = df['vector'].tolist()
        random.seed(2)
        for index,ele in tqdm(random.sample(list(enumerate(v)),100),desc='computing similarity'):
            distances = scipy.spatial.distance.cdist([ele],v,"cosine")[0]
            zip_dis = zip(range(len(distances)),distances)
            sorted_dis = sorted(zip_dis,key= lambda x:x[1])
            for idx2,dis in sorted_dis[1:6]:
                simi = 1-dis
                text_a = df.iloc[index]['text']
                text_b = df.iloc[idx2]['text']
                writer.writerow([text_a,text_b,simi])
            writer.writerow(['\n'])


def get_train_sentences():
    sentences = []
    iflytek_public_path = 'data_set/iflytek_public/train.json'
    with open(iflytek_public_path,'r') as f:
        lines = f.readlines()
    for line in lines:
        dic = json.loads(line)
        sentence = dic['sentence']
        sentences.append(sentence)
    return sentences


if __name__ == '__main__':
    print('begin')
    classfification_task()
    similarity_task()
    print('finshed!')

数据集长度分布如下:

大部分的长度都是500以内。分类效果如下:

train_acc:0.0  dev_acc:0.006925740669488265
train_acc:0.17708333333333334  dev_acc:0.15736821854559446
train_acc:0.18921493902439024  dev_acc:0.25702193151212005
train_acc:0.2150358606557377  dev_acc:0.28510965756060025
train_acc:0.23620756172839505  dev_acc:0.3251250480954213
train_acc:0.25381290269961665  dev_acc:0.33435936898807234
train_acc:0.2715741178058161  dev_acc:0.37322046941131204
train_acc:0.2888786606064093  dev_acc:0.3889957676029242
train_acc:0.3042976781505441  dev_acc:0.40707964601769914
train_acc:0.31643038087196124  dev_acc:0.4201616006156214
train_acc:0.32606378617692877  dev_acc:0.4301654482493267
train_acc:0.33779772946501446  dev_acc:0.4386302424009234
train_acc:0.34946127261638543  dev_acc:0.44517121969988455
train_acc:0.35988651243998254  dev_acc:0.4544055405925356
train_acc:0.3673557775596235  dev_acc:0.4671027318199307
train_acc:0.3734771538861664  dev_acc:0.46825702193151214
train_acc:0.38084273543633435  dev_acc:0.47441323585994616
train_acc:0.388815520925877  dev_acc:0.4963447479799923
train_acc:0.40715166461159064  dev_acc:0.4967295113505194
train_acc:0.4191149126069171  dev_acc:0.5040400153905348
train_acc:0.43391508890826247  dev_acc:0.5098114659484417
train_acc:0.44833730083390533  dev_acc:0.5163524432474028
train_acc:0.45262061295454226  dev_acc:0.5217391304347826
train_acc:0.4557222389819817  dev_acc:0.522893420546364
train_acc:0.4638674627783615  dev_acc:0.525971527510581
train_acc:0.4735536509951916  dev_acc:0.5332820315505964
train_acc:0.489134908222899  dev_acc:0.5355906117737591
train_acc:0.49248135375731816  dev_acc:0.5363601385148133
train_acc:0.5067971577959512  dev_acc:0.5367449018853405
train_acc:0.5149667544850082  dev_acc:0.5386687187379762
train_acc:0.5165324638969849  dev_acc:0.5459792227779915
train_acc:0.519343966198455  dev_acc:0.5475182762601001
train_acc:0.5222550522207651  dev_acc:0.5490573297422086
train_acc:0.5655597455957674  dev_acc:0.5494420931127356
train_acc:0.5743007223278873  dev_acc:0.5525202000769527

验证集最高是55%的准确率。使用bert的准确率62%,这里准确率没有bert的原因,分析有可能:

a、训练的词向量维度太小了,使用的是100,而不是300;另外还有一个因素就是词向量训练是不是不够充分。

b、文本数据长度不够太长,bert模型在500字内的任务还是具有一定的优越性的!

c、最后下游任务的时候,采用的神经网络模型和训练过程可能没有优化的最优,还有提升余量。

另外相似性任务,没有一个定量的评估,定性的看了一下结果,还行吧!文本相似如任务,数据集iflytek_public,结果:

text_a,text_b,simi
"《光影对决》是由电魂网络倾情研发的二次元向漫改MOBA手游,以热血国漫为原型,打造美术质量高、玩法创新多、真实还原漫画形象的精品游戏。放置MOBA无论何时何地,只需3分钟参与关键战斗,即可体验一场MOBA实况比赛切换英雄跟据战场局势选择策略阵容不再担心英雄选错导致局势无法挽回,这是个支持单局内切换英雄的MOBA,优势换英雄碾压,劣势换英雄翻盘精灵天赋,技能专精九大精灵支持多种奇妙玩法,击飞、灼烧、护盾、减CD,加速、减速、打野、减伤害,你的精灵你做主。每个技能都有多种专精,打造专属成长路线,控制、奶妈、肉盾、输出自由切换。同名漫画,英雄待命同名漫画《光影对决》改编,进入游戏如同穿越二次元世界,还有数十名英雄构建足够深度的英雄池公平竞技,坚守底线坚持最纯粹的竞技体验,坚守MOBA游戏最后的底线,拒绝氪金加属性,平衡竞技,三分钟即可体验一场MOBA实况比赛,「冬日祭」非对称MOBA,扮演BOSS碾压一切战友招募,限定皮肤等你来拿全新装备,河道另类视野机制等你体验","""biubiubiu,警报警报小小突击队员们准备出击游戏中,小伙伴们将会化身为刚毅的冲锋枪战士、冷静的狙击枪手、犀利的忍者等多个英雄,展开精彩刺激的5v5枪战,体验枪战竞技手游带来的视觉盛宴英雄百变,多样组合点亮羁绊多种英雄,多样皮肤,差异化技能,区别性团队定位,更有特殊羁绊属性可供激活个人大混战,狭路相逢勇者胜热血混战,恣意PK指尖微操,用技术称王5V5据点战,攻防有序战术王比组合,比战术与队友一起打造不一样的阵容,大杀四方排位赛,组队开黑上王者好友开黑更默契,带领战队挑战巅峰小小突击队玩家群658590046加群领礼包哦小小突击队玩家群②629296113加群领礼包哦官方客服QQ800084487客服电话02066296271,全新横版MOBA射击手游,英雄",0.7196215452517407
"《光影对决》是由电魂网络倾情研发的二次元向漫改MOBA手游,以热血国漫为原型,打造美术质量高、玩法创新多、真实还原漫画形象的精品游戏。放置MOBA无论何时何地,只需3分钟参与关键战斗,即可体验一场MOBA实况比赛切换英雄跟据战场局势选择策略阵容不再担心英雄选错导致局势无法挽回,这是个支持单局内切换英雄的MOBA,优势换英雄碾压,劣势换英雄翻盘精灵天赋,技能专精九大精灵支持多种奇妙玩法,击飞、灼烧、护盾、减CD,加速、减速、打野、减伤害,你的精灵你做主。每个技能都有多种专精,打造专属成长路线,控制、奶妈、肉盾、输出自由切换。同名漫画,英雄待命同名漫画《光影对决》改编,进入游戏如同穿越二次元世界,还有数十名英雄构建足够深度的英雄池公平竞技,坚守底线坚持最纯粹的竞技体验,坚守MOBA游戏最后的底线,拒绝氪金加属性,平衡竞技,三分钟即可体验一场MOBA实况比赛,「冬日祭」非对称MOBA,扮演BOSS碾压一切战友招募,限定皮肤等你来拿全新装备,河道另类视野机制等你体验","《自由之战2》双画风全国争霸战希蒂回归方言上线,写实/动漫画风任变迎新朋,接旧友,希蒂回归奥雷登场。次元风,写实风,一言不合画风任变。川粤沪,黑吉辽,方言播报笑出猪叫。抢据点,守领地,全国争霸不服来战。游戏介绍《自由之战2》是MOBA手游《自由之战》系列的全新作品,通过在玩法、视觉、平衡性、荣誉及资源等多方面的推陈出新,制作团队合力打造出一款引领未来的MOBA游戏,它的出现将给移动端MOBA以新的2.0的定义。在这个时空规律被打破的世界中,魔法与科技的冲突、空间与力量的角逐⋯⋯颠覆世界的末日纷争,一触即发游戏特色英雄全开放所有英雄全部开放,无任何战场外属性售卖,让所有玩家都站在同一水平线上公平竞技。个性外观自由定制玩家们对于资源的掌握更加主动,武器外观和技能特效均可自由打造。血战到底激情的血战到底玩法将取代投降,让坚持到底、永不言弃的电竞精神体现的更加淋漓尽致。次世代画质能够在千元机上流畅运行的次世代画质水准,打造高品质游戏体验。,英雄全免费战斗能赚钱,一、新英雄以死亡之舞着称的异域绝美少女莎乐美甲铁城偏离轨道带来的无名好友菖蒲二、新玩法闪电战闪电战是一种新的战斗模式。在这个模式下,您将在战斗开始时就获得高等级和满槽神装,随机开始激爽的团战配合队友,找到致胜之路吧三、全新风格地图和大小龙春季地图将呈现繁花似锦的春景,全新大小龙形象霸气登场四、新添视听效果游戏大厅新增背景和英雄的动漫和写实风格,玩家可自行选择搭配新增陕西、山东、河南语音播报优化英雄达伦的战斗音效新增闪电战BGM五、新赛季版本更新后迎来全新赛季春季赛六、观战和录像新增在线观战系统推荐或好友,也可观看已完成对局。七、系统优化1.优化解锁英雄自选激活,若无自选英雄,则不显示2.优化英雄个人资料展示3.加强自由之力作用蓄满将必得皮肤4.优化背包的物品筛选,增加级别选项限定5.背包中增加物品表现预览6.英雄初始武器可装备外发光宝石7.修复补位玩家身价也被结算的问题八、战场体验优化1.优化攻击键,调整选塔/选旗按钮位置2.可在战斗内自行设置加粗锁敌目标连线3.增加战斗血条放大设置",0.7142720345639265
"《光影对决》是由电魂网络倾情研发的二次元向漫改MOBA手游,以热血国漫为原型,打造美术质量高、玩法创新多、真实还原漫画形象的精品游戏。放置MOBA无论何时何地,只需3分钟参与关键战斗,即可体验一场MOBA实况比赛切换英雄跟据战场局势选择策略阵容不再担心英雄选错导致局势无法挽回,这是个支持单局内切换英雄的MOBA,优势换英雄碾压,劣势换英雄翻盘精灵天赋,技能专精九大精灵支持多种奇妙玩法,击飞、灼烧、护盾、减CD,加速、减速、打野、减伤害,你的精灵你做主。每个技能都有多种专精,打造专属成长路线,控制、奶妈、肉盾、输出自由切换。同名漫画,英雄待命同名漫画《光影对决》改编,进入游戏如同穿越二次元世界,还有数十名英雄构建足够深度的英雄池公平竞技,坚守底线坚持最纯粹的竞技体验,坚守MOBA游戏最后的底线,拒绝氪金加属性,平衡竞技,三分钟即可体验一场MOBA实况比赛,「冬日祭」非对称MOBA,扮演BOSS碾压一切战友招募,限定皮肤等你来拿全新装备,河道另类视野机制等你体验",游龙英雄是一款格斗类的游戏。游龙英雄拥有丽画面,逼真格斗技巧。超爽无限连招,让你真正到格斗的快感。超多装备供你挑战,助你挑战一臂之力。还可以与好友PK对决,看看谁才是高手游龙英雄游戏简介游龙英雄格斗就是要爽快,自由操控、无锁定格斗、超短技能CD以及多种技能连击使用,带来了超强的无限连招打击效果,配合酷炫华丽招式,完美的动作手感,任意操作即可放手一战,带给你极致畅爽的格斗快感。游龙英雄还专为喜欢刷副本的玩家精心打造了上百个别具匠心的精彩关卡副本,如普通副本、精英副本、BOSS副本等。各副本玩法丰富且不机械,玩家可以通关各类副本获取不同的升级需求。此外,游戏还贴心的为一些节省时间的玩家提供了副本扫荡功能,玩家只需要一次性三星通关副本后就可使用副本扫荡,花更少的时间获得相等的收益,省时省心省力。游戏日常活动设置丰富,类型多样,目前主要包括主线任务、支线任务和每日任务。穿插百组副本挑战、无尽塔闯关、职业竞赛、挖矿探宝等多样百变玩法。无论是喜欢狂刷副本的玩家,还是喜欢竞技的玩家,亦或是喜欢趣味休闲的玩家,都能在游龙英雄中轻松找到属于自己的定位。游龙英雄游戏特色极简操控无缝连招,完美动作手感特色个性职业,华丽炫目奇幻画面百组精彩连环副本,丰富的游戏活动深度互动社交玩法,极致畅爽自由招式技能,0.701603375776548
"《光影对决》是由电魂网络倾情研发的二次元向漫改MOBA手游,以热血国漫为原型,打造美术质量高、玩法创新多、真实还原漫画形象的精品游戏。放置MOBA无论何时何地,只需3分钟参与关键战斗,即可体验一场MOBA实况比赛切换英雄跟据战场局势选择策略阵容不再担心英雄选错导致局势无法挽回,这是个支持单局内切换英雄的MOBA,优势换英雄碾压,劣势换英雄翻盘精灵天赋,技能专精九大精灵支持多种奇妙玩法,击飞、灼烧、护盾、减CD,加速、减速、打野、减伤害,你的精灵你做主。每个技能都有多种专精,打造专属成长路线,控制、奶妈、肉盾、输出自由切换。同名漫画,英雄待命同名漫画《光影对决》改编,进入游戏如同穿越二次元世界,还有数十名英雄构建足够深度的英雄池公平竞技,坚守底线坚持最纯粹的竞技体验,坚守MOBA游戏最后的底线,拒绝氪金加属性,平衡竞技,三分钟即可体验一场MOBA实况比赛,「冬日祭」非对称MOBA,扮演BOSS碾压一切战友招募,限定皮肤等你来拿全新装备,河道另类视野机制等你体验","原创横版公平竞技游戏,热血刺激格斗类国民手游大作,还原经典格斗体验,带来花式作战乐趣一血、五杀、超神,实力碾压,收割全场传奇英雄任凭选择,斗战胜佛孙悟空拯救世界,敌军即将到达战场,准备团战.......,,修复了一些BUG。",0.7003351418634919
"《光影对决》是由电魂网络倾情研发的二次元向漫改MOBA手游,以热血国漫为原型,打造美术质量高、玩法创新多、真实还原漫画形象的精品游戏。放置MOBA无论何时何地,只需3分钟参与关键战斗,即可体验一场MOBA实况比赛切换英雄跟据战场局势选择策略阵容不再担心英雄选错导致局势无法挽回,这是个支持单局内切换英雄的MOBA,优势换英雄碾压,劣势换英雄翻盘精灵天赋,技能专精九大精灵支持多种奇妙玩法,击飞、灼烧、护盾、减CD,加速、减速、打野、减伤害,你的精灵你做主。每个技能都有多种专精,打造专属成长路线,控制、奶妈、肉盾、输出自由切换。同名漫画,英雄待命同名漫画《光影对决》改编,进入游戏如同穿越二次元世界,还有数十名英雄构建足够深度的英雄池公平竞技,坚守底线坚持最纯粹的竞技体验,坚守MOBA游戏最后的底线,拒绝氪金加属性,平衡竞技,三分钟即可体验一场MOBA实况比赛,「冬日祭」非对称MOBA,扮演BOSS碾压一切战友招募,限定皮肤等你来拿全新装备,河道另类视野机制等你体验","体验公平竞技新视界,全新赛季、人气新英雄、趣味新玩法邀你来战《时空召唤》是银汉游戏为MOBA热爱者倾力打造的一款5V5公平竞技MOBA手游,坚守公平竞技原则,四技能、迷雾大地图、无锁定操作,还原MOBA端游体验快感。极具特色史诗英雄,过百款精美皮肤,公平团战,激情开黑,让MOBA热爱者凭技术定胜负。Carry、刚正面、配合、走位、策略、战术、团战,插眼,回归MOBA核心乐趣。为热爱,战到底,拼技术,秀操作,登上战场巅峰MOBA热爱者,就一定要玩《时空召唤》,MOBA热爱者,一定要玩,一、学习委员艾米登场二、优化内容1、装备描述优化2、活动界面优化3、对称视野地图限时开放三、周更新活动1、学习委员开礼包拿2、赛季末组队3、神秘商店4、周末登录5、天称座免费拿6、星座学园祭7、星座宝箱",0.6932263041160862
"
"
"师徒邀请全新升级,合伙人计划让你月赚万元,新增每日签到任务点点就领红包。云顶天天转是一款学生手机赚钱软件,适合学生兼职赚零钱,宝妈兼职赚钱软件,,用户可以利用闲暇时间玩游戏赚钱,答题赚钱,做问卷,玩游戏的同时还能分享精彩内容赚零花钱。云顶天天转操作简单,较现在流行的学生赚,米赚,钱咖等要更加的直观,新手引导红包秒提到账。活动不停赚注册就送红包,定期红包雨,完成任务领红包;每天签到、回帖、答题等就能赚钱;玩出新花样玩挂机,即送金币;摇一摇,摇钱树随机掉钱;点一点,开启寻宝旅程;砸金蛋,时时有惊喜;兑换更及时可以兑换话费、游戏币等,简单做任务赚话费和零用钱,稳定性改进和错误修正。","3分钟赚10块钱,抢红包、手机赚钱pp。红包猫是国内知名手机抢红包、赚钱平台。试玩都能挣钱软件红包来了,欢迎成为赚客天天抢红包手机兼职更简单,不同于派派偷红包模式,自动抢红包更适合学生宝妈们在家赚钱,奖励比红包锁屏赚钱类高的多,一款真正可以免费赚钱儿的软件。红包猫专门为新用户增加了新手任务,只需3分钟,即可红包提现,完胜一些红包惠锁屏类应用的兑换速度。1.增加红包收益2.界面效果",0.7560437198261211
"师徒邀请全新升级,合伙人计划让你月赚万元,新增每日签到任务点点就领红包。云顶天天转是一款学生手机赚钱软件,适合学生兼职赚零钱,宝妈兼职赚钱软件,,用户可以利用闲暇时间玩游戏赚钱,答题赚钱,做问卷,玩游戏的同时还能分享精彩内容赚零花钱。云顶天天转操作简单,较现在流行的学生赚,米赚,钱咖等要更加的直观,新手引导红包秒提到账。活动不停赚注册就送红包,定期红包雨,完成任务领红包;每天签到、回帖、答题等就能赚钱;玩出新花样玩挂机,即送金币;摇一摇,摇钱树随机掉钱;点一点,开启寻宝旅程;砸金蛋,时时有惊喜;兑换更及时可以兑换话费、游戏币等,简单做任务赚话费和零用钱,稳定性改进和错误修正。",红包速抢红包快手红包神器,每日红包抢不停,整点发红包是一款让你在空闲时间边玩边赚钱的神器.学生赚钱兼职零用钱软件,每天淋红包雨,每时每刻抢红包,外挂般的存在抢红包助手。学生、宝妈、白领都在玩的抢.红包.软件,让你删除手机里所有的抢.红包.神器.软件。红包速抢是一款针对红包助手,红包的自动工具,它能很快发现红包并领取,然后自动抢红包拆红包,不放过一分一毫钱。更有高级服务功能,可以提高抢红包几率,提高抢大包概率,自动回复感谢语,及屏蔽不想抢的人/群发的红包。快来试试吧~更新内容1.修复部分BUG2.优化了安装包大小更快捷3.提高了红包领取能力更便捷4.优化了性能运行更流畅5.修复上个版本的权限问题,0.716612873935203
"师徒邀请全新升级,合伙人计划让你月赚万元,新增每日签到任务点点就领红包。云顶天天转是一款学生手机赚钱软件,适合学生兼职赚零钱,宝妈兼职赚钱软件,,用户可以利用闲暇时间玩游戏赚钱,答题赚钱,做问卷,玩游戏的同时还能分享精彩内容赚零花钱。云顶天天转操作简单,较现在流行的学生赚,米赚,钱咖等要更加的直观,新手引导红包秒提到账。活动不停赚注册就送红包,定期红包雨,完成任务领红包;每天签到、回帖、答题等就能赚钱;玩出新花样玩挂机,即送金币;摇一摇,摇钱树随机掉钱;点一点,开启寻宝旅程;砸金蛋,时时有惊喜;兑换更及时可以兑换话费、游戏币等,简单做任务赚话费和零用钱,稳定性改进和错误修正。","注册就送红包,试玩秒赚现金。天天红包手机赚钱是专注于手机威客的应用试客,天天红包是以红包为基础衍生出各种红包玩法的红包娱乐工具,让你每天都淋红包雨,随时随地捡红包。现在马上下载天天红包,和学生、妈妈帮一起加入联盟,兼职天天赚,每日还能抢红包。除了免费兑换Q币,还支持移动、电信、联通话费及流量充值,它就是你的移动ATM。更新内容快乐红包、咻一咻、全民红包、每日红包、天天红包、红包雨、现金红包、百万红包、红包外挂、红包助手、抢红包、微信红包、红包猎手、红包达人、微信红包外挂、抢红包神器、红包神器、红包提醒、秒抢红包、抢红包外挂、红包快手、抢红包软件微信抢红包、微信自动抢红包、瓦力抢红包、微信红包助手、微信抢红包神器、红包管家、自动抢红包更新内容服务器数据迁移,安全性增强。新增反馈。抢红包稳定性增强",0.6829532284526146
"师徒邀请全新升级,合伙人计划让你月赚万元,新增每日签到任务点点就领红包。云顶天天转是一款学生手机赚钱软件,适合学生兼职赚零钱,宝妈兼职赚钱软件,,用户可以利用闲暇时间玩游戏赚钱,答题赚钱,做问卷,玩游戏的同时还能分享精彩内容赚零花钱。云顶天天转操作简单,较现在流行的学生赚,米赚,钱咖等要更加的直观,新手引导红包秒提到账。活动不停赚注册就送红包,定期红包雨,完成任务领红包;每天签到、回帖、答题等就能赚钱;玩出新花样玩挂机,即送金币;摇一摇,摇钱树随机掉钱;点一点,开启寻宝旅程;砸金蛋,时时有惊喜;兑换更及时可以兑换话费、游戏币等,简单做任务赚话费和零用钱,稳定性改进和错误修正。",小鱼赚钱,轻松赚钱,生活嗨翻天。让你越来越有钱,天天都能赚钱,有了小鱼赚钱,随手试玩兼职,只是做做试客就能赚钱,收益明确,兑换迅速。适合学生,宝妈,有闲暇时间的上班族只要你用,就能赚钱。百分之百兑换,真实可靠。更新内容1、添加了分享任务、抽奖大转盘2、修复了软件无法加载的问题,0.6678209996050111
"师徒邀请全新升级,合伙人计划让你月赚万元,新增每日签到任务点点就领红包。云顶天天转是一款学生手机赚钱软件,适合学生兼职赚零钱,宝妈兼职赚钱软件,,用户可以利用闲暇时间玩游戏赚钱,答题赚钱,做问卷,玩游戏的同时还能分享精彩内容赚零花钱。云顶天天转操作简单,较现在流行的学生赚,米赚,钱咖等要更加的直观,新手引导红包秒提到账。活动不停赚注册就送红包,定期红包雨,完成任务领红包;每天签到、回帖、答题等就能赚钱;玩出新花样玩挂机,即送金币;摇一摇,摇钱树随机掉钱;点一点,开启寻宝旅程;砸金蛋,时时有惊喜;兑换更及时可以兑换话费、游戏币等,简单做任务赚话费和零用钱,稳定性改进和错误修正。",手机赚钱.软件,做任务赚钱,就选任务吧赚钱。每天十分钟,赚钱多轻松。通过这款手机pp,只需要一个手机,你就能够查看大量的任务,选择自己喜欢的任务完成,就能获取丰厚的奖励啦。用它赚取零用钱。每天闲着无聊在.抢红包.抢的那点钱还不够流量费呢,何不把这个时间用来做.兼职.任务,赚一笔可观的收入。让手机从此不再用来抢红包,让你删除手机里所有的.抢红包.神器、抢.红包.软件等。想买iphoneX没钱,天天盯着一元夺宝、钱咖、学生赚、天天夺宝、零钱夺宝等夺宝pp,希望能花个10块中一个那还不如下载一个好好做兼职任务赚一笔钱全额下单买呢。这是一款当下很流行的.手机赚钱.软件,有了它,麻麻再也不当心我的零花钱了更新内容1,更新任务详情页面2,增加用户赚钱入口3,修复无法跳转到外部浏览器的问题,0.6571022790821546
"
"
"WebSharing网络共享v1.6.1通过WiFi用电脑网页查看手机SD卡文件,不用再使用USB连接,其他功能等你发掘。使用方法1、先开启WIFI网络勾选允许管理员访问也可以选择来宾账户访问,但会有限制点开始,如果出现重试连接点忽略确定你已经连上WIFI会出现一个对话框,按确定。2、在确定你的WIFI连接正常时你可以进设置菜单取消掉连接监控。3、这时会在访问出现一个网址如http//...2112/部分表示你手机的IP地址和随机密码。在电脑上打开浏览器,在地址栏上输入http//...2112/,回车,会出现叫你输入密码对话框,输入你手机上显示的随机密码,这样在电脑上就能用网面查看到你手机SD卡上的内容,无需USB连接。你可以在电脑上对你的SD卡上的内容进行打开点左键、上传、下载,复制、删除操作等操作在电脑页面上点右键,很方便。,,BUG修复。","坑爹的舍友又在用迅雷下片,正在打lol的我只能暗自躺泪,但是只要你下载此软件,手机获取了root权限,应用加入root白名单,无需登陆路由器,手指一动就能限制他们网速.限制手机网速不是都有效,但都可以断网电脑网络,原因不详,因手机网卡各不同抱歉不能解决功能1.限制1人以上的同一个WIfi下包括电脑和手机等网络设备.2.对指定IP进行抓包,数据抓包,查看正在上的网站链接,并保存数据库,随时可查看抓包数据,3.保护本机网络,防止断网软件攻击4.备注名字,每次设备连接就显示该设备的备注名字5.查询手机已连接过的wifi密码6.新增万能钥匙接口,查询附近可连接的wifi密码不需root,直接打开可用网速限制功能不能实现的情况有下面1手机没进行root,如何root,请百度搜索百度root,360root,root精灵等2可边玩手机把软件切换后台,但锁屏状态下可能手机系统杀死限制网速功能,不用手机时候请软件切换到界面,软件只要打开就有保持屏幕常亮功能.,一键限制蹭网人网络,为您优化了体验细节。",0.7824168703011418
"WebSharing网络共享v1.6.1通过WiFi用电脑网页查看手机SD卡文件,不用再使用USB连接,其他功能等你发掘。使用方法1、先开启WIFI网络勾选允许管理员访问也可以选择来宾账户访问,但会有限制点开始,如果出现重试连接点忽略确定你已经连上WIFI会出现一个对话框,按确定。2、在确定你的WIFI连接正常时你可以进设置菜单取消掉连接监控。3、这时会在访问出现一个网址如http//...2112/部分表示你手机的IP地址和随机密码。在电脑上打开浏览器,在地址栏上输入http//...2112/,回车,会出现叫你输入密码对话框,输入你手机上显示的随机密码,这样在电脑上就能用网面查看到你手机SD卡上的内容,无需USB连接。你可以在电脑上对你的SD卡上的内容进行打开点左键、上传、下载,复制、删除操作等操作在电脑页面上点右键,很方便。,,BUG修复。",茄子快传是一款跨平台,零流量,传输速度超蓝牙200倍的极速文件传输工具,可以随时和朋友分享手机或电脑上的音乐,照片,视频,应用游戏或者任何格式的文件。全球超过200个国家,5亿+用户下载使用;谷歌应用商店15个国家/地区工具类应用排名;产品特点无需联网无需连接任何网络,无需数据流量,随时随地任意分享。速度最快传输速度秒杀蓝牙200倍,最快速度可达20M/s以上。跨屏传输手机&电脑&平板,Android&iOS&WindowsPhone&WindowsXP/7/8,多平台随意传。功能强大支持图片、视频、音乐、已安装应用以及SD卡中的任意文件。操作便捷进入传送门,好友可以随时互相收发,文件分享容易。连接电脑手机电脑互传文件,浏览照片文件,播放音乐,滑动切换同步下载手机直接遥控电脑PPT播放,开会、上课、演讲都不是问题一键换机旧手机通讯录,短信,彩信,音乐,视频,应用和数据,一键全部迁移到新手机。欢迎下载电脑客户端http//ushreit.com更新内容适配Android8.0的热点启动,并且可使用二维码扫描方式连接热点,0.7725630520206839
"WebSharing网络共享v1.6.1通过WiFi用电脑网页查看手机SD卡文件,不用再使用USB连接,其他功能等你发掘。使用方法1、先开启WIFI网络勾选允许管理员访问也可以选择来宾账户访问,但会有限制点开始,如果出现重试连接点忽略确定你已经连上WIFI会出现一个对话框,按确定。2、在确定你的WIFI连接正常时你可以进设置菜单取消掉连接监控。3、这时会在访问出现一个网址如http//...2112/部分表示你手机的IP地址和随机密码。在电脑上打开浏览器,在地址栏上输入http//...2112/,回车,会出现叫你输入密码对话框,输入你手机上显示的随机密码,这样在电脑上就能用网面查看到你手机SD卡上的内容,无需USB连接。你可以在电脑上对你的SD卡上的内容进行打开点左键、上传、下载,复制、删除操作等操作在电脑页面上点右键,很方便。,,BUG修复。",茄子快传是一款跨平台,零流量,传输速度超蓝牙200倍的极速文件传输工具,可以随时和朋友分享手机或电脑上的音乐,照片,视频,应用游戏或者任何格式的文件。全球超过200个国家,5亿+用户下载使用;谷歌应用商店15个国家/地区工具类应用排名;产品特点无需联网无需连接任何网络,无需数据流量,随时随地任意分享。速度最快传输速度秒杀蓝牙200倍,最快速度可达20M/s以上。跨屏传输手机&电脑&平板,Android&iOS&WindowsPhone&WindowsXP/7/8,多平台随意传。功能强大支持图片、视频、音乐、已安装应用以及SD卡中的任意文件。操作便捷进入传送门,好友可以随时互相收发,文件分享容易。连接电脑手机电脑互传文件,浏览照片文件,播放音乐,滑动切换同步下载手机直接遥控电脑PPT播放,开会、上课、演讲都不是问题一键换机旧手机通讯录,短信,彩信,音乐,视频,应用和数据,一键全部迁移到新手机。欢迎下载电脑客户端http//ushreit.com更新内容适配Android8.0的热点启动,并且可使用二维码扫描方式连接热点,0.7725630520206839
"WebSharing网络共享v1.6.1通过WiFi用电脑网页查看手机SD卡文件,不用再使用USB连接,其他功能等你发掘。使用方法1、先开启WIFI网络勾选允许管理员访问也可以选择来宾账户访问,但会有限制点开始,如果出现重试连接点忽略确定你已经连上WIFI会出现一个对话框,按确定。2、在确定你的WIFI连接正常时你可以进设置菜单取消掉连接监控。3、这时会在访问出现一个网址如http//...2112/部分表示你手机的IP地址和随机密码。在电脑上打开浏览器,在地址栏上输入http//...2112/,回车,会出现叫你输入密码对话框,输入你手机上显示的随机密码,这样在电脑上就能用网面查看到你手机SD卡上的内容,无需USB连接。你可以在电脑上对你的SD卡上的内容进行打开点左键、上传、下载,复制、删除操作等操作在电脑页面上点右键,很方便。,,BUG修复。",Genie是一款专为NETGEAR路由器设计的客户端软件,用户输入登录密码后即可在手机上方便的修改路由器的各种配置,包括无线网络名称、密码、开放访客专用网络、查看并管理联入网内的设备、控制网络访问权限、控制流量、网内设备的之间无线迅速的文件传送、无线信号分析、附加USB设备的文件访问与上传下载、一键重启路由器。还可以作为播放器访问并播放网内其他设备上的图片以及视频、内嵌的QR码扫描不仅可以扫描网络密码轻松上网,亦可扫描日常生活中遇到的所有QR信息。,。,0.7693056650689577
"WebSharing网络共享v1.6.1通过WiFi用电脑网页查看手机SD卡文件,不用再使用USB连接,其他功能等你发掘。使用方法1、先开启WIFI网络勾选允许管理员访问也可以选择来宾账户访问,但会有限制点开始,如果出现重试连接点忽略确定你已经连上WIFI会出现一个对话框,按确定。2、在确定你的WIFI连接正常时你可以进设置菜单取消掉连接监控。3、这时会在访问出现一个网址如http//...2112/部分表示你手机的IP地址和随机密码。在电脑上打开浏览器,在地址栏上输入http//...2112/,回车,会出现叫你输入密码对话框,输入你手机上显示的随机密码,这样在电脑上就能用网面查看到你手机SD卡上的内容,无需USB连接。你可以在电脑上对你的SD卡上的内容进行打开点左键、上传、下载,复制、删除操作等操作在电脑页面上点右键,很方便。,,BUG修复。","扫扫二维码是一款超过千万用户使用的快启极读,识别二维码扫描神器轻巧简单,满足用户的个性化需求,通过卡哇伊的画风,强大的解析能力,上线至今获得用户的一致好评不需连接网络即可获取二维码信息,自动扫描解析一步到位,帮你解析二维码,为用户带来可爱,时尚,便捷,高效的扫描体验.扫扫二维码用途通过手机摄像头扫描二维码即可实现快速手机上网,快速便捷地浏览网页,下载图文,音乐,视频,获取优惠券,参与抽奖,了解企业产品信息,而省去了在手机上输入URL的繁琐过程,实现一键上网.同时,还可以方便地用手机识别和存储名片,自动输入短信,获取公共服务如天气预报,实现电子地图查询定位,手机阅读等多种功能.随着3G的到来,二维码可以为网络浏览,下载,在线视频,网上购物,网上支付等提供方便的入口.扫扫二维码特点★一键启动快速扫描★智能纠错识别更新内容1、修改部分界面显示异常的问题2、优化部分功能界面的流畅性3、优化应用的界面",0.7621828836611424
"
"
喵呜颜文字一款手机聊天必备的搞笑表情神器,拥有最萌,最好玩的斗图表情文字。爆红的喵呜颜文字,正激萌来袭。滑动切换,轻松查找,更便捷的操作,更清新的界面。朋友聊天、个性签名,点击复制,想用就用,卖萌无极限更有定期的表情库更新,给你惊喜~不同于特殊颜文字Girls,次元颜文字,特殊符号大全,表情符号键盘,可爱颜文字,颜文字输入法,颜文字大全,表情键盘,表情符号颜文字,Boys颜文字Book表情符号,蜂巢输入法,特殊字符键盘,字体键盘,可爱表情,GIF表情包大全,开发者字体工具,趣味表情大全,可爱颜文字表情符号等应用。喵呜颜文字表情,与微信,QQ,微博,探探,陌陌,短信,易信,邮件,短信等各种社交软件及交流平台完美集成,一键分享丰富的表情颜文字到微信对话、朋友圈。最好用的全能表情聊天王,微信聊天斗图神器。新增智能悬浮球显示,聊天可以超级方便使用颜文字表情了啊啊啊而且只在社交软件上出现,平时默默隐藏不打扰,炒鸡人性化有没有官方微博新浪&腾讯喵呜颜文字官方QQ群201930338商务合作QQ2946205548更新内容1、修复部分机型界面卡顿情况2、页面操作排版更简洁,轻松制作微信、QQ专属GIF图片表情包,制作表情工厂,聊天斗图神器产品简介想在斗图界一展拳脚吗想在群聊中脱颖而出吗下载斗图APP,满足你的愿望斗图是一款完全不收钱的微信、微博、QQ动态图聊天表情APP,提供海量表情素材,轻松制作属于自己的专属表情,聊天嗨翻天。聊天斗图必备工具,支持在微信、QQ、微博中发送各种表情。开启表情交流的全新聊天模式,体验欢乐的聊天辅助工具,适用于QQ和微信聊天,集合了萌、傻、酷、拽等多位表情帝的表情包内容。产品特点海量素材金馆长、张学友、教皇各大表情帝陪你一起立足斗图界内涵文案难道长得好看也是一种罪和你对话是对我的侮辱……个性制作轻松上传照片,添加文字制作自己的专属表情快速分享微信,QQ,收藏,一键直达联系我们官方网站http//bq.jiefu.tv/doutu/官方微博http//weibo.com/boxiogif微信号gifQQ群542676857客服QQ19060677更新内容修复部分小错误,提升整体稳定性。,0.8274372103583005
喵呜颜文字一款手机聊天必备的搞笑表情神器,拥有最萌,最好玩的斗图表情文字。爆红的喵呜颜文字,正激萌来袭。滑动切换,轻松查找,更便捷的操作,更清新的界面。朋友聊天、个性签名,点击复制,想用就用,卖萌无极限更有定期的表情库更新,给你惊喜~不同于特殊颜文字Girls,次元颜文字,特殊符号大全,表情符号键盘,可爱颜文字,颜文字输入法,颜文字大全,表情键盘,表情符号颜文字,Boys颜文字Book表情符号,蜂巢输入法,特殊字符键盘,字体键盘,可爱表情,GIF表情包大全,开发者字体工具,趣味表情大全,可爱颜文字表情符号等应用。喵呜颜文字表情,与微信,QQ,微博,探探,陌陌,短信,易信,邮件,短信等各种社交软件及交流平台完美集成,一键分享丰富的表情颜文字到微信对话、朋友圈。最好用的全能表情聊天王,微信聊天斗图神器。新增智能悬浮球显示,聊天可以超级方便使用颜文字表情了啊啊啊而且只在社交软件上出现,平时默默隐藏不打扰,炒鸡人性化有没有官方微博新浪&腾讯喵呜颜文字官方QQ群201930338商务合作QQ2946205548更新内容1、修复部分机型界面卡顿情况2、页面操作排版更简洁,1.可以发语音、文字消息、表情、图片、视频30M流量可以收发上千条语音,省电省流量2.朋友圈,跟朋友们分享生活点滴3.摇一摇、查看附近的人,世界不再有陌生人4.扫一扫,可以扫商品条码、图书封面、CD封面,甚至扫描英文单词来翻译成中文5.公众帐号,用微信关注明星、看新闻、设提醒6.游戏中心,和朋友们一起玩游戏7.表情商店,有趣好玩的表情在这里特别说明微信只消耗网络流量,不产生短信电话费用更新内容本次更新解决了一些已知问题。最近更新用「视频动态」,记录眼前的世界。也可以给朋友的视频「冒个泡」,告诉他你来过。界面全新改版,更清晰直观的视觉与操作体验。可以在看一看里浏览朋友认为好看的文章。在聊天详情页中,可以给单聊设置强提醒。,0.7652208334399183
喵呜颜文字一款手机聊天必备的搞笑表情神器,拥有最萌,最好玩的斗图表情文字。爆红的喵呜颜文字,正激萌来袭。滑动切换,轻松查找,更便捷的操作,更清新的界面。朋友聊天、个性签名,点击复制,想用就用,卖萌无极限更有定期的表情库更新,给你惊喜~不同于特殊颜文字Girls,次元颜文字,特殊符号大全,表情符号键盘,可爱颜文字,颜文字输入法,颜文字大全,表情键盘,表情符号颜文字,Boys颜文字Book表情符号,蜂巢输入法,特殊字符键盘,字体键盘,可爱表情,GIF表情包大全,开发者字体工具,趣味表情大全,可爱颜文字表情符号等应用。喵呜颜文字表情,与微信,QQ,微博,探探,陌陌,短信,易信,邮件,短信等各种社交软件及交流平台完美集成,一键分享丰富的表情颜文字到微信对话、朋友圈。最好用的全能表情聊天王,微信聊天斗图神器。新增智能悬浮球显示,聊天可以超级方便使用颜文字表情了啊啊啊而且只在社交软件上出现,平时默默隐藏不打扰,炒鸡人性化有没有官方微博新浪&腾讯喵呜颜文字官方QQ群201930338商务合作QQ2946205548更新内容1、修复部分机型界面卡顿情况2、页面操作排版更简洁,搜狗输入法,拥有全能输入方式、海量词库与智能预测,致力高效流畅的输入体验,引领亿万用户输入之选。全能输入全面支持拼音、手写、语音、笔画、五笔畅快表达海量词库,分秒匹配妙算引擎动态预测,智能纠错贴心手写首字注音,生僻字输入无忧智能语音高效识别,说话实时变文字文字扫描纸面文字拍照输入快捷短语常用语、流行语一键输入个性皮肤新鲜主题,悦耳按键音,惊喜动画实力表情魔性斗图,有料图表情,鲜萌颜文字,生动Emoji手机输入,依然搜狗更新内容1.语音输入中日韩随心译,跨国聊天无压力。2.视频皮肤3D触感,立享鲜活。3.快捷登录简单登录,轻松同步,0.7379496144015417
喵呜颜文字一款手机聊天必备的搞笑表情神器,拥有最萌,最好玩的斗图表情文字。爆红的喵呜颜文字,正激萌来袭。滑动切换,轻松查找,更便捷的操作,更清新的界面。朋友聊天、个性签名,点击复制,想用就用,卖萌无极限更有定期的表情库更新,给你惊喜~不同于特殊颜文字Girls,次元颜文字,特殊符号大全,表情符号键盘,可爱颜文字,颜文字输入法,颜文字大全,表情键盘,表情符号颜文字,Boys颜文字Book表情符号,蜂巢输入法,特殊字符键盘,字体键盘,可爱表情,GIF表情包大全,开发者字体工具,趣味表情大全,可爱颜文字表情符号等应用。喵呜颜文字表情,与微信,QQ,微博,探探,陌陌,短信,易信,邮件,短信等各种社交软件及交流平台完美集成,一键分享丰富的表情颜文字到微信对话、朋友圈。最好用的全能表情聊天王,微信聊天斗图神器。新增智能悬浮球显示,聊天可以超级方便使用颜文字表情了啊啊啊而且只在社交软件上出现,平时默默隐藏不打扰,炒鸡人性化有没有官方微博新浪&腾讯喵呜颜文字官方QQ群201930338商务合作QQ2946205548更新内容1、修复部分机型界面卡顿情况2、页面操作排版更简洁,产品特点多种比例模板,横屏竖屏任意切换,短视频制作神器;海量音乐库资源,支持手机本地和PC端同步上传;支持相册存储管理,想要的照片随时随地导入导出;每周上新,专业设计团队精心打造多种类型炫酷主题模板,如生日、亲子、宝宝、节假日、明星、情侣表白、旅行记录、友谊岁月、同学聚会、婚礼现场、古风文艺、影视剧等等;功能特点一键套用,三步轻松制作精美音乐相册、视频相册、电子相册、短视频、朋友圈视频、微商相册、企业宣传相册、贺卡邀请函等;一键上传,快速生成音图文、视频并茂的生活旅行日记一键拼图,支持个性化编辑设计图片,丰富的文字和素材,选择喜欢的模板即可生成精美主题拼图;一键打印,支持手机上传照片便捷冲洗照片、证件照、制作日历、杂志、定制手机壳、服装、礼品等,并邮寄上门;一键生成精品贺卡邀请函,祝福、婚庆、开业、生日等海量主题任君挑选;一键分享至微信好友,朋友圈,微博等社交网络,评论互动优化再升级;==联系我们==我们重视每一位用户的建议反馈,努力把产品做得更好QQ群870026544微信公众号魔力相册molixingce魔力相册网站www.molixingce.com更新内容1、BUG修复和性能优化2、选取时显示全部照片,可以快速找到你的照片啦,0.7101520838568679
喵呜颜文字一款手机聊天必备的搞笑表情神器,拥有最萌,最好玩的斗图表情文字。爆红的喵呜颜文字,正激萌来袭。滑动切换,轻松查找,更便捷的操作,更清新的界面。朋友聊天、个性签名,点击复制,想用就用,卖萌无极限更有定期的表情库更新,给你惊喜~不同于特殊颜文字Girls,次元颜文字,特殊符号大全,表情符号键盘,可爱颜文字,颜文字输入法,颜文字大全,表情键盘,表情符号颜文字,Boys颜文字Book表情符号,蜂巢输入法,特殊字符键盘,字体键盘,可爱表情,GIF表情包大全,开发者字体工具,趣味表情大全,可爱颜文字表情符号等应用。喵呜颜文字表情,与微信,QQ,微博,探探,陌陌,短信,易信,邮件,短信等各种社交软件及交流平台完美集成,一键分享丰富的表情颜文字到微信对话、朋友圈。最好用的全能表情聊天王,微信聊天斗图神器。新增智能悬浮球显示,聊天可以超级方便使用颜文字表情了啊啊啊而且只在社交软件上出现,平时默默隐藏不打扰,炒鸡人性化有没有官方微博新浪&腾讯喵呜颜文字官方QQ群201930338商务合作QQ2946205548更新内容1、修复部分机型界面卡顿情况2、页面操作排版更简洁,"轻松制作属于自己的专属表情,聊天嗨翻天。聊天斗图必备工具,支持在社交平台中发送各种表情。开启表情交流的全新聊天模式,体验欢乐的聊天辅助工具,适用于社交聊天,,,版本更新后表情内容丰富,页面流畅",0.6979619691864541
"
"
OPPO用户信息统一管理平台帐号信息管理能够统一管理OPPO帐号的安全资料,包括手机号、邮箱、密码等;个人资产管理能够查询积分、可币的余额及变更记录;会员权益查询能够查询自己的会员等级以及能够享受到的会员服务;客服信息查询能够查询附近的客服维修网点,并且进行线上预约;新增功能积分商城后续可以根据您所在的地区不定期推荐当地特色商品,敬请期待~,微盟商户助手,移动客服及管理平台。微客服基本即时通讯、消息提醒功能接入、关闭、转接、标注客人查看客人信息、订单信息、消息记录旺铺工作台订单管理对订单进行发货、改价、标注、关闭售后管理查看售后订单,同意或拒绝等商品管理修改商品库存、价格、上下架自提核销查看待核销订单,扫码核销订单评论管理查看、回复、屏蔽用户评论统计数据查看旺铺营收、订单、流量、客户数据优惠券核销核销线下优惠券,促进到店消费客来店工作台收银台可扫描客户付款码在线收款或现金收款扫码核销客户产品、优惠券、预约单一键核销会员查询查看会员订单、优惠券、消费、充值、积分信息,充值、修改积分、消费交易记录查看所有订单、预约单、收款、充值记录售后管理查看退款订单,可拒绝或确认退款应用微预约查看、确认/拒绝、核销预约单消息旺铺、客来店消息提醒旺铺门店工作台旺铺门店账号登录,可使用收银台、核销订单、核销优惠券、订单管理、财务明细、消息提醒功能。旺铺自提点工作台旺铺自提点登录,可使用核销订单、核销优惠券、消息提醒功能。更新内容v3.0.6更新介绍修复部分订单快递信息不展示的问题,0.790785627004255
OPPO用户信息统一管理平台帐号信息管理能够统一管理OPPO帐号的安全资料,包括手机号、邮箱、密码等;个人资产管理能够查询积分、可币的余额及变更记录;会员权益查询能够查询自己的会员等级以及能够享受到的会员服务;客服信息查询能够查询附近的客服维修网点,并且进行线上预约;新增功能积分商城后续可以根据您所在的地区不定期推荐当地特色商品,敬请期待~,天津农商银行手机银行为您提供手机银行,包括交易查询、转账、信用卡、理财、基金、通知存款、定活互转、扫一扫、账户管理等功能。辅助功能,包括无卡取款、短信签约、小额免签免密管理、消息推送、日志查询、回单验证、存贷款计算器、房贷计算器、存贷款利率查询、汇率计算、网点地图查询等功能。安全中心,包括手势密码登录、指纹登录、数字证书密码设置、登录密码管理。更新内容自助注册增加客户隐私保护声明。,0.7847660803427055
OPPO用户信息统一管理平台帐号信息管理能够统一管理OPPO帐号的安全资料,包括手机号、邮箱、密码等;个人资产管理能够查询积分、可币的余额及变更记录;会员权益查询能够查询自己的会员等级以及能够享受到的会员服务;客服信息查询能够查询附近的客服维修网点,并且进行线上预约;新增功能积分商城后续可以根据您所在的地区不定期推荐当地特色商品,敬请期待~,全新的微盟商户助手,支持微盟新云平台商户登录。全新微盟店铺管理工具,帮助商户更加高效便捷地处理订单、管理会员、核销卡券、沟通客户、管理应用等。客来店收银台可扫描客户付款码收款或现金收款核销核销客户产品、预约、优惠券订单管理管理产品、预约、收银订单会员管理查询会员,会员充值、消费、修改积分消息通知产品、预约、收银订单消息及时通知客服功能手机端客服工具,与客户更便捷地沟通微商城待办事项待发货订单、待处理售后订单提醒订单管理对订单进行筛选、发货、改价、标记、取消操作售后管理管理售后订单,同意或拒绝等数据统计支持查看客流分析、客户群体画像、交易转化及明细消息通知待发货、已完成、异常物流、售后订单消息及时通知客服功能移动端在线客服,随时随地和客户便捷地沟通智慧美业核销核销券,计次周期卡,积分商城订单订单管理优惠买单订单查看,服务项目接单,到店等操作核销记录查看券、服务项目、积分商城核销记录如您在使用中遇到的任何问题或需求建议,请及时联系我们。微盟官网www.weimob.com咨询电话10105188更新内容V2.0.5版本更新智慧零售1.增加客户线索功能,导购可实时查看专属客户的部分行为轨迹2.修复已知bug,和细节优化,0.7742892857437249
OPPO用户信息统一管理平台帐号信息管理能够统一管理OPPO帐号的安全资料,包括手机号、邮箱、密码等;个人资产管理能够查询积分、可币的余额及变更记录;会员权益查询能够查询自己的会员等级以及能够享受到的会员服务;客服信息查询能够查询附近的客服维修网点,并且进行线上预约;新增功能积分商城后续可以根据您所在的地区不定期推荐当地特色商品,敬请期待~,"兴服务,新体验兴业银行专为Android用户推出全新尊尚版手机银行,让您尊享贴身的移动金融服务,乐享掌控一切的自然人生。客户端手机银行三大特点一、友好的操作体验1、全新的界面设计和菜单布局;2、优化手机银行登录、只需设定登录手机号即可快速登录;3、使用短信口令认证,办理转账、缴费等业务更加便捷;4、提供真正符合手机用户的操作体验,一触即发,让您爱上touch的感觉。二、贴身的金融服务提供查询转账、投资理财、信用卡等全面的移动金融服务,让您随时随地随身尊享贴身金融服务。1、查询转账实时行内转账、实时跨行转出、普通跨行转账、实时跨行转入等。2、投资理财贵金属、理财产品、基金、外汇、银证、国债、智能通知存款等。3、信用卡账务查询、还款、消费分期、账单分期、预借现金等。三、丰富的增值服务1、地图查询提供营业网点、ATM地图查询及周边查询功能;2、丰富资讯提供个人金融、企业金融、贵金属市场行情及理财资讯信息等;3、金融助手提供信用卡优惠活动、产品介绍、还款方式、特惠商户查询功能;4、本程序免费。,,增强客户端稳定性。",0.7618757146292684
OPPO用户信息统一管理平台帐号信息管理能够统一管理OPPO帐号的安全资料,包括手机号、邮箱、密码等;个人资产管理能够查询积分、可币的余额及变更记录;会员权益查询能够查询自己的会员等级以及能够享受到的会员服务;客服信息查询能够查询附近的客服维修网点,并且进行线上预约;新增功能积分商城后续可以根据您所在的地区不定期推荐当地特色商品,敬请期待~,"软件介绍由优合集团内部向合作客户发放账号和密码,优速宝是专属于优合集团客户使用的app。主要功能1、订单查询主要查询客户名下订单的详细商品、价格、物流2、通知查看在新闻页面客户可以看到优合集团后台发送出去的通知3、库存查询查询客户到港的货物存放情况4、数据分析客户可以查看自己购买商品的详细资料,如最近时间的价格走势、最近购买柜量的数据分析、各国家购买数量分析等,,进行了界面的优化",0.7587055730484011
"
"
《像素方块世界 BlockCrft3D》是一款像素建造类游戏。在开放世界中构建属于自己的美妙城市。在建造出基本的城市之后,还可以进行宏伟的建造工程,比如艾菲尔铁塔、飞机,甚至还能建造行星策划你是还会吸引外来的居住者入住于此,还有小猫、小狗、甚至还有大象也会加入到城市当中。喜欢这款游戏的话就赶紧一起来玩吧~了一些BUG。,"这是一款十分有趣耐玩的模拟经营游戏。在这里你首先需要建立一些金矿场和木材厂保证你建造建筑物的物资资源的稳定来源,然后你在有了一定的金钱和木材之后就可以开始构建你心目中的城市啦,你就是这个世界的支配者,复古的老式木屋,泥泞的路面还是现代化都市的高楼大撒和高速公路,一切都随心所欲的构建。打造你的梦中之城。本游戏完全免费,无任何广告。我的城市,一款模拟建造城市的游戏。你的任务,就是设计建造世界上的城市。游戏开始,需要建立金矿厂和材料厂,以获得稳定的收入,剩下的就只有发挥你的创意了。,,修复建筑左角和右角放树木不协调问题修复建筑占用面积不正常问题",0.6475594317836554
《像素方块世界 BlockCrft3D》是一款像素建造类游戏。在开放世界中构建属于自己的美妙城市。在建造出基本的城市之后,还可以进行宏伟的建造工程,比如艾菲尔铁塔、飞机,甚至还能建造行星策划你是还会吸引外来的居住者入住于此,还有小猫、小狗、甚至还有大象也会加入到城市当中。喜欢这款游戏的话就赶紧一起来玩吧~了一些BUG。,"《完美城市》是一款以城市建设为题材的模拟经营类手机网络游戏。高度自由的道路建设系统,逼真的3D城市夜景,丰富的建筑类型,随等级变化的建筑外貌,让你亲手打造华丽的城市景观。轻松完成任务,获取世界闻名的景点建筑,世界名城尽在掌中。还有航海捕鱼、联盟互助、多边贸易等休闲玩法,让升级等待不再无聊。现在就加入城市建造者中,马上开始玩《完美城市》你的城市将会声名赫赫,成为世界的新中心通过游戏,还可以培养玩家全局规划和团队协作的精神。,3D模拟经营自由建造城市手游,1.真实的城市经营规划道路,建造住宅,发展商业,满足城市中的居民的衣食住行。你,既是这个城市的市长先生,也是这个城市的造物之神,一切的一切由你的意愿去发展。2.丰富的建筑模型《完美城市》拥有超过100种不同外观、大小与风格的建筑模型,完全模拟出一座城市的方方面面,从餐厅到便利店,从治安亭到高级社区医院,这里有城市中的一切,不同的模型让城市面目更加丰富,也各具特色。3.完整的工业生产体验《完美城市》中有多样的工业生产建筑,模拟出一条完整的工业生产链,带给玩家生产的快感与成就。",0.6150367069039598
《像素方块世界 BlockCrft3D》是一款像素建造类游戏。在开放世界中构建属于自己的美妙城市。在建造出基本的城市之后,还可以进行宏伟的建造工程,比如艾菲尔铁塔、飞机,甚至还能建造行星策划你是还会吸引外来的居住者入住于此,还有小猫、小狗、甚至还有大象也会加入到城市当中。喜欢这款游戏的话就赶紧一起来玩吧~了一些BUG。,由PlyCoolZombieSportGmes提供的一款我的世界风格的模拟建造游戏。觉得自己是一个公主,住在一座城堡发挥拥有无限资源的创意模式或深井成立方体女孩的世界,打造你的家园。内饰的设计,建造和设计厨房,建立有SPA,美甲沙龙,宠物店,化妆和美容沙龙的城市。更新内容提升了稳定性。,0.5705347935356706
《像素方块世界 BlockCrft3D》是一款像素建造类游戏。在开放世界中构建属于自己的美妙城市。在建造出基本的城市之后,还可以进行宏伟的建造工程,比如艾菲尔铁塔、飞机,甚至还能建造行星策划你是还会吸引外来的居住者入住于此,还有小猫、小狗、甚至还有大象也会加入到城市当中。喜欢这款游戏的话就赶紧一起来玩吧~了一些BUG。,本游戏为汉化版本一款采用了第一人称视觉全新战斗体系的沙盒类射击游戏,游戏中会有各种高科技技术含量的东西等着你来下载这个游戏完全没有目标,你有足够的工具来构建各种道具然后把它们焊接在一起,以完成自己的设计,无论是火车,火箭,投石车,一切的一切都取决于你。自由度极高的游戏,建设你自己的世界,没有人能干预你,只有你想不到,没有它做不到。游戏内容一切尽在你的掌握之中。游戏节奏舒缓从容,画面清新优雅。带给你与众不同的游戏。游戏特色1、多种地貌由你打造2、自由合成海量道具3、亲手建造专属家园4、建造跑车驰骋世界,0.46571940807947176
《像素方块世界 BlockCrft3D》是一款像素建造类游戏。在开放世界中构建属于自己的美妙城市。在建造出基本的城市之后,还可以进行宏伟的建造工程,比如艾菲尔铁塔、飞机,甚至还能建造行星策划你是还会吸引外来的居住者入住于此,还有小猫、小狗、甚至还有大象也会加入到城市当中。喜欢这款游戏的话就赶紧一起来玩吧~了一些BUG。,像素类游戏大作《沙盒》中文版在玩家们的期待下终于登录安卓平台,再也不用对着一堆英文抓狂了,尽情的体验游戏带给你的乐趣吧通过令人惊叹的像素艺术,发挥想象力创造属于你自己的世界,和各种元素和生物一起游戏,整个世界由你来创造或毁灭,能阻碍你的只有你的想象力利用石头、水和泥土等基础的建筑材料开始建造自己的世界,随后通过种植植物,开垦山脉,创造生命并使用高级工具,来创造更多更复杂的元素。不久之后,你将能够获取无机元素如金属和灯泡等,让你居住在自己创造的自然与科技共存的世界中。成千上万种的可能性,天马行空的环境设计,数不胜数的化学反应。一切尽在你的掌控中更新内容沙盒游戏重新上线,新版本更多内容加入全新合辑《沙子混合3》,包含10大新关卡画廊功能对中国区玩家开放,玩家上传自制内容后,有机会得到官方推荐,全世界玩家可见优化了UI显示,界面更加友好优化了游戏性能,更加流畅,0.45846466916393913

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
传奇服务端Linux是一种特定于Linux操作系统的传奇游戏服务器端软件。Linux是一种开源操作系统,具有稳定性、安全性和高性能特点,因此在传奇游戏服务器搭建方面非常受欢迎。 使用传奇服务端Linux可以实现以下几个优势: 首先,Linux具有良好的稳定性和可靠性。传奇游戏的服务器端需要时间运行,而Linux操作系统能够持续稳定运行,不易受到病毒、恶意软件等的攻击,能够更好地保障游戏服务器的正常运行。 其次,Linux操作系统提供了丰富的安全性功能。传奇游戏服务器存储着大量玩家的个人信息和游戏数据,为了保护这些敏感数据的安全,使用Linux操作系统能够提供更多的安全性措施,如权限管理、防火墙等。 再次,Linux操作系统对硬件的利用率较高,性能表现出色。传奇游戏是一个大型多人在线游戏,需要保证服务器的高性能和低延迟。 而Linux操作系统在多任务处理、内存管理等方面具有卓越的优势,能够更好地满足传奇游戏服务器的性能需求。 此外,Linux的开源特性也为传奇游戏服务器的开发和定制提供了更大的灵活性。开源意味着用户可以自由获取、使用和修改Linux操作系统,这样传奇游戏服务器开发者可以根据自己的需求进行定制和优化,提供更好的游戏体验。 综上所述,传奇服务端Linux是一种以Linux操作系统为基础的传奇游戏服务器软件,它具有稳定性、安全性和性能优势,能够更好地满足大型多人在线游戏服务器的需求,为玩家提供更好的游戏体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值