欢迎光临
我们一直在努力

机器学习框架ML.NET学习笔记【4】多元分类之手写数字识别

seabluescn阅读(61)

一、问题与解决方案

通过多元分类算法进行手写数字识别,手写数字的图片分辨率为8*8的灰度图片、已经预先进行过处理,读取了各像素点的灰度值,并进行了标记。

其中第0列是序号(不参与运算)、1-64列是像素值、65列是结果。

我们以64位像素值为特征进行多元分类,算法采用SDCA最大熵分类算法。

 

二、源码

 先贴出全部代码:


namespace MulticlassClassification_Mnist
{
    class Program
    {
        static readonly string TrainDataPath = Path.Combine(Environment.CurrentDirectory, "Data", "optdigits-full.csv");
        static readonly string ModelPath = Path.Combine(Environment.CurrentDirectory, "Data", "SDCA-Model.zip");

        static void Main(string[] args)
        {
            MLContext mlContext = new MLContext(seed: 1);
          
            TrainAndSaveModel(mlContext);
            TestSomePredictions(mlContext);

            Console.WriteLine("Hit any key to finish the app");
            Console.ReadKey();
        }
              

        public static void TrainAndSaveModel(MLContext mlContext)
        {
            // STEP 1: 准备数据
            var fulldata = mlContext.Data.LoadFromTextFile(path: TrainDataPath,
                    columns: new[]
                    {
                        new TextLoader.Column("Serial", DataKind.Single, 0),
                        new TextLoader.Column("PixelValues", DataKind.Single, 1, 64),
                        new TextLoader.Column("Number", DataKind.Single, 65)
                    },
                    hasHeader: true,
                    separatorChar: ','
                    );

            var trainTestData = mlContext.Data.TrainTestSplit(fulldata, testFraction: 0.2);
            var trainData = trainTestData.TrainSet;
            var testData = trainTestData.TestSet;

            // STEP 2: 配置数据处理管道        
            var dataProcessPipeline = mlContext.Transforms.Conversion.MapValueToKey("Label", "Number", keyOrdinality: ValueToKeyMappingEstimator.KeyOrdinality.ByValue);

            // STEP 3: 配置训练算法
            var trainer = mlContext.MulticlassClassification.Trainers.SdcaMaximumEntropy(labelColumnName: "Label", featureColumnName: "PixelValues");
            var trainingPipeline = dataProcessPipeline.Append(trainer)
              .Append(mlContext.Transforms.Conversion.MapKeyToValue("Number", "Label"));
            
            // STEP 4: 训练模型使其与数据集拟合
            Console.WriteLine("=============== Train the model fitting to the DataSet ===============");           

            ITransformer trainedModel = trainingPipeline.Fit(trainData);         


            // STEP 5:评估模型的准确性
            Console.WriteLine("===== Evaluating Model's accuracy with Test data =====");
            var predictions = trainedModel.Transform(testData);
            var metrics = mlContext.MulticlassClassification.Evaluate(data: predictions, labelColumnName: "Number", scoreColumnName: "Score");
            PrintMultiClassClassificationMetrics(trainer.ToString(), metrics);
         
            // STEP 6:保存模型              
            mlContext.ComponentCatalog.RegisterAssembly(typeof(DebugConversion).Assembly);
            mlContext.Model.Save(trainedModel, trainData.Schema, ModelPath);
            Console.WriteLine("The model is saved to {0}", ModelPath);
        }

        private static void TestSomePredictions(MLContext mlContext)
        {
            // Load Model           
            ITransformer trainedModel = mlContext.Model.Load(ModelPath, out var modelInputSchema);

            // Create prediction engine 
            var predEngine = mlContext.Model.CreatePredictionEngine<InputData, OutPutData>(trainedModel);

            //num 1
            InputData MNIST1 = new InputData()
            {               
                PixelValues = new float[] { 0, 0, 0, 0, 14, 13, 1, 0, 0, 0, 0, 5, 16, 16, 2, 0, 0, 0, 0, 14, 16, 12, 0, 0, 0, 1, 10, 16, 16, 12, 0, 0, 0, 3, 12, 14, 16, 9, 0, 0, 0, 0, 0, 5, 16, 15, 0, 0, 0, 0, 0, 4, 16, 14, 0, 0, 0, 0, 0, 1, 13, 16, 1, 0 }
            }; 
            var resultprediction1 = predEngine.Predict(MNIST1);
            resultprediction1.PrintToConsole();           
        }      
    }

    class InputData
    {
        public float Serial;
        [VectorType(64)]
        public float[] PixelValues;               
        public float Number;       
    }

    class OutPutData : InputData
    {  
        public float[] Score;  
    }   
}

View Code

  

三、分析

 整体流程和二元分类没有什么区别,下面解释一下有差异的两个地方。

 1、加载数据

      // STEP 1: 准备数据
            var fulldata = mlContext.Data.LoadFromTextFile(path: TrainDataPath,
                    columns: new[]
                    {
                        new TextLoader.Column("Serial", DataKind.Single, 0),
                        new TextLoader.Column("PixelValues", DataKind.Single, 1, 64),
                        new TextLoader.Column("Number", DataKind.Single, 65)
                    },
                    hasHeader: true,
                    separatorChar: ','
                    );

  这次我们不是通过实体对象来加载数据,而是通过列信息来进行加载,其中PixelValues是特征值,Number是标签值。

 

2、训练通道

            // STEP 2: 配置数据处理管道        
            var dataProcessPipeline = mlContext.Transforms.Conversion.MapValueToKey("Label", "Number", keyOrdinality: ValueToKeyMappingEstimator.KeyOrdinality.ByValue)

// STEP 3: 配置训练算法 var trainer = mlContext.MulticlassClassification.Trainers.SdcaMaximumEntropy(labelColumnName: "Label", featureColumnName: "PixelValues");
var trainingPipeline = dataProcessPipeline.Append(trainer)
.Append(mlContext.Transforms.Conversion.MapKeyToValue(
"Number", "Label"));

