精华内容
下载资源
问答
  • 可以列出所有已发布开源项目,也可以从GitHub发布项目。 想要贡献? 您可以做两件事: 打开有关错误,功能请求,页面或组件问题, 或通过自己编写和/或实现它来解决问题! :hammer_and_pick: 构建设置 ...
  • 用于将项目构建到静态可部署文件中。 林亭 此外,您还可以执行yarn run lint以查看格式错误,并执行yarn run lint:fix进行修复。 如果您忘记编写代码,请不要担心! 肯定有人会在另一个提交中为您修复它 :grinning_...
  • 接着上一篇文章,详细说说如何把一个带CEGUI的项目发布到XP平台。 这个问题纠缠了我好几天。这里把详细解决思路记下来。有同样问题朋友可以少走很多弯路。 核心方法就一句话。“你项目使用所有外部依赖库都用/...

    接着上一篇文章,详细说说如何把一个带CEGUI的项目发布到XP平台。

    这个问题纠缠了我好几天。这里把详细解决思路记下来。有同样问题的朋友可以少走很多弯路。

    核心方法就一句话。“你项目使用的所有外部依赖库都用/MT编译。”

    1.准备。

    首先你要具备如下工具:CEGUI源码;FreeType源码;Pcre源码;CMake工具。我会在下文说明原因。

    各个开源库的版本号,请参考你的CEGUI引用的各自的头文件分别下载。

    FreeType开源库主页:http://sourceforge.net/projects/freetype/?source=dlp

    Pcre开源库主页:http://sourceforge.net/projects/pcre/?source=dlp

    Pcre源码编译指南:http://tunps.com/cmake-pcrecpp

    CMake工具主页:http://cmake.org/cmake/resources/software.html


    2.编译CEGUI

    请参考我的上一篇博客:http://blog.csdn.net/lsldd/article/details/8821063,编译CEGUI。注意,每个子项目都要配置好。

    编译完成后,你会发现一大堆Link冲突错误和警告,大概如下:

    1>freetype.lib(ftbase.obj) : warning LNK4217: locally defined symbol _strrchr imported in function _raccess_make_file_name
    1>pcre.lib(pcre_exec.obj) : warning LNK4049: locally defined symbol _memmove imported

    1>freetype.lib(smooth.obj) : error LNK2001: unresolved external symbol __imp__longjmp

    仔细观察错误,主要是FreeType导致的。原因是CEGUIBase这个工程中引入了如下几个库:

    Winmm.lib,freetype.lib,pcre.lib,zlib.lib

    因此我们猜想,这里的freetype是用/MD编译的!这就是罪魁祸首!必须自己用/MT编译源码!

    Pcre导致很多警告,我这里以防万一也自己编译了;

    ZLib也有1,2个警告,但是替换它就坑爹了,因为CEGUI把ZLib拷贝了部分源码(unZip部分)到自己工程,又修改了部分源代码(主要是吧C风格改成C++),因此我没有替换ZLib,结果表明不影响。


    3.编译依赖库

    同样参考发布到XP的标准步骤,分别编译FreeType源码;Pcre源码。然后把lib放入CEGUI的dependencies\lib目录下。

    注意。lib目录下还有2个目录,由于我们把CEGUI编译为DLL,所以,请放在dependencies\lib\dynamic目录下。

    然后编译CEGUI。这里由于CEGUI已经在上一步编译过,这一步只是LinK,所以重新Link的时间很短。

    Link后仍然会出现一堆库冲突错误。典型的如下:

    1>MSVCRT.lib(MSVCR110.dll) : error LNK2005: _malloc already defined in LIBCMT.lib(malloc.obj)
    1>MSVCRT.lib(MSVCR110.dll) : error LNK2005: _free already defined in LIBCMT.lib(free.obj)

    这就是因为工程中同时存在/MT与/MD的依赖,必须砍掉一个。由于我们要发布到XP必须使用/MT,因此,请忽略掉MSVCRT.lib,方法是:

    【工程属性】-【链接】-【输入】-【忽略指定依赖项】,输入MSVCRT.lib

    这样支持发布到XP的CEGUI就准备好了。


    4.配好你的项目

    对一个简单的CEGUI程序而言,需要用到如下DLL:

    CEGUIBase.dll,CEGUIOpenGLRenderer.dll, CEGUIExpatParser.dll, CEGUISILLYImageCodec.dll, CEGUIFalagardWRBase.dll ,SILLY.dll

    可能还需要部分C运行时库,比如msvcp100.dll之类。请自行准备,没有可以去别的系统上COPY或者下载。

    随时注意看CEGUI.Log文件,看哪个DLL加载失败。要么是找不到,要么是没有使用/MT编译。

    把CEGUI编译的相应的Lib链接如你的工程项目。

    同时,把【工程属性】-【链接】-【优化】里的第一项和第二项优化开关都打开

    同样用发布到XP的标准步骤,编译好你的工程。

    现在应该没有问题了。


    展开全文
  • 本项目目的是为实验室的同学和老师提供一个学习资源共享的平台,内容包括但不限于:入门书籍,论文,对开源NiuTrans的代码优化,个人或内部开发的代码,有用的其他开源项目,可以通过本项目的资源,快速步入学习轨道...
  • 一个发布和查找项目本地掉期/交易的平台。 该项目是通过。 可用脚本 在项目目录中,可以运行: yarn start 在开发模式下运行应用程序。 打开在浏览器中查看。 如果进行编辑,页面将重新加载。 您还将在控制台中...
  • 0.0我们第一个项目,大家加油,项目名称:基于地理位置晚会信息发布与互动平台 #你们提交时候记得,如果功能没有完成,可以在本地先写完一个单独功能或者页面并且测试后在上传主分支,不然都一律都提交到别...
  • CocosCreator可以将开发游戏发布到Android平台,使用Android Studio可以构建和运行编译目录下(frameworks\runtime-src\proj.android-studio)工程。但其生成工程比较复杂,当我们需要从一个已有Android项目...

    一,前言

    CocosCreator可以将开发的游戏发布到Android平台,使用Android Studio可以构建和运行编译目录下(frameworks\runtime-src\proj.android-studio)的工程。但其生成的工程比较复杂,当我们需要从一个已有的Android项目启动我们开发出的游戏时,整合的过程极其繁琐。笔者整理了整合过程,供有需要的同志参考,

    二,教程

    1. CocosCreator构建发布

    发布平台选择Android,模板选择default,方便后续整合。APP ABI笔者选择的是arm64-v8a。依次点击下方的“构建”、“编译“,编译过程会比较慢。

    在这里插入图片描述

    编译成功后会在发布路径生成jsb-default文件夹。
    在这里插入图片描述

    2. 导入libcocos2dx

    将编译路径下的:frameworks\cocos2d-x 整个文件夹整个拷贝到我们自己的安卓项目根目录,然后在自己的安卓项目根目录下的setting.gradle中添加如下代码:

    include ':libcocos2dx'
    project(':libcocos2dx').projectDir = new File('cocos2d-x\\cocos\\platform\\android\\libcocos2dx')
    

    3.修改gradle配置

    将proj.android-studio\gradle.properties里的内容复制到我们自己的安卓项目对应的gradle.properties里:

    
    # Android SDK version that will be used as the compile project
    PROP_COMPILE_SDK_VERSION=29
    
    # Android SDK version that will be used as the earliest version of android this application can run on
    PROP_MIN_SDK_VERSION=16
    
    # Android SDK version that will be used as the latest version of android this application has been tested on
    PROP_TARGET_SDK_VERSION=29
    
    # Android Build Tools version that will be used as the compile project
    PROP_BUILD_TOOLS_VERSION=28.0.3
    
    # List of CPU Archtexture to build that application with
    # Available architextures (armeabi-v7a | arm64-v8a | x86)
    # To build for multiple architexture, use the `:` between them
    # Example - PROP_APP_ABI=arm64-v8a
    PROP_APP_ABI=arm64-v8a
    
    #这部分的内容注释掉不用,有需要的可以自行探索
    # fill in sign information for release mode
    #RELEASE_STORE_FILE=D:/software/cocosDashboard/resources/.editors/Creator/2.4.2/resources/static/build-templates/native/debug.keystore
    #RELEASE_STORE_PASSWORD=123456
    #RELEASE_KEY_ALIAS=debug_keystore
    #RELEASE_KEY_PASSWORD=123456
    
    android.injected.testOnly=false
    

    然后sync

    将proj.android-studio\app\build.gradle里的内容复制到我们安卓目录下的app\build.gradle

    • Os
      在这里插入图片描述

    • externalNativeBuild
      在这里插入图片描述

      externalNativeBuild这里要修改路径

    • 下面的externalNativeBuildbuildTypes照常复制过去
      在这里插入图片描述

    • android.applicationVariants.all 需要修改一下,并且修改sourceDir的路径:

    android.applicationVariants.all { variant ->
        // delete previous files first
        delete "${buildDir}/intermediates/merged_assets/${variant.dirName}"
    
        variant.mergeAssets.doLast {
            def sourceDir = "D:/build/jsb-default"//这里改成你的编译路径
    
    // 以下几行是旧的代码,在新版Gradle下有问题
    //        copy {
    //            from "${sourceDir}/res"
    //            into "${outputDir}/res"
    //        }
    //
    //        copy {
    //            from "${sourceDir}/src"
    //            into "${outputDir}/src"
    //        }
    //
    //        copy {
    //            from "${sourceDir}/jsb-adapter"
    //            into "${outputDir}/jsb-adapter"
    //        }
    
    // 新的拷贝文件的方法,在新版Gradle可用
            copy{
                from "${sourceDir}"
                include "assets/**"
                include "res/**"
                include "src/**"
                include "jsb-adapter/**"
    
                into outputDir
            }
    
            copy {
                from "${sourceDir}/main.js"
                from "${sourceDir}/project.json"
                into outputDir
            }
        }
    }
    

    android.applicationVariants.all是将我们的游戏资源,包括代码和图片资源都复制到编译输出目录。如果你的游戏启动后资源没加载出来,可能就是这里的路径没有配置好。

    • dependencies里加入下面两行导入libcocos2dx(在这里是为项目导入libcocos2dx,名字可以在第二步修改):
      在这里插入图片描述

    此处贴一下我复制好后的app\build.gradle

    import org.apache.tools.ant.taskdefs.condition.Os
    
    apply plugin: 'com.android.application'
    apply plugin: 'kotlin-android'
    apply plugin: 'kotlin-android-extensions'
    
    android {
        compileSdkVersion 29
        buildToolsVersion "28.0.3"
    
        defaultConfig {
            applicationId "com.example.testmw"
            minSdkVersion 23
            targetSdkVersion 29
            versionCode 1
            versionName "1.0"
            multiDexEnabled true
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    
            externalNativeBuild {
                ndkBuild {
                    if (!project.hasProperty("PROP_NDK_MODE") || PROP_NDK_MODE.compareTo('none') != 0) {
                        // skip the NDK Build step if PROP_NDK_MODE is none
                        targets 'cocos2djs'
                        arguments 'NDK_TOOLCHAIN_VERSION=clang'
    
                        def module_paths = [project.file("../cocos2d-x"),
                                            project.file("../cocos2d-x/cocos"),
                                            project.file("../cocos2d-x/external")]
                        if (Os.isFamily(Os.FAMILY_WINDOWS)) {
                            arguments 'NDK_MODULE_PATH=' + module_paths.join(";")
                        }
                        else {
                            arguments 'NDK_MODULE_PATH=' + module_paths.join(':')
                        }
    
                        arguments '-j' + Runtime.runtime.availableProcessors()
                        abiFilters.addAll(PROP_APP_ABI.split(':').collect{it as String})
                    }
                }
            }
    
    
        }
        externalNativeBuild {
            ndkBuild {
                if (!project.hasProperty("PROP_NDK_MODE") || PROP_NDK_MODE.compareTo('none') != 0) {
                    // skip the NDK Build step if PROP_NDK_MODE is none
                    path "jni/Android.mk"
                }
            }
        }
    
        buildTypes {
            release {
                debuggable false
                jniDebuggable false
                renderscriptDebuggable false
                minifyEnabled true
                shrinkResources true
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                if (project.hasProperty("RELEASE_STORE_FILE")) {
                    signingConfig signingConfigs.release
                }
    
                externalNativeBuild {
                    ndkBuild {
                        arguments 'NDK_DEBUG=0'
                    }
                }
            }
    
            debug {
                debuggable true
                jniDebuggable true
                renderscriptDebuggable true
                externalNativeBuild {
                    ndkBuild {
                        arguments 'NDK_DEBUG=1'
                    }
                }
            }
        }
    
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
        kotlinOptions {
            jvmTarget = '1.8'
        }
    
        sourceSets {
            main { jniLibs.srcDirs = ['libs'] }
        }
        packagingOptions {
            exclude 'META-INF/proguard/coroutines.pro'
            exclude 'META-INF/proguard/okhttp3.pro'
        }
    }
    
    android.applicationVariants.all { variant ->
        // delete previous files first
        delete "${buildDir}/intermediates/merged_assets/${variant.dirName}"
    
        variant.mergeAssets.doLast {
            def sourceDir = "D:/build/jsb-default"
    //
    //        copy {
    //            from "${sourceDir}/assets"
    //            into "${outputDir}/assets"
    //        }
    //
    //        copy {
    //            from "${sourceDir}/src"
    //            into "${outputDir}/src"
    //        }
    //
    //        copy {
    //            from "${sourceDir}/jsb-adapter"
    //            into "${outputDir}/jsb-adapter"
    //        }
    //
    //        copy {
    //            from "${sourceDir}/main.js"
    //            from "${sourceDir}/project.json"
    //            into outputDir
    //        }
    
    // 新的拷贝文件的方法,在新版Gradle可用
            copy{
                from "${sourceDir}"
                include "assets/**"
                include "res/**"
                include "src/**"
                include "jsb-adapter/**"
    
                into outputDir
            }
    
            copy {
                from "${sourceDir}/main.js"
                from "${sourceDir}/project.json"
                into outputDir
            }
        }
    }
    
    dependencies {
        implementation fileTree(dir: "libs", include: ["*.jar"])
        implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
        ......
        ......
    
        implementation fileTree(dir: "../cocos2d-x/cocos/platform/android/java/libs", include: ['*.jar'])
        implementation project(':libcocos2dx')
    }
    

    3.复制jni文件夹

    复制proj.android-studio/app/jni文件夹到自己安卓目录的app文件夹里
    在这里插入图片描述
    在这里插入图片描述

    复制proj.android-studio\jni整个文件夹到自己的项目根目录里
    在这里插入图片描述

    jsb-default\frameworks\runtime-src里Classes文件夹拷贝到项目根目录的jni文件夹里,因为jni文件夹里的CocosAndroid.mk定义了Classes的路径(LOCAL_C_INCLUDES和LOCAL_SRC_FILES),我们需要在这个文件里重新修改为我们刚刚Classes所在的相对路径,(或者不复制Classes文件夹里的内容,使用绝对路径):
    修改前:
    在这里插入图片描述

    修改后:
    在这里插入图片描述

    这一步后,我们自己的项目根目录里多了个jni文件夹:
    在这里插入图片描述

    app目录下多了个jni文件夹
    在这里插入图片描述

    4. 复制Activity

    修改版本
    在这里插入图片描述

    复制路径proj.android-studio\src\org\cocos2dx\javascript下的文件到项目里,修改相关的import信息
    在这里插入图片描述

    将proj.android-studio\app\AndroidManifest.xml里对Activity的注册和meta-data复制到我们自己的AndroidManifest.xml里

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="com.example.testapp1002">
    
        <uses-feature android:glEsVersion="0x00020000" />
    
        <uses-permission android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <meta-data android:name="android.app.lib_name"
                android:value="cocos2djs" />
            <activity
                android:name=".AppActivity"
                android:screenOrientation="sensorLandscape"
                android:configChanges="orientation|keyboardHidden|screenSize|screenLayout"
                android:label="@string/app_name"
                android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
                android:launchMode="singleTask"
                android:taskAffinity="" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity android:name=".MainActivity">
            </activity>
        </application>
    
    </manifest>
    

    5.编译运行

    上面的4步完成后可以开始在Android Studio里编译运行。
    然后会发现main.cpp报错,这是因为AppDelegate.h文件的include路径错误,需要在/jni/hellojavascript/main.cpp源码里修改一下
    在这里插入图片描述

    第一次编译会比较久
    在这里插入图片描述

    6.出现的bug

    当完成以上5个步骤后,我们可以在自己的项目里像使用Activity一样启动我们的游戏了。

    Intent(that, AppActivity::class.java).apply { startActivity(this) }
    

    但是可能会在打开这个Activity的时候闪退,我自己查看的日志显示的原因是Cocos2dxHelper.registerBatteryLevelReceiver(this);这一行代码出错了,找不到静态方法。我选择将这个和BatteryLevelReceiver相关的代码注释掉。

    即修改路径cocos2d-x\cocos\platform\android\java\src\org\cocos2dx\lib下Cocos2dxActivity.java
    注释以下两行代码:

     Cocos2dxHelper.registerBatteryLevelReceiver(this);
     Cocos2dxHelper.unregisterBatteryLevelReceiver(this);;
    

    7.闪退(重点)

    到了这步我们似乎已经能成功的从安卓项目进入到我们的游戏了,但是当我们选择退出游戏想要回到安卓App界面时,发现只闪了一下安卓App的界面,程序就自动退出了,日志的最后一行是:

    Sending signal. PID: 18232 SIG: 9
    

    这是因为我们游戏中调用cc.game.end();后,Cocos2dxActivity.java的onDestroy方法里调用了Cocos2dxHelper.terminateProcess();方法,其实现如下:

    public static void terminateProcess() {
        android.os.Process.killProcess(android.os.Process.myPid());
    }
    

    在这里获取了当前App的线程Id然后直接杀死App,如果我们将这个方法注释掉,就不会出现App闪退的问题。
    但是,进入游戏后退出虽然没问题了,再次进入游戏却会产生黑屏并闪退,这是因为finish掉游戏的AppActivity后,其中的runOnGlThread()中的线程还在执行,Cocos2dxGLSurfaceView并没有被销毁掉。
    最终的解决方法是:在AndroidManifest中,在游戏所在的activity标签,设置独立的进程:android:process="com.exam.game"

    <activity
        android:name=".cocos.AppActivity"
        android:process="com.exam.game"
        android:screenOrientation="sensorLandscape"
        android:configChanges="orientation|keyboardHidden|screenSize|screenLayout"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
        android:launchMode="singleTask"
        android:taskAffinity="" >
    </activity>
    

    参考:Android app内接入cocos 2dx js 所遇问题

    三、整合后的编译运行

    当我们完成整合后,在CocosCreator中对游戏工程作出了修改,要同步到我们的安卓工程也非常方便。
    在CocosCreator中作出修改并保存好后,点击“项目”->“构建发布”:
    在这里插入图片描述

    在这里只需要点击“构建”并等待完成就行,无序再次进行编译。其作出的修改,就能同步到我们的安卓项目里(app\build.gradle中android.applicationVariants.all 的功劳)。

    四、数据交互

    当我们需要从游戏端获取安卓端的数据时,需要使用脚本调用安卓端的静态接口:

    if(cc.sys.os == cc.sys.OS_ANDROID){
        if(cc.sys.isNative==true){
            var ojb = jsb.reflection.callStaticMethod("com/example/testmw/jni/JniTestHelper", "showTipDialog", "(Ljava/lang/String;Ljava/lang/String;)V","test", "testsss");
        }
    }
    

    此处调用了下面的接口:

    package com.example.testmw.jni;
    public class JniTestHelper {
    
        private static void showTipDialog(final String title, final String text)
        {
            ......
        }
    }
    

    具体信息参考:官方文档

    但是当把游戏和Android App设置为不同的进程时,两个进程之间无法进行普通的数据共享,需要使用进程间数据交互的方式,参考:Android进程间通信方式Android 进程间通信的几种实现方式

    展开全文
  • 我们使用 Kitten编程猫这款少儿编程工具,开发出来的项目,另存成本地工程文件,...然而,我们可以通过一个叫做 APICloud 在线网站,几分钟之后就能基于 Kitten编程猫已经发布的作品,自动生成 Android 或者 iOS平

    我们使用 Kitten编程猫这款少儿编程工具,开发出来的项目,另存成本地工程文件,格式为bcm:

    bcm文件打开可以发现,内容是json格式的明文数据,包含了该项目内使用到的scene(场景),素材(styles), 积木(blocks)等等。

    通过编程猫另一款名叫格式工厂的开发工具,可以基于 bcm 转换成 windows 操作系统下的exe执行文件。

    然而,我们可以通过一个叫做 APICloud 的在线网站,几分钟之后就能基于 Kitten编程猫已经发布的作品,自动生成 Android 或者 iOS平台下的原生应用。

    登录 API Cloud官网:

    https://www.apicloud.com/signup

    注册一个账号,然后点击 创建应用 按钮:

    这里需要指定一个原始应用,作为安卓应用打包的源程序。我选择 Web App:

    然后在数字证书创建向导里,快速创建一个数字证书。指定包名,证书别名,证书库密码即可。

    给应用维护一个名称,指定编译的平台:

    点击云编译按钮,开始编译:

    需要先通过APICloud的实名认证:

    等候一分多钟,云编译便结束了:

    最后得到了生成 apk 文件的下载链接:

    接下来就可以在Android手机上安装 apk 并体验应用了:

    更多Jerry的原创文章,尽在:“汪子熙”:

    展开全文
  • 前言  最近一个月,过年的时候天天在家里呆...从项目的目标来说,希望使用者可以很方便的使用现有的数据挖掘、机器学习算法与添加需要的算法。 项目概述  项目目前主要关注中文文本的数据挖掘算法。由于每种数

    前言

         最近一个月,过年的时候天天在家里呆着,年后公司的事情也不断,有一段时间没有更新博客了。PyMining是我最近一段时间构思的一个项目,虽然目前看来比较微型。该项目主要是针对中文文本的数据挖掘算法的实验与应用。从项目的目标来说,希望使用者可以很方便的使用现有的数据挖掘、机器学习算法与添加需要的算法。

    项目概述

         项目目前主要关注中文文本的数据挖掘算法。由于每种数据挖掘算法的局限性都很大,就拿分类算法一样,决策树、朴素贝叶斯这两种算法都有着自己的特性,只能在某一种类型的类型的数据上应用比较良好,比如朴素贝叶斯,就对于那些短文本的分类比较适合,而决策树对于短文本、稀疏情况下就效果欠佳了,特别是在数据比较稀疏的情况。在这种情况下,当有一个数据挖掘任务的时候,怎样去找到一个合适的算法就非常重要了。如果从头开发算法,是一个成本很高的事情,特别是对文本来说就更麻烦,需要在前面做一些如分词、去停用词等等操作。如果有一个平台,可以支持快速的开发,让用户能够快速的看到,针对自己的数据,什么样的算法比较合适,就是本项目的一个初衷。

         在这个角度上来说,还是有一些开源的数据挖掘工具,如weka是一个很全面的工具,里面支持几十上百种数据挖掘(机器学习)的算法。不过从我之前使用weka的经验来说,weka对于中文的支持非常糟糕,而且对于稍大一点的数据,就直接罢工不干了(我记得尝试过一个40M左右的文本的聚类任务,weka直接死掉了)。所以开发出一个支持中文、能够支持更大数据量的平台就很有必要了。

         另外项目目前规划上来说,主要是针对单机上能够运行的任务。虽然分布式机器学习算法(换个更fashion的名字是云计算),是目前最热门的一个话题,但是对于大多数的任务来说,单机版也足够了。对于算法的学习、试验来说,单机版可以更简单、方便的将算法的特性展示出来。当了解了怎样写单机版后,将其改写为简单的分布式版本(比如mpi或者map-reduce),并不是那么复杂的一个事情。

         目前项目使用Python作为开发语言,虽然之前只写过c++,但是从接触Python开始,就觉得Python语言在快速开发、可读性方面非常的适合,而且极其良好的跨平台型也是Python的优势,我平时的开发环境是在linux(ubuntu)下进行。

         项目的名字是PyMining,这个取这个名字是为了能够简单的说明项目的开发语言与用途,Py是指的Python,Mining是指的Data Mining(数据挖掘)。

         PyMining与我的工作:

         由于我的工作就是分布式数据挖掘,而且中文的数据挖掘也是我的工作的方向之一,这里就谈谈PyMining与我工作的关系。PyMining是我完全利用下班后的时间开发,对于我实现的算法,我将会尽量的参考经典的实现(已经公开的论文、网页等内容),而非公司那些我平时接触的算法的实现。

         另外对于分词词典、测试数据等比较“贵重”的内容,我也不会使用任何受保护的数据,我会选择那些网上比较容易找到的内容并且加以提炼与修改作为项目的一部分。

    License

         目前使用BSD作为项目的License,简单来说,就是本项目的源代码可以被商业、非商业自由的使用,也可以将其修改作为二进制和源代码再次发布,但是保留原源代码(或者原源代码编译的二进制程序)的BSD协议,并且不能使用原作者(机构)名字来作为产品的市场推广,更详细的信息请参见发布包内的文档。

    中文文本的数据挖掘基础

         想了想,还是先科普一下中文文本的数据挖掘基础吧。一个典型的文本分类的数据挖掘流程:

    image

         上面这张图初看有点乱,我这里解释一下,红色的部分是训练时候调用的模块,绿色是测试时候调用的模块,而蓝色的部分是训练的时候生成的中间文件,它们联系着训练、测试两个部分。

          从左到右看是算法运行的流程,首先用户给出原始的用于训练的中文文本,然后进行分词等操作。

          经过了生成矩阵这个步骤,文本就转化成了数学语言了,之后的算法都是运行在这个数学语言之上,之后的算法就不再关心输入的数据是否是文档了,换句话来说,生成矩阵这个模块相当于是一道门,门内是纯数学表示的算法,门外是原始的文本语料。

          图上的特征选择、朴素贝叶斯分类器就是属于门内的内容,具体的算法具体分析。对于特征选择算法朴素贝叶斯分类器,可以点链接,看看wikipedia的定义。

    如何使用PyMining:

         如何获取项目(目前版本0.0.0.1,第一个开发版)

         GoogleCode地址:https://python-data-mining-platform.googlecode.com/svn/trunk

         直接下载的zip包地址:http://code.google.com/p/python-data-mining-platform/downloads/detail?name=py_mining_0.0.0.1.zip&can=2&q=#makechanges

         给出一段示例代码:

    from matrix import Matrix
    from classifier_matrix import ClassifierMatrix
    from segmenter import Segmenter
    from py_mining import PyMining
    from configuration import Configuration
    from chisquare_filter import ChiSquareFilter
    from naive_bayes import NaiveBayes
     
    if __name__ == "__main__":
        config = Configuration.FromFile("conf/test.xml")
        PyMining.Init(config, "__global__")
        matCreater = ClassifierMatrix(config, "__matrix__")
        [trainx, trainy] = matCreater.CreateTrainMatrix("data/train.txt")
        chiFilter = ChiSquareFilter(config, "__filter__")
        chiFilter.TrainFilter(trainx, trainy)
     
        nbModel = NaiveBayes(config, "naive_bayes")
        nbModel.Train(trainx, trainy)
     
        [testx, testy] = matCreater.CreatePredictMatrix("data/test.txt")
        [testx, testy] = chiFilter.TestFilter(testx, testy)
        [resultY, precision] = nbModel.Test(testx, testy)
        
        print precision

        这段代码分成了训练和测试两个阶段,首先值得注意的是,项目的模块需要的参数都是从一个xml格式的配置文件中得到的,也就是代码中的test.conf。代码最开始,调用Configuration.FromFile函数,从xml配置文件中解析出需要的dom tree。之后的那些模块初始化的时候,都将获取这个配置信息类Configuration的实例config中指定的标签的信息,比如ClassifiterMatrix类初始化的时候,将使用标签为__matrix__的信息,待会我将贴出xml的代码,可以更清楚的看到。初始化的时候,可以指定最后一个布尔参数(isFromFile),这个参数的意思是,是否这个模块从配置类中指定的文件中载入得到。一般在训练的时候,指定这个参数为False,而在单独测试的时候,需要指定这个参数为True,因为需要从训练的时候生成的文件中载入训练的模型才能够进行测试。

       首先谈谈训练的过程:

        然后调用PyMining.Init, PyMining是一个全局模块的参数,里面放置着一些在全局中都有用的一些参数,目前里面有4个dictionary,term-to-id(从单词的str到单词的id), id-to-term,id-to-doc-count(某一个单词的id对应了多少篇文档),class-to-doc-count(某一个分类里面有多少篇文档),这些信息在特征选择、预测、以及结果的展示中将起到很重要的作用。

        接下来的ClassifierMatrix就是前面图片中的“构成矩阵”这个模块,在其CreateTrainMatrix方法中,将会从原始的训练语料train.txt中,进行分词等操作,生成矩阵trainx, trainy。trainx是一个m * n的矩阵,表示数据的部分,每一行表示一篇文档,每一列表示一个feature(单词)。trainy是一个m * 1的矩阵,表示每篇文档对应的分类id。从生成矩阵之后,算法看到的信息就只有矩阵了。

        接下来生成了一个chiFilter,也就是chi-square的feature selection(可参考前面的wikipedia的链接),chiFilter将使用算法来看看哪些特征(列)是没有什么必要的,并且将其过滤掉,其Create方法传入的参数就是之前的trainx, trainy,结果将是一个保存在chiFilter实例中的一个黑名单,表示哪些feature-id是需要过滤掉的。其TestFilter方法就是使用之前得到的黑名单来过滤掉矩阵中不重要的列。

        最后就是分类算法了,这里是使用的朴素贝叶斯(NaiveBayes)算法。调用其Train方法可以得到一个模型并且保存到实例中。

        然后是预测(测试)的过程:

        PyMining的训练、测试的过程可以独立的运行,可以先训练出一个模型,等到有需要的时候再进行测试,所以在训练的过程中,有一些数据(比如说chi-square filter)中的黑名单,将会保存到文件中去。如果想单独的运行测试程序,请参考下面的一段代码,调用了NaiveBayes.Test方法后,返回的resultY就是一个m * 1的矩阵(m是测试文档的个数),表示对于每一篇测试文档使用模型测试得到的标签(属于0,1,2,3)中的哪一个,precision是测试的准确率。

        单独运行测试(从文件中载入训练的结果)的代码如下:

    from matrix import Matrix
    from classifier_matrix import ClassifierMatrix
    from segmenter import Segmenter
    from py_mining import PyMining
    from configuration import Configuration
    from chisquare_filter import ChiSquareFilter
    from naive_bayes import NaiveBayes
     
    if __name__ == "__main__":
        config = Configuration.FromFile("conf/test.xml")
        PyMining.Init(config, "__global__", True)
        matCreater = ClassifierMatrix(config, "__matrix__", True)
        chiFilter = ChiSquareFilter(config, "__filter__", True)
     
        nbModel = NaiveBayes(config, "naive_bayes", True)
     
        [testx, testy] = matCreater.CreatePredictMatrix("data/test.txt")
        [testx, testy] = chiFilter.TestFilter(testx, testy)
        [resultY, precision] = nbModel.Test(testx, testy)
        
        print precision

        下面是配置文件,这里大概的讲讲:

    <config>
        <__segmenter__>
            <main_dict>dict/dict.main</main_dict>
        </__segmenter__>
    
        <__matrix__>
        </__matrix__>
    
        <__global__>
            <term_to_id>mining/term_to_id</term_to_id>
            <id_to_term>mining/id_to_term</id_to_term>
            <id_to_doc_count>mining/id_to_doc_count</id_to_doc_count>
            <class_to_doc_count>mining/class_to_doc_count</class_to_doc_count>
        </__global__>
    
        <__filter__>
            <rate>0.5</rate>
            <method>max</method>
            <log_path>mining/filter.log</log_path>
            <model_path>mining/filter.model</model_path>
        </__filter__>
    
        <naive_bayes>
            <model_path>mining/naive_bayes.model</model_path>
            <log_path>mining/naive_bayes.log</log_path>
        </naive_bayes>
    </config>
    

         里面的每一个二级标签就是一个模块的熟悉,比如说__segmenter__里面的信息就是分词器所需要的一些配置信息,有些名字是加上了__xxx__的样子,表示是默认的模块,__segmenter__里面main_dict为主词典

         __global__里面是几个全局的表,也就是之前提到的PyMining模块中的内容,mining/term_to_id表示保存到文件的路径。

         __filter__表示过滤器,rate表示选择百分之多少的feature,method有两种max与avg,这里具体请参考wiki中的文档,log_path表示该模块运行的时候,输出的日志信息的路径。model_path表示训练过程中得到的黑名单的输出的路径。如果有需要,我们可以从文件中载入训练的结果。

         naive_bayes跟filter差不多,这里就不再多说了。

         PyMining中有哪些模块:

         目前PyMining中具有下面的模块。具体的api请参考源文件,

         Segmenter: 一个非常简单的分词器,采用贪心法进行分词。

         ClassifierMatrix: 生成分类算法中需要的矩阵

         ChisquareFilter: chisquare 的feature selector

         NaiveBayes: 朴素贝叶斯分类器

         运行PyMining:

         调用python naive_bayes_train_test.py,将会输出 0.86。这是分类的准确率。PyMining中目前的训练测试数据是东东提供的,来自团购网站的标题的分类,0表示美食、1表示美容美发、2表示休闲娱乐、3表示其他,训练数据看起来是这个样子:

    仅售28元!原价最高466元的“兰彩鸣量贩KTV”两小时豪华欢唱套餐一份:两个小时不限时段欢唱+不限包房类型+可连续累计消费+爆米花一份+VC一扎!(豪华包最多容纳45人,最小包可容纳4人)邀请好友返利10元!    2      
    仅售39元!原价113元的“北京铭豪苑火锅烧烤城”馋嘴锅双人套餐一份:干锅鸭翅(2.5斤左右)+羊肉(300g)+野山笋(300g)+鱼丸虾丸双拼(500g)+7元双拼+6元双拼+杂面一份!邀请好友返利10元!    0      
    仅售10元!原价176元的“水星健身”双日健身体验卡一张!    2

         运行完后,将会在mining目录下得到一些文件,这就是在训练过程中的一些日志、模型文件,可以打开来看看训练的结果。

          filter.log里面记录的是chisquare feature selector的结果,看起来是下面的样子:

    chiSquare info:     
    =======selected========     
    护理 139.541924743     
    美容 109.728270833     
    美发 99.0576860046     
    染发 80.5718475073     
    入住 65.4600301659     
    烫发 62.3015873016     
    面部 61.8500831431     
    早餐 54.3178973717     
    欧莱雅 53.246124031     
    男女 45.6000719014

    豆沙 2.71349224717     
    水煮鱼 2.71349224717     
    琵琶 2.71349224717     
    蛋挞 2.71349224717     
    新增 2.71349224717     
    接待 2.71349224717     
    酒楼 2.71349224717     
    12人 2.71349224717     
    吉列 2.71349224717     
    香菜 2.71349224717     
    鸡排 2.71349224717     
    ========unselected=======     
    春卷 2.71349224717     
    木瓜 2.71349224717     
    鳕鱼 2.71349224717     
    鳗鱼 2.71349224717     
    手卷 2.71349224717

    广场店 0.441547518923     
    实惠 0.441547518923     
    亲情 0.441547518923     
    青岛 0.441547518923     
    百纳 0.441547518923     
    米兰 0.441547518923     
    感受 0.441547518923     
    大海 0.441547518923     
    旗 0.441547518923     
    亚洲 0.441547518923

         这个列表上,越往上越是对分类有帮助的词,越往下,越是没有什么意义的词,单词后面的数字表示chisquare分数,越高说明单词越有意义。=====unselected=======表示一个分界线,分界线下面的词是被过滤掉的词。

         其他的信息可以看看其他的log文件,也会发现一些有趣的地方。

    PyMining下一步的开发计划(需要更多你的参与)

         PyMining之后会支持更多的算法(包括分类、聚类等算法),会支持更多的用法,会支持更丰富的文本格式。另外,之后可能会调用NumPy与SciPy,以进行更强大的矩阵计算。

        如果对希望参与开发的朋友可以联系我:wheeleast@gmail.com,要求Python有一定的开发经验,对机器学习 or 数据挖掘 or 模式识别算法有兴趣。

         对项目有任何其他问题的朋友可以联系我。

    9
    0
        (请您对文章做出评价)   
    « 上一篇:机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用
    » 下一篇:机器学习中的算法(1)-决策树模型组合之随机森林与GBDT
    展开全文
  • eoLinker AMS是集API文档管理、API自动化测试、开发协作三位一体综合API开发管理平台,是中国最大在线API管理平台。目前eoLinker AMS已经为来自全球超过两万家企业托管超过一百万API,我们感谢每个曾经以及...
  • eoLinker AMS是集API文档管理、API自动化测试、开发协作三位一体综合API开发管理平台,是中国最大在线API管理平台。目前eoLinker AMS已经为来自全球超过两万家企业托管超过一百万API,我们感谢每个曾经以及...
  • 这样正对不同环境就可以编译出不同的exe或者dll,做到一个项目的灵活多变。条件编译还可以满足库的更改,X86,X64直接切换也很灵活。 转载于:https://www.cnblogs.com/RainbowInTheSky/p/5369757.html...
  • 这个是我大一时候一个练习的项目,使用是Servlet+JSP方法,比较适合初学人员参考一下,当然代码中还有不完善地方,毕竟当时写代码还是有些稚嫩,不过学习价值还是有。喜欢小伙伴可以拿去参考...
  • 大家好,今天给大家讲解一个多年活跃项目,现在玩依旧可以赚钱!“同城便民信息平台” 同城便民平台其实可以做成:网站+小程序+公众号+微信号形式,最简单粗暴就是通过发布信息或者广告进...
  • 将编写好web程序,我们可以使用myeclipse提供打包功能来打成war包,具体步骤如下: 1 在tomcat服务器那里选择Add Deployment...或点击快捷图标方式来加入写好web工程.   2 在弹出发布“New ...
  • 一、环境及软件准备 运行环境: JDK1.8、Tomcat8、apache-maven-3.5.3、windows10...Generic Java package (.war)(一个web项目,直接部署到容器中就可以用了) 二、jenkins安装 直接将下载war丢到Tomcat中...
  • eoLinker AMS是集API文档管理、API自动化测试、开发协作三位一体综合API开发管理平台,是中国最大在线API管理平台。目前eoLinker AMS已经为来自全球超过两万家企业托管超过一百万API,我们感谢每个曾经以及...
  • 基础流程介绍(发布项目--审核--用户支持购买项目服务) 后台项目审核页面地址 ${根页面url}/admin ; 管理员账号:admin,密码:123456 一、注册登陆后发起项目 1.基础信息 2.项目信息 3.项目详情 4.回报设置 5.编辑...
  • 在Startcrowd,项目发起者可以发布他们的项目,其他人可以参与项目。 在未来迭代中,贡献者将能够通过区块链代币获得报酬。 Startcrowd产品已经启动 (暂时还没有开通区块链功能)。 平台上目前的项目涵盖了...
  • 平台和多用户应用程序,它可以构成14种不同类型的项目(关联,多项选择,分类,棋盘格,开发,听写,标记,排序,简答,多种答案,只需单击一下,即可输入不完整文本(真或假,要识别区域,页面)并发布形成...
  • 自动化GitHub项目的发布过程。 它能做什么 在GitHub上创建和管理项目通常需要大量时间和精力。 特别是在开发库时,发布新版本所需的任务通常非常漫长,复杂且容易出错。 认识自动发布功能,这是一个基于NodeJS的...
  • 在Startcrowd,项目发起者可以发布他们的项目,其他人可以参与项目。 在未来迭代中,贡献者将能够通过区块链代币获得报酬。 Startcrowd产品已经启动 (暂时还没有开通区块链功能)。平台上目前的项目涵盖了智能...
  • 创造你游戏 项目设置 npm install 编译和热重装以进行开发 npm run serve 编译并最小化生产 npm run build 运行测试 npm run test 整理和修复文件 npm run lint 自定义配置 请参阅。
  • src中存放的为项目的java源文件, .sql文件为用到的数据库SQL脚本 .war为项目包,当配置好数据库后,可直接发布;也可以解压后和src配合,配置在Eclipse3.3 + MyEclipse6.01(当时我的开发平台)上。
  • 项目是 Android 平台的实现。 应用程序提供以下功能: 添加/删除项目项目添加和删除测试用例 为每个测试用例添加/删除测试步骤 手动通过测试 将测试结果发布到服务器 查看测试结果 请求/响应所有结构及其...
  • 由于它基于.Net Xamarin.Forms框架,因此它是完全跨平台的,因此可以安装在多个平台上: Windows 10(可能是Windows 7) 安卓 的iOS 该项目的特点: 管理疾病数据的能力(添加,删除,搜索) 本地化:应用程序...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,784
精华内容 1,913
关键字:

可以发布项目的平台