// STEP 4: 训练模型使其与数据集拟合
ITransformer trainedModel
= trainingPipeline.Fit(trainData);

 首先通过MapValueToKey方法将Number值转换为Key类型,多元分类算法要求标签值必须是这种类型(类似枚举类型,二元分类要求标签为BOOL类型)。关于这个转换的原因及编码方式,下面详细介绍。

 

四、键值类型编码与独热编码

 MapValueToKey功能是将(字符串)值类型转换为KeyTpye类型。

有时候某些输入字段用来表示类型(类别特征),但本身并没有特别的含义,比如编号、电话号码、行政区域名称或编码等,这里需要把这些类型转换为1到一个整数如1-300来进行重新编号。

举个简单的例子,我们进行图片识别的时候,目标结果可能是“猫咪”、“小狗”、“人物”这些分类,需要把这些分类转换为1、2、3这样的整数。但本文的标签值本身就是1、2、3,为什么还要转换呢?因为我们这里的一二三其实不是数学意义上的数字,而是一种标志,可以理解为壹、贰、叁,所以要进行编码。

 MapKeyToValue和MapValueToKey相反,它把将键类型转换回其原始值(字符串)。就是说标签是文本格式,在运算前已经被转换为数字枚举类型了,此时预测结果为数字,通过MapKeyToValue将其结果转换为对应文本。

MapValueToKey一般是对标签值进行编码,一般不用于特征值,如果是特征值为字符串类型的,建议采用独热编码。独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效。例如:

自然状态码为:0,1,2,3,4,5
独热编码为:000001,000010,000100,001000,010000,100000

怎么理解这个事情呢?举个例子,假如我们要进行人的身材的分析,但我们希望加入地域特征,比如:“黑龙江”、“山东”、“湖南”、“广东”这种特征,但这种字符串机器学习是不认识的,必须转换为浮点数,刚才提到MapKeyToValue可以把字符串转换为数字,为什么这里要采用独热编码呢?简单来说,假设把地域名称转换为1到10几个数字,在欧氏几何中1到3的欧拉距离和1到9的欧拉距离是不等的,但经过独热编码后,任意两点间的欧拉距离都是相等的,而我们这里的地域特征仅仅是想表达分类关系,彼此之间没有其他逻辑关系,所以应该采用独热编码。

 

五、进度调试

一般机器算法的数据拟合过程时间都比较长,有时程序跑了两个小时还没结束,也不知道还需要多长时间,着实让人着急,所以及时了解学习进度,是很有必要的。

由于机器学习算法一般都有“递归直到收敛”这种操作,所以我们是没有办法预先知道最终运算次数的,能做到的只能打印一些过程信息,看到程序在动,心里也有点底,当系统跑过一次之后,基本就大致知道需要多少次拟合了,后面再调试就可以大致了解进度了。补充一句,可不可以在测试阶段先减少样本数据进行快速调试,调试通过后再切换到全样本进行训练?其实不行,有时候样本数量小,可能会引起指标震荡,时间反而长了。

之前在Githube上看到有人通过MLContext.LOG事件来打印调试信息,我试了一下,发现没法控制筛选内容,不太方便,后来想到一个方法,就是新增一个自定义数据处理通道,这个通道不做具体事情,就打印调试信息。

类定义:

namespace MulticlassClassification_Mnist
{
    public class DebugConversionInput
    {
        public float Serial { get; set; }
    }
 
    public class DebugConversionOutput
    {
        public float DebugFeature { get; set; }
    }

    [CustomMappingFactoryAttribute("DebugConversionAction")]
    public class DebugConversion : CustomMappingFactory<DebugConversionInput, DebugConversionOutput>
    {       static long TotalCount = 0;

        public void CustomAction(DebugConversionInput input, DebugConversionOutput output)
        {
            output.DebugFeature = 1.0f;  
TotalCount++;
Console.WriteLine($"DebugConversion.CustomAction's debug info.TotalCount={TotalCount} "); } public override Action<DebugConversionInput, DebugConversionOutput> GetMapping() => CustomAction; } }

 使用方法:

 var dataProcessPipeline = mlContext.Transforms.CustomMapping(new DebugConversion().GetMapping(), contractName: "DebugConversionAction")
       .Append(...)
       .Append(mlContext.Transforms.Concatenate("Features", new string[] { "RealFeatures", "DebugFeature" }));

 通过CustomMapping加载我们自定义的数据处理通道,由于数据集是懒加载(Lazy)的,所以必须把我们自定义数据处理通道的输出加入为特征值,才能参与运算,然后算法在操作每一条数据时都会调用到CustomAction方法,这样就可以打印进度信息了。为了不影响运算结果,我们把这个数据处理通道的输出值固定为1.0f 。

 

六、资源获取

源码下载地址:https://github.com/seabluescn/Study_ML.NET

工程名称:MulticlassClassification_Mnist

点击查看机器学习框架ML.NET学习笔记系列文章目录

Windows进程通信之一看就懂的匿名管道通信

iBinary阅读(60)

目录

进程通信之一看就懂的匿名管道通信

一丶匿名管道

1.1何为匿名管道

匿名管道是用来父进程跟子进程通信的.还有一种是命名管道.不需要父子进程就可以进行通信的.今天先说匿名管道的.
匿名管道. 就是父进程创建子进程. 读取子进程数据.或者给子进程发送数据.当然子进程也可以给父进程发送数据.以及读取父进程发送过来的数据.

1.2创建匿名管道需要注意的事项

创建匿名管道,首先你要明白什么是管道. 管道你可以想象成一个管子.
我们通过这个管子发送数据.
如下图所示:

通过上图,我们就知道其实创建了两个管道. 分别是父进程读取的管道.以及
子进程读取的管道.相应的.子进程也可以对父进程读取的管道进行传输数据.父进程就可以读取了.
这段话可能难以理解.你可以这样想.

我父进程读取子进程使用第一个管道. 那么反正子进程写的话也是使用第一个管道.因为子进程写.我们父进程才能读.

1.3 创建匿名管道需要的步骤

首先你需要了解创建匿名管道的API

WINBASEAPI
BOOL
WINAPI
CreatePipe(
    _Out_ PHANDLE hReadPipe,
    _Out_ PHANDLE hWritePipe,
    _In_opt_ LPSECURITY_ATTRIBUTES lpPipeAttributes,
    _In_ DWORD nSize
    );

关于这个API很简单.相比你过来看匿名管道.说明你已经知道这个API了.
只不过不知道管道概念.(我猜的);

这个API很简单.就是创建管道. 两个句柄.读取句柄跟写入句柄.
我们需要创建两个管道.

还需要注意的是,父进程创建子进程,必须让父进程句柄可继承.这个就是第三个属性.安全属性描述符中给即可.

那么说一下创建步骤吧.

1.创建一个安全属性描述符,设置句柄可继承
2.创建两个管道. 父读->子写 子读->父写的
3.重定向输出,将子进程的读 以及子进程的写重定向.
4.创建子进程
5.读取\写入数据给子进程.

1.4代码例子

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>





int main()
{

    HANDLE hParentRead, hParentWrite, hChildRead, hChildWrite; //创建4个句柄

    STARTUPINFO si = { 0 };                         //启动信息结构体
    si.cb = sizeof(si);
    PROCESS_INFORMATION pi = { 0 };                 //进程信息结构体

    DWORD dwWritedBytes = 0;
    DWORD dwReadedBytes = 0;

    DWORD dwBytesRead = 0;
    DWORD dwTotalBytesAvail = 0;
    DWORD dwBytesLeftThisMessage = 0;

    SECURITY_ATTRIBUTES sa = { 0 };                //安全属性描述符        
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.bInheritHandle = TRUE;                      //设置句柄可继承

    //创建管道1. 父进程读 -> 子进程写入
    BOOL bRet = CreatePipe(&hParentRead,
        &hChildWrite,
        &sa,
        0);

    //创建管道2.  子进程读->父进程写.
    bRet = CreatePipe(&hChildRead,
        &hParentWrite,
        &sa,
        0);

    //这里将子进程写重定向到 stdout中. 子进程读取重定向到stdinput中
    si.hStdInput = hChildRead;    
    si.hStdOutput = hChildWrite;
    si.dwFlags = STARTF_USESTDHANDLES;   //设置窗口隐藏启动

    

    bRet = CreateProcess(NULL,
        "cmd.exe",                      //创建cmd进程.默认寻找cmd进程.
        NULL,
        NULL,
        TRUE,
        CREATE_NO_WINDOW,
        NULL,
        NULL,
        &si,
        &pi);

    char szBuffer[15] = "calc \n";
    WriteFile(hParentWrite, szBuffer, 15, NULL, 0);//使用writeFile操作管道,给cmd发送数据命令.
    return 0;
}

1.5代码运行截图

[NewLife.XCode]实体工厂(拦截处理实体操作)

大石头阅读(73)

NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode。

整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含多年开发经验于其中,代表作有百亿级大数据实时计算项目。

开源地址:https://github.com/NewLifeX/X (求star, 795+)

 

如果说前面16篇讲的都是XCode的ORM功能,从这一篇开始,将超越ORM之外,从另一个角度讲解一个数据中间件!

实体接口

有心的同学可以发现,每一个实体类都有实现一个IEntity接口,这就是实体接口。

实体接口IEntity,抽象实体对象的添删改存操作,支持访问脏数据和扩展属性!

 

日复一日的写添删改查,上进的同学会想,能不能把许多类似的操作给封装为通用函数?

这是对IEntity接口的扩展方法,新增时设置CreateTime,每次设置UpdateTime,然后Save保存。

IEntity支持通过名称读写字段属性(《脏数据》中有提到实体属性赋值的三种方法),支持脏数据和添删改,可以无需反射而实现各种封装。

IEntity主要构成:

  • 添删改存。Insert/Update/Delete/Save/SaveAsync
  • 取值赋值。this[name]/SetItem/CloneEntity/CopyFrom
  • 脏数据。Dirtys/HasDirty/IsDirty(name)
  • 扩展属性。Extends

 

实体工厂

实体工厂接口IEntityOperate,抽象提供实体类的元数据、查询、事务、设置!

实体类的各种元数据一般可以通过内嵌静态类Meta访问,也可以通过实体工厂接口IEntityOperate访问,以便于设计各种灵活功能。 

实体工厂接口IEntityOperate主要构成:

  • 字段属性信息 Fields/AllFields/FieldNames。最常用,访问到所有数据属性的信息
  • 数据表 Table。提供实体类和数据表相关信息
  • 唯一主键 Unique。XCode强烈推荐使用唯一主键,因为许多特色功能要求有唯一主键才能支持
  • 实体会话 Session。提供数据库查询与执行的直接操作
  • 分表分库 TableName/ConnName。接口访问跟Meta.TableName/Meta.ConnName一样,可通过对其赋值改变当前线程下使用的表名和连接名,从而实现分表分库功能
  • 缓存 Cache/SingleCache/Count。实体缓存、对象缓存、总记录数
  • 查询数据 Find/FindByKey/FindAll/FindCount
  • 事务 BeginTransaction/Commit/Rollback

 

场景一:从Http请求中读取数据并填充到实体属性

 

场景二:多个实体类要做修改日志,重载Insert/Update/Delete后调用以下方法,把实体对象中被修改(IsDirty有脏数据)的字段和数值拼成字符串写入日志表

 

 

 

总结

XCode是一个开放性的数据中间件,为各公司团队打造自己的开发平台提供鼎力支持!

在这十多年的发展中,几乎所有使用XCode的公司团队,都根据团队情况和业务需要封装了自己的快速开发平台!

 

系列教程

NewLife.XCode教程系列[2019版]

  1. 增删改查入门。快速展现用法,代码配置连接字符串
  2. 数据模型文件。建立表格字段和索引,名字以及数据类型规范,推荐字段(时间,用户,IP)
  3. 实体类详解。数据类业务类,泛型基类,接口
  4. 功能设置。连接字符串,调试开关,SQL日志,慢日志,参数化,执行超时。代码与配置文件设置,连接字符串局部设置
  5. 反向工程。自动建立数据库数据表
  6. 数据初始化。InitData写入初始化数据
  7. 高级增删改。重载拦截,自增字段,Valid验证,实体模型(时间,用户,IP)
  8. 脏数据。如何产生,怎么利用
  9. 增量累加。高并发统计
  10. 事务处理。单表和多表,不同连接,多种写法
  11. 扩展属性。多表关联,Map映射
  12. 高级查询。复杂条件,分页,自定义扩展FieldItem,查总记录数,查汇总统计
  13. 数据层缓存。Sql缓存,更新机制
  14. 实体缓存。全表整理缓存,更新机制
  15. 对象缓存。字典缓存,适用用户等数据较多场景。
  16. 百亿级性能。字段精炼,索引完备,合理查询,充分利用缓存
  17. 实体工厂。元数据,通用处理程序
  18. 角色权限。Membership
  19. 导入导出。Xml,Json,二进制,网络或文件
  20. 分表分库。常见拆分逻辑
  21. 高级统计。聚合统计,分组统计
  22. 批量写入。批量插入,批量Upsert,异步保存
  23. 实体队列。写入级缓存,提升性能。
  24. 备份同步。备份数据,恢复数据,同步数据
  25. 数据服务。提供RPC接口服务,远程执行查询,例如SQLite网络版
  26. 大数据分析。ETL抽取,调度计算处理,结果持久化

 

实现网站中英文切换的三种方法

admin阅读(77)

 

  前言

  现在很多公司喜欢把网站做成中英文切换,比如某零食官网

  

  那么问题来了,一般实现中英文切换有哪些方法呢?下面我总结了三种方法(因技术水平有限,若有错误,欢迎留言指正)

 

  

  解决方法

      方法1:中英文各做一份,然后用不同的文件夹区分开来,点击切换语言时,链接跳转到不同文件夹就行了)

       优点:各自的版本是分离开来的,比较稳定,不会出现互相干扰(共用数据库资料的除外)

       缺点:修改一个样式或功能,要把变更的操作(代码逻辑、更换图片、修改样式等)在所有的语言版本上重复一次,加重了工作量

       场景:个人认为符合下面2种场景可以考虑使用这种方法

          注:如果切换的语言版本很少,并且本身网站不复杂(比如电商网站不推荐)

             整体内容相对固定,布局比较简洁,扁平化,改动不会太频繁的(比如新闻类网站不推荐)

 

  

     方法2:(借助 jquery 插件——jquery.i18n.properties)

      详见:https://blog.csdn.net/aixiaoyang168/article/details/49336709   

         注:看楼下评论感觉这个博主挺好的,对提问的人也会给予解答

 

 

     方法3:(使用微软字典整站翻译)

      详见:https://blog.csdn.net/CSDN_LQR/article/details/78026254

         注:因为怕麻烦又技术渣,所以用的这种方法。如果你问我为什么不用谷歌整站翻译,因为要 FQ , FQ, FQ

 

 

  Demo(下面代码为方法③原文示例代码,我修改了显示内容和引用了jquery CDN)

<!DOCTYPE html>
<html>

    <head>
        <meta charset="utf-8" />
        <title></title>
        <style>
            p {
                text-align: center;
            }
        </style>
    </head>

    <body>

        <button id="change">中英文切换</button><br />
        <p>变变变</p>

        <div id="">
            开心一天是一天,不开心一天也是一天,为何不放下不开心,选择开心呢
        </div>

        <script src="https://cdn.staticfile.org/jquery/1.11.1/jquery.min.js"></script>
        <script src="js/language.js"></script>
        <script>
            $("#change").click(function() {
                translate();
            })
        </script>
    </body>

</html>

  下面是我根据方法三,用微软字典整站翻译实现中英文切换的 Demo

<!DOCTYPE html>
<html>

    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>

    <body>

        <button id="change">中英文切换</button><br />
        <p style="text-align: center;">变变变</p>
        <div>
            「涂涂: 程序员有三宝:闷骚,加班,修电脑。 产品经理有三宝:山寨,改版,再推倒; 老板有三宝:忽悠,找钱,洗大脑。 SE有三宝:扯蛋,规格,CCB。   项目经理有三宝:进度,流程,做报表。 客户有三宝,我要,我要,我还要! 运营经理有三宝:数据,活动,搞渠道; 市场经理有三宝:调研,策划,狂跳槽 编辑有三宝:选题,加班,被毙稿。 客户经理有三宝:能吹,勤快,酒量好! 运营三宝:黄图,抽奖,软文稿; 产品经理有三宝:原型,扯皮,爱吐槽。 团队经理有三宝:团建,开会,评绩效。 HR有三宝:招聘、培训、价值观辅导 猎头顾问有三宝:JD,CV,电话扰。 部门经理有三宝:K人、画饼、吹成效...... 咨询师有三宝:方案,画饼,做简报 运营经理有三宝:注册,活跃,真实没有效。 运营专员有三宝,需求,数据,写战报 敏捷教练有三宝:看板,迭代,狂布道。 我记得程序员三宝是钱多,话少,死得早; 推广人员有三宝~活动~美女~抽奖好! SQA有三宝:质疑,挑刺,写报告。…… 代码民工有三宝:Bug,Debug,Newbug。 设计人员有三宝:画图,加班,被指点 商务经理有三宝:谈判,换量,到处跑; 测试人员有三宝:较真,温柔,撒撒娇。 甲方有三宝:出纳,会计,大领导。 运维三宝必然是:活多,觉少,人品好;重启,重装,换电脑;随叫随到、通宵不倒、常看《IT运维之道》。」 —————————

        </div>

        <script src="https://cdn.staticfile.org/jquery/1.11.1/jquery.min.js"></script>
        <script src="js/language.js"></script>
        <script src="js/microsoft.js"></script>
        <script>
            $("#change").click(function() {
                translate();
            })
        </script>
    </body>

</html>

  language.js源码

$(function(){ 
      // do something 
    var script=document.createElement("script");  
    script.type="text/javascript";  
    script.src="http://www.microsoftTranslator.com/ajax/v3/WidgetV3.ashx?siteData=ueOIGRSKkd965FeEGM5JtQ**";  
    document.getElementsByTagName('head')[0].appendChild(script);  


    var value = sessionStorage.getItem("language");
    document.onreadystatechange = function () {
        if (document.readyState == 'complete') {
            if(value==="1"){
                Microsoft.Translator.Widget.Translate('zh-CHS', 'en', onProgress, onError, onComplete, onRestoreOriginal, 2000);
            }
        }
    }
    function onProgress(value) {
    }
    function onError(error) {
    }
    function onComplete() {
        $("#WidgetFloaterPanels").hide();
    }
    function onRestoreOriginal() { 
    }
});

function translate(){
    var value = sessionStorage.getItem("language");
    if(value==="1"){
        sessionStorage.setItem("language", "0"); 
    }else{
        sessionStorage.setItem("language", "1");
    }
    window.location.reload();//刷新当前页面.
}

  

  ①:上面language.js中写死了中文转英文(zh-CHS转en),如果项目需要其他语言的转换,直接对language.js进行自定义扩展即可  

  ②:微软字典整站翻译CDN源码(也就是我上面的microsoft.js)

  http://www.microsoftTranslator.com/ajax/v3/WidgetV3.ashx?siteData=ueOIGRSKkd965FeEGM5JtQ**

 

 

 

    补充:不过这方法有个小问题,就是每次点击切换语言后,会有弹出框和hover效果,如下图

 

  弹出框:   hover效果:

 

  后经过一番查找,终于找到了解决办法

  注:要去掉翻译后出现的弹框和hover效果,不能直接引用 language.js 里面引入的微软字典整站翻译CDN链接

    要把CDN的源码拷贝下来,单独放到一个js文件里在引入,

    同时,修改源码里面的 Pb = “inline-block” 和 B = “block” 分别改成  Pb = “none”  B = “none”

 

  完整代码已上传至github,有需要的小伙伴欢迎下载:https://github.com/tujingyu/Chinese-and-English-change

  

突破同质化竞争的企业网站建站方法?

admin阅读(64)

 

互联网的出现使社会发展的速度变快,随之而来的是很多企业通过互联网给自己的企业做宣传,网站建设帮助很多企业走上正轨,网站建设行业竞争也日益激烈,产品趋向同质化,顾客需求变化无常,满足客户需求和后期的服务是网站公司适应市场必须做到的,这一切使得网站建设企业建立和维持品牌地位的任务变得越来越艰巨。很多网站建设公司都想改变这种局面,却苦于无从下手。对此天津网站建设(www.tjshyl.com)给出了以下几方面的建议:

一、避免产品同质化

众所周知,很多私人站长通过软件编程技术自己做网站,因此建站的可模仿性极强。网络上现在有很多的模板建站,网站框架稍作修改或形状略加改动就可以堂而皇之的进入网络市场,正是建站行业的产品同质化直接导致了建站公司在价格上形成了恶性竞争。加之,目前消费者对品牌网站建设产品的认识尚处于感性阶段,对产品的真伪还很难凭直觉加以辨别,更加剧了产品同质化现象的蔓延。

二、注重塑造企业品牌

这几年来,品牌网站建设行业的经营模式已经发生了根本性的改变,即从批发转为品牌化经营。众多品牌网站建设企业纷纷注册了自己的品牌,并围绕品牌建设采取了一系列的动作。但是,大多数品牌在塑造过程中一味追求外在视觉表现,而忽视了内在的文化内涵和独特个性,致使品牌空心化现象的普遍存在,给人千篇一律的感觉。

同质化现象使品牌不能有效的形成鲜明的个性定位,最终成为过眼烟云,无法真正占据消费者的心智。天津网站建设公司认为,网站不仅仅是企业的第一营销窗口,更重要的是能够在第一时间内将企业的品牌内涵传递给访客。因此,在为企业创建网站前全面分析企业,为企业找准定位,融合企业的品牌精髓于网站建设的每一个细节之中,让网站无处不在的传递着企业的品牌信息,从整体上塑造企业品牌。

三、打造特立独行的销售渠道

品牌网站建设行业的竞争程度与日俱增,不少品牌网站建设公司与个人开始寻找新的销售渠道,比如邮箱、微博、微信等。但从目前的销售态势来看,品牌网站建设的销售渠道依然集中于网站和介绍等传统形式。渠道的狭隘性与同质化,导致了众多品牌狭路相逢,短兵相接,渠道战、终端战、价格战等一浪高过一浪,致使批发、专卖和商场专柜等传统渠道已经呈现出运营成本不断上升,以及利润空间不断萎缩的趋势,甚至是遭遇生存危机。

圣辉友联网站建设公司开拓PC网站以外的手机网站、微信网站,小程序为企业打造出多终端营销平台,助企业形成特立独行的销售渠道,突破销售渠道同质化的桎梏。与此同时,多终端建站,也有利于企业从多个角度来塑造品牌,打造出自己的专属销售渠道。

品牌网站建设行业的同质化竞争已经是不得不面对的现实了,要想跳出同质化和雷同化的桎梏,企业建站就要有创新意识,融合企业的特色于建站过程之中。天津圣辉友联网站建设公司从准确定位企业的角度打造独具特色的企业网站,凸显企业的核心竞争力,为企业突破同质化竞争助上一臂之力。

其实了解这个手段企业网站是可以上首页的

admin阅读(84)

 

对于企业网站来说,搜索引擎首页的自然搜索结果只有10个位置,那企业网站该如何去超越已经排在首页的其他企业网站呢?今天懒猫就免费为个企业公司做一点简单的介绍,希望能帮助到大家。

从搜索引擎的工作原理来说,其展示的结果主要是为了解决用户的需求,所以排在首页的网站基本上都是能够解决用户需求。那么我们就采取倒推的思维来考虑,那排在首页的网站不就是你们做好网站的最好的标准呢?如果你做的内容跟首页的网站基本相同了,那搜索引擎凭什么不给你排名呢?

有些人可能要说他的外链做的多,但是像我们做的一些新站怎么可能比他们好呢?对,外链对排名是有一定的作用,但是最主要的还是网站内容,只要你们做一些,他们没有想到的用户需求,把他加到自己的网站上去,这样能解决更多用户的需求,那搜索引擎有什么理由不给你排名呢?所以我们要站在用户的角度来思考问题,做seo就是要不断的丰富自己网站的内容,要尽量满足解决用户的需求。

上面可能说的有点笼统了,下面就给大家介绍一个案例:如,南京少儿英语培训这个词。

我们来看下排名比较靠前的企业网站页面:


从上图我们就可以看出二个网站都能很好的解决想报名少儿英语的用户需求,但是我们也发现了二个站点的不同,我们从导航栏就能够看出来:

比如吃下ABC这个网站,为这些用户提供了在线英语教学等;而启橙英语这个网站为用户提供了预约试听这个项目,二个网站都有自己的特色,都能很好的解决用户需求,其他的都大同小异了。好了,接下来是重点了,如果你做一个以南京少儿英语培训为主要关键词的网站的话,你把这二个都放在自己的网站上的话,其他的也跟他们一样,那么搜索引擎会不把你的网站放在首页吗?

其实对于我们做seo的人来说,我们有时候不能以自己的主见,来决定网站的整体布局,我们既然是要做搜索引擎的排名,那么我们就要学会利用搜索引擎来做优化,它既然给了首页网站的排名,那么我们只要做的比他更好,那么我们就能超过他们,自然而然就排名上首页了。

听完上面的介绍你是否对seo有了更好的认识了呢?其实这篇文章不仅仅是对那些企业网站有作用,对所有的网站类型都有作用,所以大家要好好看看这篇文章,它可以让你对seo有个更深层的了解。seo是一门学无止境的课程,我们还是要继续学习更多的知识。本文由懒猫seo博客作者原创,转载请注明出处:http://www.lanmaoseo.com/seojc/29.html

原创对网站的意义有多大?真能提高权重和排名吗?

admin阅读(88)

 

我做过新浪博客,做过内容型网站,有三成的文章都是原创,几乎所有的原创文章都能被各类搜索引擎收录,特别是百度有时都是秒收,有一部分原创内容在搜索引擎上都取得了一定的的排名,但是因为原创才导致网站排名和收录快速提升的吗?

仔细查看我博客和网站数据的朋友一定知道,我博客在站长之家工具查询大约1万个关键词数据,而这1万个数据中,自己原创文章不到40%,也就是说60%的排名都是转载过来的文章,而并原创文章。这个时候,你一定在质疑,网站原创视乎没那么重要。

原创是用来做网站基础

其实在我们刚刚做网站的时候,每天定时定量发布原创内容,是可以提高与搜索引擎的友好度,毫无疑问,搜索引擎更喜欢的是原创文章,但并非所有的原创文章都会得到搜索引擎的青睐。我认为原创要讲究这么几个点。

1、搜索引擎喜欢的并非原创内容,而是有价值的原创内容,很多人把这一点理解错了,认为只要文字是原创即可,所以很多人通过翻译国外文章,在APP中找文章以及其他的渠道获得低质量的原创文章,最后导致网站文章依然不被收录,甚至还可能延长网站收录。

2、搜索引擎判断文章的质量是根据文章的UV,PV,跳出率等各方面的数据来判断的,搜索引擎其实读不懂你文字的内容,而是根据用户的一些数据来判断的,PV、UV数据越高,意味着这篇文章越吸引人,跳出率越高,说明文章质量非常一般,当然还得更具文章的长度而定。

3、文章并非越长越好,100字的文章,大约20多秒差不多可以读完,那么1000字的文章,则需要200多秒读完,当然这个数据并非真实,但是搜索引擎却会根据他们以往的数据以及行业的数据进行对比,这篇文章如果仅仅只有100个字,那么停留时间20-30秒钟其实并不过分,所以文字的多少和收录并无直接关系。

但问题又来了,一个页面,如果超过3/2的页面是重复度,那么很容易被搜索引擎判断为重复页面,比如头部、底部基本上每篇文章都是一样的,而主题不一样的内容则是随意的几个文字,那么很可能这个页面会被搜索引擎判断为空白页面或者重复页面,因此导致不收录。

并不是原创文章更好

在SEO的各大群里,经常可以看到seoer在讨论这么一个问题,自己原创文章写在自己的网站上没有被收录和排名,被人抄袭过去,却收录排名了,为什么会是这样,难道搜索引擎不重视原创了吗?

其实换个角度来考虑,首先是你的网站基础不够人家好,人家网站是大型网站,在搜索引擎面前的信任机制比你要好,所以更容易被收录和排名。

其次是站在用户的角度来考虑,一篇文章,用户更重视看到里面的内容是什么,很少会有人去关注这个用户的作者是谁,甚至很多网站留下版权,也很少有人会去关注文章版权的去处,几乎不会打开原创链接重新看一遍。

那么搜索引擎则是站在用户的角度考虑,因为我们发现,搜索引擎的火星计划以及原创保护等机制都已经关闭了,甚至最近看到的熊掌号原创也已经关闭了。因为原创是谁不重要,重要的是内容写的怎么样,是否吸引读者。

新站的保护措施

那么对于新站,没有收录的时候,你每天写的原创被人家抄袭过去,你可能很愤怒,而小编给大家出几招。

首先,网站加入版权,其实现在很多版权公司,可以给你网站免费加入版权的,加入以后,有网站抄袭你的文章,那么版权公司将会对他进行起诉,这个时候版权公司起诉可以赚钱,而你则可以省去了被抄袭的可能。

其次是网站利用技术手段屏蔽复制等功能,其实这一功能小编还是不推荐使用的,毕竟会导致网站用户体验下降,所以这一功能大家考虑使用,网站做的小的时候可以用!

总结:搜索引擎看的并不是原创就一定是高质量的问题,但是同等质量的情况下,原创是有一定优势的!

字词句文网www.zicijuwen.com 和大家一起交流网站SEO!

Logo设计网坚持原创 让企业Logo在线设计不撞车

admin阅读(63)

 

近日,据外媒报道,庞大的苹果公司最近盯上了一个德国小型自行车比赛主办方,称其盗用创意,起诉其侵犯了自己的商标。该对象是德国的名为Apfel Route的自行车比赛,位于德国的Rhein-Voreifel。

大家都知道苹果Logo长什么样,而该自行车比赛Logo也采用了类似的元素设计,包括圆形苹果、顶部绿叶与右边缺口,苹果认为该Logo与自家商标过于相似,于是就向德国专利商标局提起了诉讼。

对此,该比赛主办方Rhine-Voreifel感觉不可思议,一位工作人员表示:“我们(和苹果)拥有完全不同的产品,令人难以置信,这么大的公司竟然在攻击我们。”

但是,在苹果公司看来,苹果Logo是他们独一无二的代表。设计创意,如叶子的方向,咬了一口的苹果等,任意一点都不允许被使用。哪怕是苹果本身这样一个图形,不得不说这样确实是有点蛮横了。

德媒称,缩小商标使用范围可以让苹果撤诉,或者两者也能进行庭外和解,问题并不大。

但是,站在更高的层面去考虑这个问题,也许你会理解苹果公司这一举动。假设苹果没有起诉,那么是不是可以理解为他们放弃了商标权益,这很可能导致商标权的丧失,这可不是儿戏,毕竟相似的Logo,会混淆自己的市场。

大公司有大公司的烦恼,小门店也有小门店的不快。类似的事情就发生在一个普普通通的水果店老板身上。

小欧(化名)经营着一家水果店,附近的居民都喜欢去他们家买水果,价格不贵加上人和善,小生意还算可以。但是,眼看着周围门店都装修得高大上起来,他也想着把自己的店面捯饬一番。装修店面之前,他也考察了同行的门店,发现有规模的水果店都有自己的Logo,万一哪天自己的水果店大发了,要开分店了,或者创业者想要加盟,是不是也得有个Logo,才像那么回事儿呀!

下班回到家,小欧就在想设计一个什么样的Logo呢,自己也不会呀,网上应该有吧。于是在某平台上提交了自己两点要求,以儿子喜欢的橙子为原型,名字就叫“小欧鲜果”,该平台很快就为他设计好了一款符合他要求的Logo,他也很满意。

店面全面升级,门头上的Logo也很大很醒目,店面装修也很舒服,但水果的价格并没有因为升级而上涨,一些老顾客为此主动给他打起了广告。生意跟装修之前比起来,可以说是好上加好。

但就在这个时候,一个坏消息传来了:他被告知店铺商标涉及侵权!原来他所使用的Logo已经被人注册了,并且对方也是卖水果的,无巧不成书,这家水果店还就在同一个城市。虽然不是完完全全一样,但不管是色系,还是卡通形象,可以说是90%以上的相似度了。

以事件为原型做的对比图,真实Logo不方便提供

Logo相似侵权的界定

1.商标图形的构图和整体外观近似,易使相关公众对商品或者服务的来源产生误认的,判定为近似商标。

2.商标完整地包含他人在先具有一定知名度或者显著性较强的图形商标,易使相关公众认为属于系列商标而对商品或者服务的来源产生误认的,判定为近似商标。

法律明文规定 :

出了这样的事儿,小欧不甘心,想找设计平台要个说法,但是网站已经找不到了……鉴于小欧也是被骗,对方也没有蛮不讲理,双方选择庭外和解,小欧给予对方1.8万元作为赔偿。

1.8万元给小欧上了一课,他意识到了版权的重要性!其实小欧损失的何止1.8万元,门头上的商标还有加工好的以及正在加工的带有Logo的包装,他自己也懒得去算了。

门头上偌大的Logo被拆掉,比之前更醒目了,好多人问及此事,他也表示很无奈,虽然很想重新做一个装上去,但是一朝被蛇咬,还是有所顾忌。时间久了,他对设计Logo也心灰意冷了,但是跟供应商的闲聊后他又死灰复燃了。原来,闲聊中他从供应商口中得知一个正规的人工智能Logo设计平台——Logo设计网。

Logo设计网目前签约近600位Logo设计师,拥有近500万个Logo设计经验,因此用户无需任何设计经验,就能设计出完美Logo。

对于这个平台,“所有图案都有授权书,保证原创,完全不用担心版权方便出现问题”是最吸引他的,即便如此,他也没有盲目选择,而是在做了一番功课之后,发现这个平台确实很有优势。

功课做完,毫不犹豫,就它了!小欧一刻都不想等了,因为拆掉Logo后的门头自己都快看不下去了。

Logo的生成是利用人工智能为您在线设计制作企业Logo。小欧先是输入企业名字“小欧鲜果”,然后选择企业所属行业、喜欢的标志类型、颜色还有形状,Logo设计网在2分钟内就设计出一款高质量原创Logo了。

部分Logo效果图

整体上小欧还是挺满意的,但还是想用橙子这个元素,毕竟是孩子喜欢的嘛,想体现出来。他选择了其中最喜欢的一款,通过Logo设计网提供的专业套餐,修改后的Logo小欧和孩子都非常喜欢。

Logo修改前后对比

“Logo设计,从未如此简单,也从未如此放心!”小欧感慨道。

Logo设计网表示:此Logo可用于任何商业及非商业用途,无须任何额外的授权。如需购买Logo注册商标,Logo设计网也可以为您提供商标注册服务。

小欧毫不犹豫购买了注册商标,也都交由Logo设计网一手操作了,这样一来,Logo这块就再无后顾之忧了。

目前Logo设计网已经生产了近600万个Logo,服务企业近一万五千家,Logo设计案例丰富,使用Logo设计官网,你也可以制作出精美的Logo!

如果你不想像小欧一样走弯路和别人撞车的话,大可放心的选择Logo设计网,想了解更多Logo设计网详情,点击访问A5: 专业的事儿还是应该交给专业平台做!

作者:栗子 文章来源:A5创业网 未经授权禁止转载

因网站改版导致网站被降权,应当怎么处理?

admin阅读(75)

 

导读:网站改版引发降权怎么办?网站被降权了要怎么处理?针对网站降权,带来的影响还是蛮大的,网站一旦被出现降权的现象,意味关键词的排名下降,流量减少,严重的让网站优化数据,直接回到新站时期,这是站长最不愿意看到的,那么网站改版引发降权怎么办?下面跟随深度网具体了解下。

一、网站被降权会有什么样的表象?

有些站长对于网站降权存在错误理解,以为关键词下降就是被降权,网站被降权主要表现在site查域名首页不在首位,网站收录下降,索引量下降,关键词排名整体下降等,这些都是网站降权的征兆,这个站长一定要清楚,并不是某一个关键词下降,就是降权,一定要整体分析。

二、网站被降权的主要原因有哪些?

网站并不会平白无故的降权,网站被降权,肯定是某个方面违背了搜索引擎算法导致,常见的导致网站被降权的原因有:网站改版、网站不稳定、内容质量差、外链不规范、使用作弊优化手段等,都会导致网站被降权,如发现被降权的征兆,就立马要改正,否则就会整站被降权。

三、为什么网站改版会引发网站降权?

改版网站是为了更好的满足用户需求与搜索引擎优化,针对网站改版导致被降权,主要是因为改版不到位,没有考虑网站改版引发优化问题,比如说,网站改版应当保存原因有价值的内容,却没有保留,全部全新换了内容,原先高质内容不复存在,这种改版肯定会导致网站被降权、关键词下降问题出现。

四、网站改版需要做哪些工作避免被降权?

1、网站栏目不变或只增不减

因改版删掉栏目,相应的会删除相应栏目中的内容,原先的优质内容被清除,被搜索引擎收录的内容,变成了死链接,突然大批量死链,肯定会导致网站被降权,要想避免大面积降权出现,必须要保留原有的栏目,以及原有的优质内容;

2、保持原有网站结构与URL

网站改版改版的不仅是页面设计,网站结构与URL,也会进行调整,如果原先网站结构好,就保留结构,URL符合优化,就保留原先的URL,做好老站跟新站的数据对接,这种改版仅仅是更换下页面皮肤,增加一些优质内容,网站不会被降权。如果是全新改版,那需要采取更多措施,接着往下看:

3、保留原先有价值的页面与内容

网站改版虽然是全新做一个网站,但可以保留原先的优质内容与优质页面,把老网站内容内容数据对接到新站内部,这样保留有价值的内容,对网站优化有很大的帮助作用;

4、设置404错误页面

对网站结构、URL都做调整了,原有的老网站数据被清空,原先被搜索引擎收录的页面就无法打开,变成了死链,如果不设置404引导页面,蜘蛛会继续抓取网站,而抓住的内容无法打开,认为网站不稳定,对网站进行降权惩罚,而设置404页面,直接告诉蜘蛛,这些页面已经被删除,不需要来抓取,让蜘蛛抓取其他有效页面;

5、死链接地址提交

网站改版老域名新用,都会产生大量的死链接,要把这些死链接向搜索引擎提交,告知搜索引擎这些页面不需要的,不要再来抓取,如果不及时提交死链接,会影响蜘蛛的访问体验以及用户的体验,增加百度服务器负担,自然会影响到搜索引擎到网站的评判,所以改版新站正是上线,就得提交死链,用site:域名的方式将已有的收录整理出来,在通过百度站长“死链接提交”功能进行提交。

6、robots文件直接屏蔽被删除内容

robots文件是网站跟搜索引擎之间的一种协议,通过robots文件告诉搜索引擎网站哪些页面允许抓取,哪些页面不允许抓取,网站改版之后,会有很多死链接存在,了解死链的目录以及页面等无效信息,在robots文件中进行屏蔽,然后在百度站长工具中的“robots”功能中进行更新,让搜索引擎知道网站最新的robots协议。

总之,网站改版是为了让网站往更好的方面发展,不要过于担心网站改版导致降权,做好相关的防止因网站改版带来的降权的措施,如果做好了相应的措施,不仅不会被降权,还有利于新站的优化的发展,除了以上的几种方式之外,网站改版还需要保持网站持续更新原创高质的内容,坚持优质外链的建设,引导蜘蛛抓取新内容,持续做优化,新站能够快速被搜索引擎接纳,所以不要过于担心网站改版会导致网站被降权问题。

文章来源深度网http://www.shenduwang.cn/Article/wzgbhyfjqm.html转载请注明!

网站图片优化,这几点做到了吗

admin阅读(71)

 

导读:网站除了由文字、代码组合,还有很多图片,做好图片优化是非常有必要,通过优化图片,能够让搜索引擎收录网站内部图片,这样跟网站有关的图片,能够在搜索引擎图库中展现,这也是图片推广的一种方式,那么具体怎么做图片优化呢?下面深度网与您分享。

1、图片质量度要高

图片一定要清晰、新颖、原创,如果图片模糊、质量度低,这种发布到网站上,引起用户反感,搜索引擎也不会喜欢,还有就是图片大小、质量度要控制好,要考虑网页加载速度,以及页面的美观性。

2、图片要加alt标签

搜索引擎对于图片的内容识别,还没有那么高,不能明白图片所表达的意思,alt标签的出现,就是帮助搜索引擎更好的识别图片内容,在上传图片,一定要填写alt标签,就是填写图片的描述,提高图片的收录。

3、图片周围的文字

百度出了参考alt标签,同时也会参考图片周边的文字,便于更好的识别图片内容,还有一个方面,alt标签内容是不会展示出来,而在文章下面展示文字,图文结合,便于用户快速了解图片内容,提升用户体验。

4、图片要本地化

当更新的文章没有相关的图片,但是必须要配图,解决的方法,就是在百度中查询相关的图片,借用别人图片更新到网站里面,这种有些新人,就直接复制图片,更新到自己网站里,这种方式不好,帮别人做嫁衣,这种调用方式等同给对方网站做外链,并且如果对方网站删除了图片,相应的你的网站图片也无法展示,所以要求,先下载,然后在自己网站后台上传,还有主意,下载图片,用ps修改下尺寸或者裁切,与原图发生一点改变,便于收录。

5、图片的原创度

百度喜欢原创这个不用多说,图片作为网站的重要组合部分,一直抄袭对于不利于开展图片推广,加上现在越来越重视版权,涉及侵权问题,蜘蛛也不喜欢抄袭的图片,最好是针对文章内容,设计一张高质量的图片,这对于文章的优化也会有帮助。

总之,上传图片一定要注意图片的质量度、尺寸、alt标签、原创度等,这些都是做好图片优化的重点,只有按照这些优化技巧,来优化图片,网站图片才会被搜索引擎收录,图片推广才会带来的效果。

文章来源深度网http://www.shenduwang.cn/Article/wztpyhzjdzdlm.html转载请注明!

开源SEO 更专业 更方便

联系我们投稿网址