<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.yanjiuyanjiu.com/styles/feedsky2.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link href="http://feed.yanjiuyanjiu.com" type="application/rss+xml" rel="self"></atom:link><fs:self_link href="http://feed.feedsky.com/soulmachine" type="application/rss+xml"></fs:self_link><lastBuildDate>Mon, 23 Apr 2012 16:29:49 GMT</lastBuildDate><title>研究研究</title><description>关注互联网和人工智能</description><image><url>http://www.feedsky.com/feed/soulmachine/sc/gif</url><title>研究研究</title><link>http://www.yanjiuyanjiu.com</link></image><link>http://www.yanjiuyanjiu.com</link><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><language>en</language><pubDate>Thu, 26 Apr 2012 08:43:48 GMT</pubDate><item><title>CentOS 服务器安装操作全记录</title><link>http://www.yanjiuyanjiu.com/archives/4281</link><content:encoded>&lt;p&gt;# 这是我安装CentOS服务器的过程，记录下来，与大家一起分享。&lt;/p&gt;
&lt;p&gt;#CentOS 6.2 ，CentOS-6.2-i386-bin-DVD1.iso（32位） ，CentOS-6.2-x86_64-bin-DVD1.iso（64位）&lt;/p&gt;
&lt;p&gt;#安装 CentOS时，选择 “Basic Server”&lt;/p&gt;
&lt;p&gt;#root密码：root123&lt;/p&gt;
&lt;p&gt;#CentOS 自带了ssh&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;#&lt;/strong&gt;&lt;strong&gt;安装完操作系统后，添加一个用户 dev&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;[root@localhost ~]$ &lt;strong&gt;useradd dev&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#然后密码设为 dev123&lt;/p&gt;
&lt;p&gt;[root@localhost ~]$ &lt;strong&gt;passwd dev&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;# 给予 sudo 权限&lt;/p&gt;
&lt;p&gt;[root@localhost ~]$ &lt;strong&gt;chmod u+w /etc/sudoers&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;[root@localhost ~]$ &lt;strong&gt;vi /etc/sudoers&lt;/strong&gt;&lt;br /&gt;
# 在root ALL=(ALL) ALL 下 添加dev ALL=(ALL) ALL&lt;br /&gt;
[root@localhost ~]$ &lt;strong&gt;chmod u-w /etc/sudoers &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#&lt;br /&gt;
&lt;strong&gt;#&lt;/strong&gt;&lt;strong&gt;安装完操作系统后，还不能上网，按如下命令配置DHCP方式上网：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;vi /etc/sysconfig/network-scripts/ifcfg-eth0&lt;/strong&gt;&lt;br /&gt;
DEVICE=”eth0&amp;#8243;&lt;br /&gt;
HWADDR=”00:0C:29:BD:E1:19&amp;#8243;&lt;br /&gt;
NM_CONTROLLED=”yes”&lt;br /&gt;
ONBOOT=”yes”&lt;br /&gt;
BOOTPROTO=dhcp&lt;br /&gt;
USECTL=no&lt;br /&gt;
TYPE=Ethernet&lt;br /&gt;
PEERDNS=yes&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;#&lt;/strong&gt;&lt;strong&gt;安装常用软件&lt;/strong&gt;&lt;br /&gt;
# &lt;strong&gt;有两种方式&lt;/strong&gt;，&lt;strong&gt;方法一&lt;/strong&gt;，去官网下载已经编译好的二进制文件，或源代码，编译安装&lt;/p&gt;
&lt;p&gt;# &lt;strong&gt;方法二&lt;/strong&gt;，用yum 命令安装，安装官方yum源里已经编译好的程序包。&lt;/p&gt;
&lt;p&gt;# 第一种方式要敲很多命令，比yum麻烦，但是可以预先下载好文件，省略了下载的时间，整体速度比&lt;/p&gt;
&lt;p&gt;#yum安装方式快很多，而且可以安装最新版。推荐第一种方式&lt;/p&gt;
&lt;p&gt;#第二种方式操作简单，敲打的命令少，但是往往yum源的更新速度跟不上各个软件的官网速度，&lt;/p&gt;
&lt;p&gt;#用Yum安装的版本经常比较旧&lt;/p&gt;
&lt;p&gt;#&lt;/p&gt;
&lt;p&gt;#yum的命令形式一般是如下：yum [options] [command] [package ...]&lt;br /&gt;
#其中的[options]是可选的，选项包括-h（帮助），-y（当安装过程提示选择全部为”yes”），-q（不显示安装的过程）等等。[command]为所要进行的操作，[package ...]是操作的对象。&lt;br /&gt;
#&lt;br /&gt;
#yum search package-name # 在线搜索包&lt;/p&gt;
&lt;p&gt;#yum list installed # 列出所有已经安装的包&lt;/p&gt;
&lt;p&gt;#&lt;/p&gt;
&lt;p&gt;#sudo yum install package-name # 安装程序包&lt;/p&gt;
&lt;p&gt;#sudo yum groupinsall group-name 安装程序组&lt;/p&gt;
&lt;p&gt;#&lt;/p&gt;
&lt;p&gt;#sudo yum remove package-name 删除程序包&lt;br /&gt;
#sudo yum groupremove group-name 删除程序组&lt;br /&gt;
#&lt;br /&gt;
#yum update #全部更新&lt;br /&gt;
#yum update package-name #更新程序包&lt;/p&gt;
&lt;p&gt;#sudo yum groupupdate groupn-name 升级程序组&lt;/p&gt;
&lt;p&gt;#sudo yum upgrade # 更新源列表&lt;br /&gt;
#yum upgrade package-name #升级程序包&lt;br /&gt;
#sudo yum clean all # 清除缓存&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;#&lt;/strong&gt;&lt;strong&gt;更新&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;sudo yum update&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;#&lt;/strong&gt;&lt;strong&gt;清理缓存&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;sudo yum clean all &amp;amp;&amp;amp; yum clean metadata &amp;amp;&amp;amp; yum clean dbcache&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;################### 必须 ####################&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;#&lt;/strong&gt;&lt;strong&gt;安装编译工具&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#方法一&lt;/p&gt;
&lt;p&gt;# 去 &lt;a href=&quot;http://gcc.gnu.org/&quot;&gt;http://gcc.gnu.org/&lt;/a&gt; 下载源码&lt;/p&gt;
&lt;p&gt;# TODO&lt;/p&gt;
&lt;p&gt;#方法二&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo yum groupinstall “Development Tools”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#该命令类似于 Ubuntu 下的apt-get install build-essential&lt;/p&gt;
&lt;p&gt;#安装了：autoconf automake bison byacc cscope ctags diffstat doxygen flex gcc gcc-c++&lt;br /&gt;
# gcc-gfortran git indent intltool libtool patchutils rcs redhat-rpm-config&lt;br /&gt;
# rpm-build subversion swig systemtap&lt;/p&gt;
&lt;p&gt;# 同时安装了以下依赖包：apr, apr-util, 等等&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;# &lt;/strong&gt;&lt;strong&gt;安装JDK&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#删除旧的JDK&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;java -version&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;yum list installed | grep jdk&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#复制显示出来的JDK，卸载&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo yum remove java-1.6.0-openjdk.x86_64&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#安装新的jdk&lt;/p&gt;
&lt;p&gt;#方法一&lt;/p&gt;
&lt;p&gt;#从官网下载最新版的，当前是jdk6u31&lt;/p&gt;
&lt;p&gt;#开始安装&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-4281&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;chmod u+x chmod u+x jdk-6u31-linux-x64-rpm.bin&lt;br /&gt;
sudo ./jdk-6u31-linux-x64-rpm.bin&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#设置环境变量，.bash_profile是当前用户，/etc/profile是所有用户的&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo vim /etc/profile&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#在末尾添加&lt;br /&gt;
export JAVA_HOME=/usr/java/default&lt;br /&gt;
export JAVA_JRE=$JAVA_HOME/jre&lt;br /&gt;
export PATH=$PATH:$JAVA_HOME/bin&lt;br /&gt;
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar&lt;br /&gt;
#保存退出，输入以下命令使之立即生效：&lt;br /&gt;
&lt;strong&gt;source &lt;/strong&gt;&lt;strong&gt;/etc/profile&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#测试&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;java -version&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#方法二&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;yum search jdk&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;# java-1.6.0-openjdk只包含了JRE，如果在这台机器上开发java程序，则需要安装JDK，&lt;/p&gt;
&lt;p&gt;# 要选择 java-1.6.0-openjdk-devel，在服务器上我们只需要运行java程序，因此选择前者&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo yum install java-1.6.0-openjdk-devel&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#使用 alternatives 工具设置默认JDK，参考：&lt;a href=&quot;http://docs.redhat.com/docs/en-US/JBoss_Enterprise_SOA_Platform/4.3/html/Getting_Started_Guide/appe-install_jdk_rhel.html#sect-use_alternatives_to_set_default_JDK&quot;&gt;Installing a Java Development Kit on Red Hat Enterprise Linux&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;/usr/sbin/alternatives &amp;#8211;config java&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;/usr/sbin/alternatives &amp;#8211;config javac&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#设置环境变量&lt;/p&gt;
&lt;p&gt;#查询JDK路径&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;whereis java&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ll /usr/bin/java&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ll /etc/alternatives/java&lt;/strong&gt; #这是可以看到JDK路径了&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo vim /etc/profile&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;# 在末尾添加&lt;br /&gt;
export JAVA_HOME=/usr/lib/jvm/jre-1.6.0-openjdk.x86_64&lt;br /&gt;
export JAVA_JRE=$JAVA_HOME/jre&lt;br /&gt;
export PATH=$PATH:$JAVA_HOME/bin&lt;br /&gt;
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar&lt;br /&gt;
保存退出，输入以下命令使之立即生效：&lt;br /&gt;
&lt;strong&gt;#source &lt;/strong&gt;&lt;strong&gt;/etc/profile&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#测试&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;java -version&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;################### 可选 ####################&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;#&lt;/strong&gt;&lt;strong&gt;安装 apache&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#方法一：源码在官网 &lt;a href=&quot;http://httpd.apache.org/&quot;&gt;http://httpd.apache.org/&lt;/a&gt; 下载。&lt;/p&gt;
&lt;p&gt;#先下载apt, apr-util, pcre三个库，httpd 在编译时需要用到这三个库&lt;/p&gt;
&lt;p&gt;# apr, apr-util官网 &lt;a href=&quot;http://apr.apache.org/&quot;&gt;http://apr.apache.org&lt;/a&gt; , pcre官网为 &lt;a href=&quot;http://pcre.org/&quot;&gt;http://pcre.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;# 编译，安装 apr&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;tar -jxf apr-1.4.6.tar.bz2&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;cd apr-1.4.6&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;./configure&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;make&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo make install&lt;/strong&gt;    # 默认会安装到 /usr/local/apr/&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;cd ~&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#编译，安装 apr-util&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;tar -jxf apr-util-1.4.1.tar.bz2&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;cd apr-util-1.4.1&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;./configure &amp;#8211;with-apr=/usr/local/apr/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;make&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo make install&lt;/strong&gt;    # 默认会安装到 /usr/local/apr/&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;cd ~&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#编译，安装 pcre&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;tar -jxf pcre-8.30.tar.bz2&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;cd  pcre-8.30&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;./configure &amp;#8211;with-apr=/usr/local/apr/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;make&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;# By default, `make install&amp;#8217; installs the package&amp;#8217;s commands under&lt;/p&gt;
&lt;p&gt;#`/usr/local/bin&amp;#8217;, include files under `/usr/local/include&amp;#8217;, etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo make install&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;cd ~&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#编译，安装 apache&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;tar -jxf httpd-2.2.22.tar.bz2&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;cd httpd-2.2.22&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;./configure&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;make&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo make install&lt;/strong&gt;    # 默认会安装到/usr/local/apache2/&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;cd ~&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#添加防火墙规则，让防火墙允许 apache的端口 80通过&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo vim /etc/sysconfig/iptables&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#添加如下一行（实际上是拷贝了原来的一行，仅仅改变了端口号），位置必须#要放在 含有 “REJECT &amp;#8211;reject-with” 的行的前面&lt;/p&gt;
&lt;p&gt;-A INPUT -m state &amp;#8211;state NEW -m tcp -p tcp &amp;#8211;dport 80 -j ACCEPT&lt;br /&gt;
&lt;strong&gt;sudo service iptables restart&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#测试&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo /usr/local/apache2/bin/apachectl start&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#在浏览器输入 &lt;a href=&quot;http://ip地址/&quot;&gt;http://ip地址&lt;/a&gt; ，如果看到“It works”，说明安装成功&lt;br /&gt;
&lt;strong&gt;/usr/local/apache2/bin/apachectl stop&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#设置为开机启动&lt;/p&gt;
&lt;p&gt;#将httpd注册为服务，通过chkconfig实现开机启动&lt;/p&gt;
&lt;p&gt;#以apachectl 为模板&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo cp /usr/local/apache2/bin/apachectl /etc/init.d/httpd&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo vi /etc/init.d/httpd&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;# 在第一行 #!/bin/sh，添加如下一行，使其支持chkconfig命令&lt;/p&gt;
&lt;p&gt;# chkconfig: 2345 85 15&lt;/p&gt;
&lt;p&gt;# 保存，退出VIM编辑器&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo chmod u+x &lt;/strong&gt;&lt;strong&gt;/etc/init.d/httpd&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo chkconfig &amp;#8211;add httpd&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo chkconfig httpd on&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#检查一下，是否添加成功&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;chkconfig &amp;#8211;list httpd &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#方法二&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo yum install httpd&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#可选？sudo yum install httpd-devel&lt;/p&gt;
&lt;p&gt;#测试&lt;/p&gt;
&lt;p&gt;#启动 apache http server&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo service httpd start&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#添加规则，让防火墙允许 apache的端口 80&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo vim /etc/sysconfig/iptables&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#添加如下一行，位置必须要放在 含有 “REJECT &amp;#8211;reject-with” 的行的前面&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;-A INPUT -m state &amp;#8211;state NEW -m tcp -p tcp &amp;#8211;dport 80 -j ACCEPT&lt;br /&gt;
&lt;strong&gt;sudo service iptables restart&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#可以在浏览器输入 &lt;a href=&quot;http://ip地址/&quot;&gt;http://ip地址&lt;/a&gt; 测试了&lt;/p&gt;
&lt;p&gt;#设置为开机启动&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo chkconfig httpd on&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;#&lt;/strong&gt;&lt;strong&gt;安装 mysql&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#方法一&lt;/p&gt;
&lt;p&gt;#去官网下载 Oracle &amp;amp; Red Hat 6的安装包， MySQL-5.5.23-1.el6.x86_64.tar&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;tar -xf MySQL-5.5.23-1.el6.i686.tar&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#加 &amp;#8211;force 是因为可能会与mysqllib库冲突&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo rpm -ivh&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;&amp;#8211;force&lt;/strong&gt;&lt;strong&gt;  MySQL-server-5.5.23-1.el6.x86_64.rpm&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo rpm -ivh MySQL-client-5.5.23-1.el6.x86_64.rpm&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;# 启动 mysql 服务器&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo service &lt;/strong&gt;&lt;strong&gt;mysql&lt;/strong&gt;&lt;strong&gt; start&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#设置为开机启动&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo chkconfig mysql on&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#方法二&lt;br /&gt;
&lt;strong&gt;sudo yum install mysql-server&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo chgrp -R mysql /var/lib/mysql&lt;br /&gt;
sudo chmod -R 770 /var/lib/mysql&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;# 启动 mysql 服务器&lt;br /&gt;
&lt;strong&gt;sudo service&lt;/strong&gt; &lt;strong&gt;mysqld&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;start&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#设置为开机启动&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo chkconfig mysqld on&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#公共的操作&lt;br /&gt;
# root 初始密码为空，修改root密码&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;mysql -u root&lt;br /&gt;
mysql&amp;gt; use mysql;&lt;br /&gt;
mysql&amp;gt; update user set password=password(&amp;#8216;root123&amp;#8242;) where user=&amp;#8217;root&amp;#8217; AND host=&amp;#8217;localhost&amp;#8217;;&lt;br /&gt;
mysql&amp;gt; flush privileges;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;# 打开MySQL中root账户的远程登录，参考：&lt;a href=&quot;http://blog.csdn.net/mydeman/article/details/5432937&quot;&gt;如何打开MySQL中root账户的远程登录&lt;/a&gt;&lt;strong&gt;mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO root@”%” IDENTIFIED BY “root”;&lt;br /&gt;
mysql&amp;gt; update user set password=password(&amp;#8216;root123&amp;#8242;) where user=&amp;#8217;root&amp;#8217; AND host=&amp;#8217;%';&lt;br /&gt;
mysql&amp;gt; flush privileges;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;mysql&amp;gt; quit;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#添加防火墙规则，让防火墙允许 mysql 的端口 3306通过&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo vim /etc/sysconfig/iptables&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#添加如下一行（实际上是拷贝了原来的一行，仅仅改变了端口号），位置必须#要放在 含有 “REJECT &amp;#8211;reject-with” 的行的前面&lt;/p&gt;
&lt;p&gt;-A INPUT -m state &amp;#8211;state NEW -m tcp -p tcp &amp;#8211;dport 3306 -j ACCEPT&lt;br /&gt;
&lt;strong&gt;sudo service iptables restart&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;#&lt;/strong&gt;&lt;strong&gt;安装 php5&lt;/strong&gt;&lt;br /&gt;
#方法一&lt;/p&gt;
&lt;p&gt;#方法二&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo yum install php php-pear&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#重启 apache，以确保apache 加载PHP模块&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo service httpd restart&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;# 在 /var/www/html/下新建一个index.php文件，用于测试&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;cd /var/www/html&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo vi index.php&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;# 添加如下一行&lt;/p&gt;
&lt;p&gt;&amp;lt;?php phpinfo(); ?&amp;gt;&lt;/p&gt;
&lt;p&gt;# 在浏览器输入 &lt;a href=&quot;http://xxx.xxx.xxx.xxx/index.php&quot;&gt;http://xxx.xxx.xxx.xxx/index.php&lt;/a&gt; ，测试PHP是否成功安装&lt;/p&gt;
&lt;p&gt;# 如果需要在PHP中支持mysql，则需要安装 php-mysql 模块&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo yum install php-mysql&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;# 如果需要在PHP中支持memcached，则需要安装 php-pecl-memcache 模块&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo yum install php-pecl-memcache&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#安装一些常用的PHP扩展模块&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo yum install &lt;/strong&gt;&lt;strong&gt;php-devel php-gd php-mbstring php-xml&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#可以安装一个wordpress进行测试，注意要修改文件夹权限&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo chown -R apache.apache /var/www/html&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;# &lt;/strong&gt;&lt;strong&gt;安装 memcached&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#方法一&lt;/p&gt;
&lt;p&gt;# memcached依赖libevent，首先要安装 libevent&lt;/p&gt;
&lt;p&gt;# 去 &lt;a href=&quot;http://libevent.org/&quot;&gt;http://libevent.org/&lt;/a&gt; 下载libevent源码，然后编译，安装&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;tar -zxf libevent-2.0.18-stable.tar.gz&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;cd libevent-2.0.18-stable&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;./configure&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;make&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo make install&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;# 对于64位操作系统(32位不需要)，还需要配置：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib64//libevent-2.0.so.5&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;# 去 &lt;a href=&quot;http://www.memcached.org/&quot;&gt;http://www.memcached.org/&lt;/a&gt; 下载 memcached，然后编译，安装&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;tar -zxf memcached-1.4.13.tar.gz&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;cd memcached-1.4.13&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;./configure&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;make&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo make install&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;# 启动, -p，端口,-m，内存, -u&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;memcached -p 11211 -m 512m -u root -d&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;# 开机启动&lt;/p&gt;
&lt;p&gt;# centos设置开机启动有两种方式，一是把启动程序的命令添加到/etc/rc.d/rc.local文件中，二是把写好的启动脚本添加到目录/etc/rc.d/init.d/，然后使用命令chkconfig设置开机启动。第二种方式可以用 service xxx start|stop来启动或停止，所以推荐第二种。&lt;/p&gt;
&lt;p&gt;#将 memcached启动命令注册为一个服务&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;cd /etc/init.d/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo vi &lt;/strong&gt;&lt;strong&gt;memcached&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#代码如下，参考：&lt;a href=&quot;http://jsczxy2.iteye.com/blog/1443376&quot;&gt;Linux中将memcached注册成服务并可以随机器启动时启动服务&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;#chkconfig: 345 60 60&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
start()&lt;br /&gt;
{&lt;br /&gt;
echo -n $”Starting memcached: ”&lt;br /&gt;
memcached -d -m 512 -l localhost -p 11211 -u memcached&lt;br /&gt;
echo “[OK]”&lt;br /&gt;
}&lt;br /&gt;
stop()&lt;br /&gt;
{&lt;br /&gt;
echo -n $”Shutting down memcached: ”&lt;br /&gt;
memcached_pid_list=`pidof memcached`&lt;br /&gt;
kill -9 $memcached_pid_list&lt;br /&gt;
echo “[OK]”&lt;br /&gt;
}&lt;br /&gt;
case “$1&amp;#8243; in&lt;br /&gt;
start)&lt;br /&gt;
start&lt;br /&gt;
;;&lt;br /&gt;
stop)&lt;br /&gt;
stop&lt;br /&gt;
;;&lt;br /&gt;
restart)&lt;br /&gt;
stop&lt;br /&gt;
sleep 3&lt;br /&gt;
start&lt;br /&gt;
;;&lt;br /&gt;
*)&lt;br /&gt;
echo $”Usage: $0 {start|stop|restart}”&lt;br /&gt;
exit 1&lt;br /&gt;
esac&lt;br /&gt;
exit 0&lt;/p&gt;
&lt;p&gt;#保存退出&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo chmod u+x memcached&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo chkconfig &amp;#8211;add &lt;/strong&gt;&lt;strong&gt;memcached&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo &lt;/strong&gt;&lt;strong&gt;chkconfig  memcached on&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#方法二&lt;/p&gt;
&lt;p&gt;TODO&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;#&lt;/strong&gt;&lt;strong&gt;安装 tomcat6&lt;/strong&gt;&lt;br /&gt;
#方法一&lt;/p&gt;
&lt;p&gt;# 去 &lt;a href=&quot;http://tomcat.apache.org/&quot;&gt;http://tomcat.apache.org&lt;/a&gt; 下载 apache-tomcat-6.0.35.tar.gz&lt;br /&gt;
&lt;strong&gt;tar -zxf apache-tomcat-6.0.35.tar.gz&lt;br /&gt;
sudo mv apache-tomcat-6.0.35 /usr/local/&lt;br /&gt;
cd &lt;/strong&gt;&lt;strong&gt;/usr/local/apache-tomcat-6.0.35/bin&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#启动 tomcat&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo ./startup.sh&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#【可选】添加环境变量&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo vi /etc/profile&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;export CATALINA_HOME=&lt;/strong&gt;&lt;strong&gt;/usr/local/apache-tomcat-6.0.35&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;# 在浏览器输入 &lt;a href=&quot;http://xxx.xxx.xxx.xxx:8080/&quot;&gt;http://xxx.xxx.xxx.xxx:8080/&lt;/a&gt; ，如果能看见tomcat页面，则表示安装成功了&lt;/p&gt;
&lt;p&gt;#开机启动&lt;/p&gt;
&lt;p&gt;#将 tomcat启动命令注册为一个服务&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;cd /etc/init.d/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo vi tomcatd&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#代码如下&lt;/p&gt;
&lt;p&gt;#chkconfig: 345 60 60&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
CATALINA_HOME=/usr/local/apache-tomcat-6.0.35&lt;br /&gt;
start()&lt;br /&gt;
{&lt;br /&gt;
echo -n $”Starting Tomcat: ”&lt;br /&gt;
$CATALINA_HOME/bin/startup.sh&lt;br /&gt;
echo “[OK]”&lt;br /&gt;
}&lt;br /&gt;
stop()&lt;br /&gt;
{&lt;br /&gt;
echo -n $”Shutting down Tomcat: ”&lt;br /&gt;
$CATALINA_HOME/bin/shutdown.sh&lt;br /&gt;
echo “[OK]”&lt;br /&gt;
}&lt;br /&gt;
case “$1&amp;#8243; in&lt;br /&gt;
start)&lt;br /&gt;
start&lt;br /&gt;
;;&lt;br /&gt;
stop)&lt;br /&gt;
stop&lt;br /&gt;
;;&lt;br /&gt;
restart)&lt;br /&gt;
stop&lt;br /&gt;
sleep 3&lt;br /&gt;
start&lt;br /&gt;
;;&lt;br /&gt;
*)&lt;br /&gt;
echo $”Usage: $0 {start|stop|restart}”&lt;br /&gt;
exit 1&lt;br /&gt;
esac&lt;br /&gt;
exit 0&lt;/p&gt;
&lt;p&gt;#保存退出&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo chmod u+x tomcatd&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo chkconfig &amp;#8211;add tomcatd&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo chkconfig tomcatd on&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#添加防火墙规则，让防火墙允许 tomcat 的端口 8080 通过&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo vim /etc/sysconfig/iptables&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#添加如下一行（实际上是拷贝了原来的一行，仅仅改变了端口号），位置必须#要放在 含有 “REJECT &amp;#8211;reject-with” 的行的前面&lt;/p&gt;
&lt;p&gt;-A INPUT -m state &amp;#8211;state NEW -m tcp -p tcp &amp;#8211;dport 8080 -j ACCEPT&lt;br /&gt;
&lt;strong&gt;sudo service iptables restart&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#方法二&lt;/p&gt;
&lt;p&gt;#搜索一下 tomcat包的名字&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;yum search tomcat&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo yum search tomcat6.noarch&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;#&lt;/strong&gt;&lt;strong&gt;安装Python及相关工具包&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#方法一：去官网下载源码，编译，安装，官网为 &lt;a href=&quot;http://www.python.org/&quot;&gt;http://www.python.org&lt;/a&gt; ,&lt;/p&gt;
&lt;p&gt;#开始解压，编译，安装&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;tar -jxf Python-3.2.3.tar.bz2&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;cd Python-3.2.3&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;# 查看一下说明, vi README&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;./configure&lt;br /&gt;
make&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#为了加快安装速度，这步可以省略&lt;br /&gt;
&lt;strong&gt;make test&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#卸载旧的python，&lt;a href=&quot;http://www.linuxquestions.org/questions/linux-newbie-8/yum-remove-python-and-630-dependencies-oops-838998/&quot;&gt;注意，不能用 yum remove python，这会卸载几百个包，最终损坏系统&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo rpm -evf &amp;#8211;nodeps python&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo make install&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#默认安装在 /usr/local/bin/python3&lt;/p&gt;
&lt;p&gt;#方法二&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo yum install python&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;#&lt;/strong&gt;&lt;strong&gt;安装ruby&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;# 方法一&lt;/p&gt;
&lt;p&gt;# &lt;a href=&quot;http://www.ruby-lang.org/en/downloads/&quot;&gt;http://www.ruby-lang.org/en/downloads/&lt;/a&gt; ，选择 “Stable Snapshot”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;tar -zxf ruby-1.9-stable.tar.gz&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;cd  cd ruby-1.9.3-p194/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;./configure&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;make&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo make install&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;# 方法二&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo yum install ruby&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;#&lt;/strong&gt;&lt;strong&gt;安装go&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#去官网 &lt;a href=&quot;http://code.google.com/p/go/downloads&quot;&gt;http://code.google.com/p/go/downloads&lt;/a&gt; 下载，go.go1.linux-386.tar.gz(32位)，go.go1.linux-amd64.tar.gz（64位）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;tar -zxf go.go1.linux-386.tar.gz&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo mv go/ /usr/local/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#设置环境变量&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo vi /etc/profile&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;export GOROOT=/usr/local/go&lt;br /&gt;
export PATH=$PATH:$GOROOT/bin&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;source /etc/profile&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#测试一下&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;go version&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;#&lt;/strong&gt;&lt;strong&gt;安装lua&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;# 去官网下载源码，编译，安装。由于官网仅提供源码，故推荐源码编译安装方式。&lt;/p&gt;
&lt;p&gt;# 去官网 &lt;a href=&quot;http://www.lua.org/&quot;&gt;http://www.lua.org/&lt;/a&gt; 下载源码，lua-5.2.0.tar.gz&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;tar -zxf lua-5.2.0.tar.gz &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;cd lua-5.2.0&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;# lua 依赖 readline.h 头文件&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo yum install  readline-devel&lt;br /&gt;
make linux&lt;br /&gt;
sudo make install&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;#&lt;/strong&gt;&lt;strong&gt;安装 google protobuf&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#去官网 http://code.google.com/p/protobuf/下载&lt;br /&gt;
&lt;strong&gt;tar -jxf protobuf-2.4.1.tar.bz2&lt;br /&gt;
cd protobuf-2.4.1&lt;br /&gt;
./configure&lt;br /&gt;
make&lt;br /&gt;
sudo make install&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#测试&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;protoc&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#清理安装包&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;cd ~&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;rm * -rf&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;参考资料：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://library.linode.com/lamp-guides/centos-6&quot;&gt;LAMP Server on CentOS 6&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://articles.slicehost.com/2008/2/6/centos-installing-apache-and-php5&quot;&gt;CentOS &amp;#8211; Installing Apache and PHP5&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://fedorasolved.org/server-solutions/lamp-stack&quot;&gt;Setting up a LAMP stack&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://myohmy.blog.51cto.com/140917/327310&quot;&gt;CentOS5.5使用yum来安装LAMP&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://it.megocollector.com/?p=1719&quot;&gt;Install Java JDK on CentOS without prompts using an automated script!&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://www.yanjiuyanjiu.com/wp-content/uploads/2012/04/CentOS-服务器安装操作全记录.pdf&quot;&gt;PDF版本下载&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/631829309/soulmachine/feedsky/s.gif?r=http://www.yanjiuyanjiu.com/archives/4281&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.yanjiuyanjiu.com/archives/4281/feed</wfw:commentRss><slash:comments>0</slash:comments><description># 这是我安装CentOS服务器的过程，记录下来，与大家一起分享。 #CentOS 6.2 ，CentOS-6.2-i386-bin-DVD1.iso（32位） ，CentOS-6.2-x86_64-bin-DVD1.iso（64位） #安装 CentOS时，选择 “Basic Server” #root密码：root123 #CentOS 自带了ssh #安装完操作系统后，添加一个用户 dev [root@localhost ~]$ useradd dev #然后密码设为 dev123 [root@localhost ~]$ passwd dev # 给予 sudo 权限 [root@localhost ~]$ chmod u+w /etc/sudoers [root@localhost ~]$ vi /etc/sudoers # 在root ALL=(ALL) ALL 下 添加dev ALL=(ALL) ALL [root@localhost ~]$ chmod u-w /etc/sudoers # #安装完操作系统后，还不能上网，按如下命令配置DHCP方式上网： vi /etc/sysconfig/network-scripts/ifcfg-eth0 [...]&lt;img src=&quot;http://www1.feedsky.com/t1/631829309/soulmachine/feedsky/s.gif?r=http://www.yanjiuyanjiu.com/archives/4281&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>开源工具</category><category>CentOS</category><pubDate>Tue, 24 Apr 2012 00:29:49 +0800</pubDate><author>admin</author><comments>http://www.yanjiuyanjiu.com/archives/4281#comments</comments><guid isPermaLink="false">http://www.yanjiuyanjiu.com/?p=4281</guid><dc:creator>admin</dc:creator><fs:srclink>http://www.yanjiuyanjiu.com/archives/4281</fs:srclink><fs:srcfeed>http://www.yanjiuyanjiu.com/feed</fs:srcfeed><fs:itemid>feedsky/soulmachine/~7298288/631829309/5411851</fs:itemid></item><item><title>制作 VMware ESXI 5 U盘安装盘</title><link>http://www.yanjiuyanjiu.com/archives/4242</link><content:encoded>&lt;p&gt;有两种方法，使用 unetbootin ，使用 LinuxLive USB Creator刻录可启动U盘。    &lt;br /&gt;一、 使用 unetbootin，这个方法最自动化，点击两下按钮即可，但是有时候会失败(我用EXSi 5.0 的ISO失败，但是用 EXSi 5.0U1可以成功)，U盘启动不了。     &lt;br /&gt;1. 单击 光盘镜像，选择ISO文件VMware-VMvisor-Installer-5.0.0.update01-623860.x86_64.iso。     &lt;br /&gt;2. 选择U盘，点击“确定”开始刻录。刻录后用U盘启动机器开始安装即可。如下图所示。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.yanjiuyanjiu.com/wp-content/uploads/2012/04/unetbootin1.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;unetbootin&quot; border=&quot;0&quot; alt=&quot;unetbootin&quot; src=&quot;http://www.yanjiuyanjiu.com/wp-content/uploads/2012/04/unetbootin_thumb1.jpg&quot; width=&quot;390&quot; height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;二、 使用 LinuxLive USB Creator()    &lt;br /&gt;1. 格式化U盘，文件系统为FAT32，并设置为主分区，命令如下：&lt;/p&gt;
&lt;p&gt;# 使用管理员权限运行cmd    &lt;br /&gt;diskpart     &lt;br /&gt;list disk     &lt;br /&gt;select disk USB number （例如 select dist 1）     &lt;br /&gt;clean     &lt;br /&gt;create partition primary     &lt;br /&gt;active     &lt;br /&gt;format fs=fat32 quick     &lt;br /&gt;assign     &lt;br /&gt;exit&lt;/p&gt;
&lt;p&gt;2. 下载，安装 LinuxLive USB Creator(&lt;a href=&quot;http://www.linuxliveusb.com/)&quot;&gt;http://www.linuxliveusb.com/)&lt;/a&gt;     &lt;br /&gt;3. 按照步骤 1,2,4，选择ISO文件VMware-VMvisor-Installer-5.0.0.update01-623860.x86_64.iso，然后点击 5 ，开始创建U盘安装盘。等待U盘刻录结束。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.yanjiuyanjiu.com/wp-content/uploads/2012/04/liliusb1.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;liliusb&quot; border=&quot;0&quot; alt=&quot;liliusb&quot; src=&quot;http://www.yanjiuyanjiu.com/wp-content/uploads/2012/04/liliusb_thumb1.png&quot; width=&quot;281&quot; height=&quot;400&quot; /&gt;&lt;/a&gt;     &lt;br /&gt;4. 大功告成，是不是很简单？！     &lt;br /&gt;4. 编辑U盘根目录下的BOOT.CFG文件。注意，不要添加 &amp;quot;ks=usb&amp;quot;，因为下面会用交互模式来安装。     &lt;br /&gt;5. 大功告成&lt;/p&gt;
&lt;p&gt;6. 注意，本文主要参考了末尾的参考资料。但是不需要原文的第4步和第5步。因为用普通的 “interactive installation”安装就很方便了。第4步和第5步用于一键自动化安装，适用于大量安装的情况，这里不详细讨论。     &lt;br /&gt;见文章末尾的评论，@Cesar: if you do not edit the boot.cfg with the “ks=usb” option and select a interactive installation it will work。&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;参考：    &lt;br /&gt;&lt;a href=&quot;http://www.ivobeerens.nl/2011/09/17/create-a-bootable-vmware-esxi-5-usb-stick-in-windows-and-perform-a-scripted-installation/&quot; target=&quot;_blank&quot;&gt;Create a bootable VMware ESXi 5 USB stick in Windows and perform a scripted installation&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/631829310/soulmachine/feedsky/s.gif?r=http://www.yanjiuyanjiu.com/archives/4242&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.yanjiuyanjiu.com/archives/4242/feed</wfw:commentRss><slash:comments>0</slash:comments><description>有两种方法，使用 unetbootin ，使用 LinuxLive USB Creator刻录可启动U盘。 一、 使用 unetbootin，这个方法最自动化，点击两下按钮即可，但是有时候会失败(我用EXSi 5.0 的ISO失败，但是用 EXSi 5.0U1可以成功)，U盘启动不了。 1. 单击 光盘镜像，选择ISO文件VMware-VMvisor-Installer-5.0.0.update01-623860.x86_64.iso。 2. 选择U盘，点击“确定”开始刻录。刻录后用U盘启动机器开始安装即可。如下图所示。 二、 使用 LinuxLive USB Creator() 1. 格式化U盘，文件系统为FAT32，并设置为主分区，命令如下： # 使用管理员权限运行cmd diskpart list disk select disk USB number （例如 select dist 1） clean create partition primary active format fs=fat32 quick assign exit 2. 下载，安装 LinuxLive USB Creator(http://www.linuxliveusb.com/) 3. 按照步骤 [...]&lt;img src=&quot;http://www1.feedsky.com/t1/631829310/soulmachine/feedsky/s.gif?r=http://www.yanjiuyanjiu.com/archives/4242&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>virtualization</category><category>vShpere</category><category>云计算</category><category>虚拟化</category><category>ESXi</category><category>vmware</category><pubDate>Wed, 18 Apr 2012 21:14:34 +0800</pubDate><author>admin</author><comments>http://www.yanjiuyanjiu.com/archives/4242#comments</comments><guid isPermaLink="false">http://www.yanjiuyanjiu.com/?p=4242</guid><dc:creator>admin</dc:creator><fs:srclink>http://www.yanjiuyanjiu.com/archives/4242</fs:srclink><fs:srcfeed>http://www.yanjiuyanjiu.com/feed</fs:srcfeed><fs:itemid>feedsky/soulmachine/~7298288/631829310/5411851</fs:itemid></item><item><title>Hadoop 集群安装详细步骤</title><link>http://www.yanjiuyanjiu.com/archives/4226</link><content:encoded>&lt;p&gt;本文所使用的版本是 hadoop 1.0.0，即 &lt;a href=&quot;http://www.iteye.com/news/23874&quot;&gt;2011年12月27日发布的1.0正式版&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;详细安装步骤如下，有大步骤，每个步骤里面有小步骤，绝大部分是必选，只有2步是可选的，红色部分表示要特别注意的地方。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 用vmware workstation 新建一台ubuntu server&lt;/strong&gt;，然后用浅拷贝Create a linked clone 克隆出两台作为slave，这样有了三台ubuntu机器。启动三台机器，假设IP分别为192.168.1.131, 192.168.1.132, 192.168.1.133, 131做为master,132为 slave01, 133为slave02。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 修改机器名&lt;/strong&gt;（这一步的作用是让命令行提示看起来好看点，由默认的 dev@bogon变为 dev@master，这步可选，可以跳过）&lt;/p&gt;
&lt;p&gt;(1)192.168.1.131上执行&lt;/p&gt;
&lt;p&gt;dev@bogon:~$ sudo vi /etc/hostname&lt;/p&gt;
&lt;p&gt;master&lt;/p&gt;
&lt;p&gt;重启，会发现命令提示符变为了 dev@master:~$&lt;/p&gt;
&lt;p&gt;(2)192.168.1.132上执行&lt;/p&gt;
&lt;p&gt;dev@bogon:~$ sudo vi /etc/hostname&lt;/p&gt;
&lt;p&gt;slave01&lt;/p&gt;
&lt;p&gt;重启，会发现命令提示符变为了 dev@slave01:~$&lt;/p&gt;
&lt;p&gt;(3)192.168.1.133上执行&lt;/p&gt;
&lt;p&gt;dev@bogon:~$ sudo vi /etc/hostname&lt;/p&gt;
&lt;p&gt;slave02&lt;/p&gt;
&lt;p&gt;重启，会发现命令提示符变为了 dev@slave02:~$&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-4226&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 修改master的hosts文件，并拷贝到每台slave上。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(1)dev@master:~$ sudo vi /etc/hosts&lt;/p&gt;
&lt;p&gt;添加三行内容&lt;/p&gt;
&lt;p&gt;192.168.1.131 master&lt;br /&gt;
192.168.1.133 slave01&lt;br /&gt;
192.168.1.134 slave02&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;注意一定要注释掉&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;#127.0.1.1      bogon.localdomain       bogon&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;最后hosts文件内容如下：&lt;/p&gt;
&lt;p&gt;127.0.0.1       localhost&lt;br /&gt;
#127.0.1.1      bogon.localdomain       bogon&lt;br /&gt;
192.168.1.131 master&lt;br /&gt;
192.168.1.133 slave01&lt;br /&gt;
192.168.1.134 slave02&lt;br /&gt;
# The following lines are desirable for IPv6 capable hosts&lt;br /&gt;
::1     ip6-localhost ip6-loopback&lt;br /&gt;
fe00::0 ip6-localnet&lt;br /&gt;
ff00::0 ip6-mcastprefix&lt;br /&gt;
ff02::1 ip6-allnodes&lt;br /&gt;
ff02::2 ip6-allrouters&lt;/p&gt;
&lt;p&gt;(2)将hosts文件拷贝到另外两台台机器上，覆盖原来的hosts文件&lt;/p&gt;
&lt;p&gt;dev@master:~$ scp /etc/hosts dev@192.168.1.132:~&lt;/p&gt;
&lt;p&gt;dev@master:~$ scp /etc/hosts dev@192.168.1.133:~&lt;/p&gt;
&lt;p&gt;(3)在192.168.1.132上执行&lt;/p&gt;
&lt;p&gt;dev@slave01:~$ sudo mv hosts /etc/hosts&lt;/p&gt;
&lt;p&gt;(4)在192.168.1.133上执行&lt;/p&gt;
&lt;p&gt;dev@slave02:~$ sudo mv hosts /etc/hosts&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. 配置 master 无密码登陆到所有机器（&lt;span style=&quot;color: #ff0000;&quot;&gt;包括本机&lt;/span&gt;）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(1)dev@master:~$ ssh-keygen -t rsa&lt;/p&gt;
&lt;p&gt;dev@master:~$ cat .ssh/id_rsa.pub &amp;gt;&amp;gt; .ssh/authorized_keys&lt;/p&gt;
&lt;p&gt;dev@master:~$ scp .ssh/id_rsa.pub dev@192.168.1.132:~/&lt;/p&gt;
&lt;p&gt;dev@master:~$ scp .ssh/id_rsa.pub dev@192.168.1.133:~/&lt;/p&gt;
&lt;p&gt;dev@slave01:~$ cat id_rsa.pub &amp;gt;&amp;gt; .ssh/authorized_keys&lt;/p&gt;
&lt;p&gt;dev@slave02:~$ cat id_rsa.pub &amp;gt;&amp;gt; .ssh/authorized_keys&lt;/p&gt;
&lt;p&gt;(2)测试一下，&lt;/p&gt;
&lt;p&gt;dev@master:~$ ssh slav01&lt;/p&gt;
&lt;p&gt;如果登陆不上，试试先关闭slave01的防火墙，&lt;/p&gt;
&lt;p&gt;dev@slave01:~$ sudo ufw disable&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. 从hadoop.apache.org下载 hadoop-1.0.0-bin.tar.gz，上传到master中，解压，然后复制到其他机器，解压。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;dev@master:~$ tar -zxvf hadoop-1.0.0-bin.tar.gz&lt;/p&gt;
&lt;p&gt;dev@master:~$ scp hadoop-1.0.0-bin.tar.gz dev@192.168.1.133:~&lt;/p&gt;
&lt;p&gt;dev@master:~$ scp hadoop-1.0.0-bin.tar.gz dev@192.168.1.134:~&lt;/p&gt;
&lt;p&gt;dev@slave01:~$ tar -zxvf hadoop-1.0.0-bin.tar.gz&lt;/p&gt;
&lt;p&gt;dev@slave02:~$ tar -zxvf hadoop-1.0.0-bin.tar.gz&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6. 编辑配置文件&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;dev@master:~$ cd hadoop-1.0.0/etc/hadoop&lt;/p&gt;
&lt;p&gt;dev@master:~/hadoop-1.0.0/etc/hadoop$  vi hadoop-env.sh&lt;/p&gt;
&lt;p&gt;仅需要设置JAVA_HOME，export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386&lt;/p&gt;
&lt;p&gt;dev@master:~/hadoop-1.0.0/etc/hadoop$  vi core-site.xml&lt;/p&gt;
&lt;p&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;
&amp;lt;property&amp;gt;&lt;br /&gt;
&amp;lt;name&amp;gt;fs.default.name&amp;lt;/name&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;hdfs://master:9000&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/property&amp;gt;&lt;br /&gt;
&amp;lt;property&amp;gt;&lt;br /&gt;
&amp;lt;name&amp;gt;hadoop.tmp.dir&amp;lt;/name&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;/home/dev/hadoop_tmp/&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/property&amp;gt;&lt;br /&gt;
&amp;lt;/configuration&amp;gt;&lt;/p&gt;
&lt;p&gt;dev@master:~/hadoop-1.0.0/etc/hadoop$  vi mapred-site.xml&lt;/p&gt;
&lt;p&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;
&amp;lt;property&amp;gt;&lt;br /&gt;
&amp;lt;name&amp;gt;mapred.job.tracker&amp;lt;/name&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;master:9001&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/property&amp;gt;&lt;br /&gt;
&amp;lt;/configuration&amp;gt;&lt;/p&gt;
&lt;p&gt;dev@master:~/hadoop-1.0.0/etc/hadoop$  vi hdfs-site.xml&lt;/p&gt;
&lt;p&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;
&amp;lt;property&amp;gt;&lt;br /&gt;
&amp;lt;name&amp;gt;dfs.replication&amp;lt;/name&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;3&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/property&amp;gt;&lt;br /&gt;
&amp;lt;/configuration&amp;gt;&lt;/p&gt;
&lt;p&gt;dev@master:~/hadoop-1.0.0/etc/hadoop$  vi masters&lt;/p&gt;
&lt;p&gt;192.168.1.133&lt;/p&gt;
&lt;p&gt;dev@master:~/hadoop-1.0.0/etc/hadoop$  vi slaves&lt;/p&gt;
&lt;p&gt;192.168.1.133&lt;/p&gt;
&lt;p&gt;192.168.1.134&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;7. 将配置文件拷贝到各台slave&lt;/strong&gt;（master和slaves这2个配置文件可以不拷贝到slave机器上，只在master上保存即可。待验证）&lt;/p&gt;
&lt;p&gt;dev@master:~/hadoop-1.0.0/etc/hadoop$ scp hadoop-env.sh core-site.xml hdfs-site.xml mapred-site.xml masters slaves dev@192.168.1.133:~/hadoop-1.0.0/etc/hadoop&lt;/p&gt;
&lt;p&gt;dev@master:~/hadoop-1.0.0/etc/hadoop$ scp hadoop-env.sh core-site.xml hdfs-site.xml mapred-site.xml masters slaves dev@192.168.1.134:~/hadoop-1.0.0/etc/hadoop&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8. 设置环境变量&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(1). 设置master的环境变量&lt;/p&gt;
&lt;p&gt;dev@master:~$ vi .bashrc&lt;/p&gt;
&lt;p&gt;export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386&lt;br /&gt;
export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar&lt;br /&gt;
export PATH=$PATH:$JAVA_HOME/bin&lt;br /&gt;
export HADOOP_HOME=~/hadoop-1.0.0&lt;br /&gt;
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin&lt;br /&gt;
export CLASSPATH=$CLASSPATH:$HADOOP_HOME/share/hadoop/hadoop-core-1.0.0.jar&lt;/p&gt;
&lt;p&gt;export HADOOP_HOME=~/hadoop-1.0.0&lt;/p&gt;
&lt;p&gt;export PATH=$PATH:$HADOOP_HOME/bin&lt;/p&gt;
&lt;p&gt;dev@master:~$ source .bashrc&lt;/p&gt;
&lt;p&gt;(2) 将master上的.bashrc拷贝到其他机器，并source刷新。&lt;/p&gt;
&lt;p&gt;dev@master:~$ scp .bashrc dev@192.168.1.133:~&lt;/p&gt;
&lt;p&gt;dev@master:~$ scp .bashrc dev@192.168.1.134:~&lt;/p&gt;
&lt;p&gt;dev@slave01:~$ source .bashrc&lt;/p&gt;
&lt;p&gt;dev@slave02:~$ source .bashrc&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9. 运行 hadoop&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;dev@master:~$ hadoop  namenode -format  （只需一次，下次启动不再需要格式化，只需 start-all.sh）&lt;/p&gt;
&lt;p&gt;dev@master:~$ start-all.sh&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10. 检查是否运行成功&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;dev@master:~$ jps&lt;/p&gt;
&lt;p&gt;2615 NameNode&lt;br /&gt;
2767 JobTracker&lt;br /&gt;
2874 Jps&lt;/p&gt;
&lt;p&gt;dev@slave01:~$ jps&lt;/p&gt;
&lt;p&gt;3415 DataNode&lt;br /&gt;
3582 TaskTracker&lt;br /&gt;
3499 SecondaryNameNode&lt;br /&gt;
3619 Jps&lt;/p&gt;
&lt;p&gt;dev@slave02:~$ jps&lt;/p&gt;
&lt;p&gt;3741 Jps&lt;br /&gt;
3618 DataNode&lt;br /&gt;
3702 TaskTracker&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;11. 停止 hadoop集群&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;dev@master:~$ stop-all.sh&lt;/p&gt;
&lt;p&gt;让 slave 节点也 可以启动 整个hadoop集群&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;注意&lt;/span&gt;&lt;/strong&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;1. stat-all.sh 启动后，刚刚开始，namenode的日志里有些异常，是正常的，过一两分钟就好了，如果两分钟后，还有异常不断在打印，就有问题了。datanode的日志，从一开始，正常情况下，就没有异常，如果报了异常，说明有异常，要去排除。&lt;/p&gt;
&lt;p&gt;2. masters文件，这个文件很容易被误解，它实际上存放的是secondarynamenode，而不是namenode。&lt;span style=&quot;color: #a5a5a5;&quot;&gt;An HDFS instance is started on a cluster by logging in to the NameNode machine and running$HADOOP_HOME/bin/start-dfs.sh (orstart-all.sh ). This script. starts a local instance of the NameNode process, logs into every machine listed in theconf/slaves file and starts an instance of the DataNode process, and logs into every machine listed in theconf/masters file and starts an instance of the SecondaryNameNode process. Themasters file does not govern which nodes become NameNodes or JobTrackers; those are started on the machine(s) &lt;/span&gt;&lt;span style=&quot;color: #a5a5a5;&quot;&gt;wherebin/start-dfs.sh andbin/start-mapred.sh are executed. A more accurate filename might be “secondaries,” but that’s not currently the case.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;参考以下三篇文章&lt;br /&gt;
&lt;a href=&quot;http://www.cloudera.com/blog/2009/02/multi-host-secondarynamenode-configuration/&quot;&gt;Multi-host SecondaryNameNode Configuration&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://blog.csdn.net/dajuezhao/article/details/5987580&quot;&gt;SecondaryNamenode应用摘记&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://blog.csdn.net/AE86_FC/article/details/5284181&quot;&gt;hadoop下运行多个SecondaryNameNode的配置&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;3. 一定要注释掉 hosts里面的 #127.0.1.1      bogon.localdomain       bogon，参考 &lt;a href=&quot;http://blog.sina.com.cn/s/blog_631ffec50100w700.html&quot;&gt;Hadoop集群机器命名机制&lt;/a&gt;，&lt;a href=&quot;http://blog.csdn.net/singno116/article/details/6298995&quot;&gt;hadoop集群环境安装中的hosts 配置问题&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;4. 当测试ssh是否能连通时，如果连接不上，先记得要关闭防火墙，sudo ufw disable，参考&lt;a href=&quot;http://blog.csdn.net/make19830723/article/details/6230074&quot;&gt;hadoop集群安装步骤&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ff0000; font-size: small;&quot;&gt;&lt;strong&gt;未解决的疑惑&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;1. 有的很多文章，比如这篇，&lt;a href=&quot;http://blog.csdn.net/cuishi0/article/details/6824884&quot;&gt;Hadoop集群安装&lt;/a&gt;，在core-site.xml, mapred-site.xml，直接写上ip:port，这样就不用修改hosts文件了。可是我这样配置，老是不成功。为此我还&lt;a href=&quot;http://stackoverflow.com/questions/8702637/hadoop-conf-fs-default-name-cant-be-setted-ipport-format-directly&quot;&gt;在stackoverflow上发了帖子&lt;/a&gt;，。&lt;a href=&quot;http://51mst.iteye.com/blog/1152439&quot;&gt;有的文章&lt;/a&gt;又说只能用host:port的形式。因此ip:port的格式是否能成功还待验证。如果有高手用ip:port配置成功过，请在下面留言或给我发email，一起交流:)&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/631829311/soulmachine/feedsky/s.gif?r=http://www.yanjiuyanjiu.com/archives/4226&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.yanjiuyanjiu.com/archives/4226/feed</wfw:commentRss><slash:comments>0</slash:comments><description>本文所使用的版本是 hadoop 1.0.0，即 2011年12月27日发布的1.0正式版。 详细安装步骤如下，有大步骤，每个步骤里面有小步骤，绝大部分是必选，只有2步是可选的，红色部分表示要特别注意的地方。 1. 用vmware workstation 新建一台ubuntu server，然后用浅拷贝Create a linked clone 克隆出两台作为slave，这样有了三台ubuntu机器。启动三台机器，假设IP分别为192.168.1.131, 192.168.1.132, 192.168.1.133, 131做为master,132为 slave01, 133为slave02。 2. 修改机器名（这一步的作用是让命令行提示看起来好看点，由默认的 dev@bogon变为 dev@master，这步可选，可以跳过） (1)192.168.1.131上执行 dev@bogon:~$ sudo vi /etc/hostname master 重启，会发现命令提示符变为了 dev@master:~$ (2)192.168.1.132上执行 dev@bogon:~$ sudo vi /etc/hostname slave01 重启，会发现命令提示符变为了 dev@slave01:~$ (3)192.168.1.133上执行 dev@bogon:~$ sudo vi /etc/hostname slave02 重启，会发现命令提示符变为了 dev@slave02:~$ 3. 修改master的hosts文件，并拷贝到每台slave上。 (1)dev@master:~$ sudo vi /etc/hosts 添加三行内容 192.168.1.131 [...]&lt;img src=&quot;http://www1.feedsky.com/t1/631829311/soulmachine/feedsky/s.gif?r=http://www.yanjiuyanjiu.com/archives/4226&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>集群，安装，配置，Fully distributed mode，setup</category><category>Hadoop</category><category>configuration</category><category>hadoop</category><pubDate>Tue, 03 Jan 2012 22:12:36 +0800</pubDate><author>admin</author><comments>http://www.yanjiuyanjiu.com/archives/4226#comments</comments><guid isPermaLink="false">http://www.yanjiuyanjiu.com/?p=4226</guid><dc:creator>admin</dc:creator><fs:srclink>http://www.yanjiuyanjiu.com/archives/4226</fs:srclink><fs:srcfeed>http://www.yanjiuyanjiu.com/feed</fs:srcfeed><fs:itemid>feedsky/soulmachine/~7298288/631829311/5411851</fs:itemid></item><item><title>用javac命令行编译多个java文件</title><link>http://www.yanjiuyanjiu.com/archives/4204</link><content:encoded>&lt;p&gt;1. CLASSPATH一定要具体到jar路径，例如&lt;br /&gt;
export CLASSPATH=/usr/lib/jvm/java-6-sun/lib/commons-codec.jar:/usr/lib/jvm/java-6-sun/lib/commons-httpclient-3.1.jar:/usr/lib/jvm/java-6-sun/lib/commons-logging-1.1.jar:/usr/lib/jvm/java-6-sun/lib/dt.jar:/usr/lib/jvm/java-6-sun/lib/htmlconverter.jar:/usr/lib/jvm/java-6-sun/lib/jconsole.jar:/usr/lib/jvm/java-6-sun/lib/junit-4.1.jar:/usr/lib/jvm/java-6-sun/lib/mysql-connector-java-5.1.16-bin.jar:/usr/lib/jvm/java-6-sun/lib/sa-jdi.jar:/usr/lib/jvm/java-6-sun/lib/tools.jar&lt;/p&gt;
&lt;p&gt;2. 每个java文件给出路径，最常见的是用通配符*，不支持目录递归。&lt;/p&gt;
&lt;p&gt;3. 最好加上 -d，这样会在这个目录下生成class文件，而不会和java文件混在一起&lt;/p&gt;
&lt;p&gt;看我的一个具体的例子&lt;br /&gt;
javac  -d /home/dfq/crawler/bin crawler/*.java weibo4j/*.java weibo4j/org/json/*.java weibo4j/*.java weibo4j/util/*.java weibo4j/http/*.java&lt;/p&gt;
&lt;p&gt;运行时用如下命令：&lt;br /&gt;
cd /home/dfq/crawler/bin&lt;br /&gt;
java -cp .:$CLASSPATH crawler.ManagerThread&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/631829312/soulmachine/feedsky/s.gif?r=http://www.yanjiuyanjiu.com/archives/4204&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.yanjiuyanjiu.com/archives/4204/feed</wfw:commentRss><slash:comments>0</slash:comments><description>1. CLASSPATH一定要具体到jar路径，例如 export CLASSPATH=/usr/lib/jvm/java-6-sun/lib/commons-codec.jar:/usr/lib/jvm/java-6-sun/lib/commons-httpclient-3.1.jar:/usr/lib/jvm/java-6-sun/lib/commons-logging-1.1.jar:/usr/lib/jvm/java-6-sun/lib/dt.jar:/usr/lib/jvm/java-6-sun/lib/htmlconverter.jar:/usr/lib/jvm/java-6-sun/lib/jconsole.jar:/usr/lib/jvm/java-6-sun/lib/junit-4.1.jar:/usr/lib/jvm/java-6-sun/lib/mysql-connector-java-5.1.16-bin.jar:/usr/lib/jvm/java-6-sun/lib/sa-jdi.jar:/usr/lib/jvm/java-6-sun/lib/tools.jar 2. 每个java文件给出路径，最常见的是用通配符*，不支持目录递归。 3. 最好加上 -d，这样会在这个目录下生成class文件，而不会和java文件混在一起 看我的一个具体的例子 javac -d /home/dfq/crawler/bin crawler/*.java weibo4j/*.java weibo4j/org/json/*.java weibo4j/*.java weibo4j/util/*.java weibo4j/http/*.java 运行时用如下命令： cd /home/dfq/crawler/bin java -cp .:$CLASSPATH crawler.ManagerThread&lt;img src=&quot;http://www1.feedsky.com/t1/631829312/soulmachine/feedsky/s.gif?r=http://www.yanjiuyanjiu.com/archives/4204&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>语言与算法</category><pubDate>Thu, 23 Jun 2011 15:21:45 +0800</pubDate><author>admin</author><comments>http://www.yanjiuyanjiu.com/archives/4204#comments</comments><guid isPermaLink="false">http://www.yanjiuyanjiu.com/?p=4204</guid><dc:creator>admin</dc:creator><fs:srclink>http://www.yanjiuyanjiu.com/archives/4204</fs:srclink><fs:srcfeed>http://www.yanjiuyanjiu.com/feed</fs:srcfeed><fs:itemid>feedsky/soulmachine/~7298288/631829312/5411851</fs:itemid></item><item><title>基于朴素贝叶斯的文本分类算法</title><link>http://www.yanjiuyanjiu.com/archives/4162</link><content:encoded>&lt;p&gt;&lt;strong&gt;基于朴素贝叶斯的文本分类算法&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;作者: 灵魂机器&lt;/p&gt;
&lt;p&gt;联系方式：&lt;a href=&quot;mailto:soulmachine@gmail.com&quot;&gt;soulmachine@gmail.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;作者博客：&lt;a href=&quot;http://www.yanjiuyanjiu.com&quot;&gt;www.yanjiuyanjiu.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;摘要&lt;/strong&gt;：常用的文本分类方法有支持向量机、K-近邻算法和朴素贝叶斯。其中朴素贝叶斯具有容易实现，运行速度快的特点，被广泛使用。本文详细介绍了朴素贝叶斯的基本原理，讨论了两种常见模型：多项式模型（MM）和伯努利模型（BM），实现了可运行的代码，并进行了一些数据测试。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关键字&lt;/strong&gt;：朴素贝叶斯；文本分类&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Text Classification Algorithm Based on Naive Bayes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Author: soulmachine&lt;/p&gt;
&lt;p&gt;Email：&lt;a href=&quot;mailto:soulmachine@gmail.com&quot;&gt;soulmachine@gmail.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Blog：&lt;a href=&quot;http://www.yanjiuyanjiu.com&quot;&gt;www.yanjiuyanjiu.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Abstract&lt;/strong&gt;:Usually there are three methods for text classification: SVM、KNN and Naïve Bayes. Naïve Bayes is easy to implement and fast, so it is widely used. This article introduced the theory of Naïve Bayes and discussed two popular models: multinomial model(MM) and Bernoulli model(BM) in details, implemented runnable code and performed some data tests.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keywords&lt;/strong&gt;: naïve bayes; text classification&lt;/p&gt;
&lt;h3&gt;第1章 贝叶斯原理&lt;/h3&gt;
&lt;h4&gt;1.1 贝叶斯公式&lt;/h4&gt;
&lt;p&gt;设A、B是两个事件，且P(A)&amp;gt;0，称&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.yanjiuyanjiu.com/wp-content/uploads/2012/04/clip_image002.gif&quot;&gt;&lt;img style=&quot;display: inline; border: 0px;&quot; title=&quot;clip_image002&quot; src=&quot;http://www.yanjiuyanjiu.com/wp-content/uploads/2012/04/clip_image002_thumb.gif&quot; alt=&quot;clip_image002&quot; width=&quot;117&quot; height=&quot;36&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;为在事件A发生的条件下事件B发生的&lt;strong&gt;条件概率&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;乘法公式&lt;/strong&gt; P(XYZ)=P(Z|XY)P(Y|X)P(X)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;全概率公式&lt;/strong&gt; P(X)=P(X|Y&lt;sub&gt;1&lt;/sub&gt;)+ P(X|Y&lt;sub&gt;2&lt;/sub&gt;)+…+ P(X|Y&lt;sub&gt;n&lt;/sub&gt;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;贝叶斯公式&lt;/strong&gt;&lt;a href=&quot;http://www.yanjiuyanjiu.com/wp-content/uploads/2012/04/clip_image004.gif&quot;&gt;&lt;img style=&quot;display: inline; border: 0px;&quot; title=&quot;clip_image004&quot; src=&quot;http://www.yanjiuyanjiu.com/wp-content/uploads/2012/04/clip_image004_thumb.gif&quot; alt=&quot;clip_image004&quot; width=&quot;240&quot; height=&quot;40&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在此处，贝叶斯公式，我们要用到的是&lt;a href=&quot;http://www.yanjiuyanjiu.com/wp-content/uploads/2012/04/clip_image006.gif&quot;&gt;&lt;img style=&quot;display: inline; border: 0px;&quot; title=&quot;clip_image006&quot; src=&quot;http://www.yanjiuyanjiu.com/wp-content/uploads/2012/04/clip_image006_thumb.gif&quot; alt=&quot;clip_image006&quot; width=&quot;195&quot; height=&quot;43&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以上公式，请读者参考&lt;a href=&quot;http://book.douban.com/subject/1231189/&quot;&gt;《概率论与数理统计（第五版）》&lt;/a&gt;的1.4节“条件概率”（这里将原书中的A换成了X，B换成了Y），获得更深的理解。&lt;/p&gt;
&lt;h4&gt;1.2贝叶斯定理在分类中的应用&lt;/h4&gt;
&lt;p&gt;在分类（classification）问题中，常常需要把一个事物分到某个类别。一个事物具有很多属性，把它的众多属性看做一个向量，即x=(x&lt;sub&gt;1&lt;/sub&gt;,x&lt;sub&gt;2&lt;/sub&gt;,x&lt;sub&gt;3&lt;/sub&gt;,…,x&lt;sub&gt;n&lt;/sub&gt;)，用x这个向量来代表这个事物。类别也是有很多种，用集合Y={y&lt;sub&gt;1&lt;/sub&gt;,y&lt;sub&gt;2&lt;/sub&gt;,…y&lt;sub&gt;m&lt;/sub&gt;}表示。如果x属于y1类别，就可以给x打上y1标签，意思是说x属于y1类别。这就是所谓的&lt;strong&gt;分类&lt;/strong&gt;&lt;strong&gt;(Classification)&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;x的集合记为X，称为属性集。一般X和Y的关系是不确定的，你只能在某种程度上说x有多大可能性属于类y1，比如说x有80%的可能性属于类y1，这时可以把X和Y看做是随机变量，P(Y|X)称为Y的&lt;strong&gt;后验概率&lt;/strong&gt;（posterior probability），与之相对的，P(Y)称为Y的&lt;strong&gt;先验概率&lt;/strong&gt;（prior probability）&lt;sup&gt;[2]&lt;/sup&gt;。&lt;/p&gt;
&lt;p&gt;在训练阶段，我们要根据从训练数据中收集的信息，对X和Y的每一种组合学习后验概率P(Y|X)。分类时，来了一个实例x，在刚才训练得到的一堆后验概率中找出所有的P(Y|x)， 其中最大的那个y，即为x所属分类。根据贝叶斯公式，后验概率为&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.yanjiuyanjiu.com/wp-content/uploads/2012/04/clip_image008.gif&quot;&gt;&lt;img style=&quot;display: inline; border: 0px;&quot; title=&quot;clip_image008&quot; src=&quot;http://www.yanjiuyanjiu.com/wp-content/uploads/2012/04/clip_image008_thumb.gif&quot; alt=&quot;clip_image008&quot; width=&quot;184&quot; height=&quot;43&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在比较不同Y值的后验概率时，分母P(X)总是常数，因此可以忽略。先验概率P(Y)可以通过计算训练集中属于每一个类的训练样本所占的比例容易地估计。&lt;/p&gt;
&lt;p&gt;我们来举个简单的例子，让读者对上述思路有个形象的认识&lt;sup&gt;[3]&lt;/sup&gt;。&lt;/p&gt;
&lt;p&gt;考虑一个医疗诊断问题，有两种可能的假设：（1）病人有癌症。（2）病人无癌症。样本数据来自某化验测试，它也有两种可能的结果：阳性和阴性。假设我们已经有先验知识：在所有人口中只有0.008的人患病。此外，化验测试对有病的患者有98%的可能返回阳性结果，对无病患者有97%的可能返回阴性结果。&lt;/p&gt;
&lt;p&gt;上面的数据可以用以下概率式子表示：&lt;/p&gt;
&lt;p&gt;P(cancer)=0.008,P(无cancer)=0.992&lt;/p&gt;
&lt;p&gt;P(阳性|cancer)=0.98,P(阴性|cancer)=0.02&lt;/p&gt;
&lt;p&gt;P(阳性|无cancer)=0.03，P(阴性|无cancer)=0.97&lt;/p&gt;
&lt;p&gt;假设现在有一个新病人，化验测试返回阳性，是否将病人断定为有癌症呢？&lt;/p&gt;
&lt;p&gt;在这里，Y={cancer，无cancer}，共两个类别，这个新病人是一个样本，他有一个属性阳性，可以令x=(阳性)。&lt;/p&gt;
&lt;p&gt;我们可以来计算各个类别的后验概率：&lt;/p&gt;
&lt;p&gt;P(cancer | 阳性) = P(阳性 | cancer)p(cancer)=0.98*0.008 = 0.0078&lt;/p&gt;
&lt;p&gt;P(无cancer | 阳性) =P(阳性 | 无cancer)*p(无cancer)=0.03*0.992 = 0.0298&lt;/p&gt;
&lt;p&gt;因此，应该判断为无癌症。&lt;/p&gt;
&lt;p&gt;在这个例子中，类条件概率，P(cancer|阳性)和P(无cancer|阳性)直接告诉了我们。&lt;/p&gt;
&lt;p&gt;一般地，对&lt;strong&gt;类条件概率&lt;/strong&gt;P(X|Y)的估计，有朴素贝叶斯分类器和贝叶斯信念网络两种方法，这里介绍朴素贝叶斯分类器。&lt;/p&gt;
&lt;h4&gt;1.3朴素贝叶斯分类器&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;strong&gt;、条件独立性&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;给定类标号y，朴素贝叶斯分类器在估计类条件概率时假设属性之间条件独立。条件独立假设可以形式化的表达如下：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.yanjiuyanjiu.com/wp-content/uploads/2012/04/clip_image010.gif&quot;&gt;&lt;img style=&quot;display: inline; border: 0px;&quot; title=&quot;clip_image010&quot; src=&quot;http://www.yanjiuyanjiu.com/wp-content/uploads/2012/04/clip_image010_thumb.gif&quot; alt=&quot;clip_image010&quot; width=&quot;200&quot; height=&quot;45&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;其中每个训练样本可用一个属性向量X=(x&lt;sub&gt;1&lt;/sub&gt;,x&lt;sub&gt;2&lt;/sub&gt;,x&lt;sub&gt;3&lt;/sub&gt;,…,x&lt;sub&gt;n&lt;/sub&gt;)表示，各个属性之间条件独立。&lt;/p&gt;
&lt;p&gt;比如，对于一篇文章，&lt;/p&gt;
&lt;p&gt;Good good study,Day day up.&lt;/p&gt;
&lt;p&gt;可以用一个&lt;strong&gt;文本特征向量&lt;/strong&gt;来表示，x=(Good, good, study, Day, day , up)。一般各个词语之间肯定不是相互独立的，有一定的上下文联系。但在朴素贝叶斯文本分类时，我们假设个单词之间没有联系，可以用一个文本特征向量来表示这篇文章，这就是“朴素”的来历。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;strong&gt;、朴素贝叶斯如何工作&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;有了条件独立假设，就不必计算X和Y的每一种组合的类条件概率，只需对给定的Y，计算每个xi的条件概率。后一种方法更实用，因为它不需要很大的训练集就能获得较好的概率估计。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;strong&gt;、估计分类属性的条件概率&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;P(x&lt;sub&gt;i&lt;/sub&gt;|Y=y)怎么计算呢？它一般根据类别y下包含属性xi的实例的比例来估计。以文本分类为例，xi表示一个单词，P(x&lt;sub&gt;i&lt;/sub&gt;|Y=y)=包含该类别下包含单词的xi的文章总数/ 该类别下的文章总数。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;strong&gt;、贝叶斯分类器举例&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;假设给定了如下训练样本数据，我们学习的目标是根据给定的天气状况判断你对PlayTennis这个请求的回答是Yes还是No。&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Day&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Outlook&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Temperature&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Humidity&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Wind&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;PlayTennis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;D1&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Sunny&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Hot&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;High&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Weak&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;D2&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Sunny&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Hot&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;High&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Strong&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;D3&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Overcast&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Hot&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;High&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Weak&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;D4&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Rain&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Mild&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;High&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Weak&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;D5&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Rain&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Cool&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Normal&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Weak&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;D6&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Rain&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Cool&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Normal&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Strong&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;D7&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Overcast&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Cool&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Normal&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Strong&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;D8&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Sunny&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Mild&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;High&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Weak&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;D9&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Sunny&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Cool&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Normal&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Weak&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;D10&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Rain&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Mild&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Normal&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Weak&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;D11&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Sunny&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Mild&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Normal&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Strong&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;D12&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Overcast&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Mild&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;High&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Strong&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;D13&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Overcast&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Hot&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Normal&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Weak&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;D14&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Rain&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Mild&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;High&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;Strong&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;95&quot;&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;可以看到这里样本数据集提供了14个训练样本，我们将使用此表的数据，并结合朴素贝叶斯分类器来分类下面的新实例：&lt;/p&gt;
&lt;p&gt;x = (Outlook = Sunny,Temprature = Cool,Humidity = High,Wind = Strong)&lt;/p&gt;
&lt;p&gt;在这个例子中，属性向量X=(Outlook, Temperature, Humidity, Wind)，类集合Y={Yes, No}。我们需要利用训练数据计算后验概率P(Yes|x)和P(No|x)，如果P(Yes|x)&amp;gt;P(No|x)，那么新实例分类为Yes，否则为No。&lt;/p&gt;
&lt;p&gt;为了计算后验概率，我们需要计算先验概率P(Yes)和P(No)和类条件概率P(xi|Y)。&lt;/p&gt;
&lt;p&gt;因为有9个样本属于Yes，5个样本属于No，所以P(Yes)=9/14, P(No)=5/14。&lt;/p&gt;
&lt;p&gt;类条件概率计算如下：&lt;/p&gt;
&lt;p&gt;P(Outlook = Sunny|Yes)=2/9 P(Outlook = Sunny|No)=3/5&lt;/p&gt;
&lt;p&gt;P(Temprature = Cool |Yes) =3/9 P(Temprature = Cool |No) =1/5&lt;/p&gt;
&lt;p&gt;P(Humidity = High |Yes) =3/9 P(Humidity = High |No) =4/5&lt;/p&gt;
&lt;p&gt;P(Wind = Strong |Yes) =3/9 P(Wind = Strong |No) =3/5&lt;/p&gt;
&lt;p&gt;后验概率计算如下：&lt;/p&gt;
&lt;p&gt;P(Yes | x)= P(Outlook = Sunny|Yes)×P(Temprature = Cool |Yes)×P(Humidity = High |Yes)×P(Wind = Strong |Yes)×P(Yes)=2/9×3/9×3/9×3/9×3/9×9/14=2/243=9/1701≈0.00529&lt;/p&gt;
&lt;p&gt;P(No | x)= P(Outlook = Sunny|No)×P(Temprature = Cool |No)×P(Humidity = High |No)× P(Wind = Strong |No)×P(No)=3/5×1/5×4/5×3/5×5/14=18/875≈0.02057&lt;/p&gt;
&lt;p&gt;通过计算得出P(No | x)&amp;gt; P(Yes | x)，所以该样本分类为No[3]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;strong&gt;、条件概率的&lt;/strong&gt;&lt;strong&gt;m&lt;/strong&gt;&lt;strong&gt;估计&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;假设有来了一个新样本 x1= (Outlook = Cloudy,Temprature = Cool,Humidity = High,Wind = Strong)，要求对其分类。我们来开始计算，&lt;/p&gt;
&lt;p&gt;P(Outlook = Cloudy|Yes)=0/9=0 P(Outlook = Cloudy |No)=0/5=0&lt;/p&gt;
&lt;p&gt;计算到这里，大家就会意识到，这里出现了一个新的属性值，在训练样本中所没有的。如果有一个属性的类条件概率为0，则整个类的后验概率就等于0，我们可以直接得到后验概率P(Yes | x1)= P(No | x1)=0，这时二者相等，无法分类。&lt;/p&gt;
&lt;p&gt;当训练样本不能覆盖那么多的属性值时，都会出现上述的窘境。简单的使用样本比例来估计类条件概率的方法太脆弱了，尤其是当训练样本少而属性数目又很大时。&lt;/p&gt;
&lt;p&gt;解决方法是使用m估计(m-estimate)方法来估计条件概率：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.yanjiuyanjiu.com/wp-content/uploads/2012/04/clip_image012.gif&quot;&gt;&lt;img style=&quot;display: inline; border: 0px;&quot; title=&quot;clip_image012&quot; src=&quot;http://www.yanjiuyanjiu.com/wp-content/uploads/2012/04/clip_image012_thumb.gif&quot; alt=&quot;clip_image012&quot; width=&quot;129&quot; height=&quot;41&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;n是类y&lt;sub&gt;j&lt;/sub&gt;中的样本总数，n&lt;sub&gt;c&lt;/sub&gt;是类y&lt;sub&gt;j&lt;/sub&gt;中取值x&lt;sub&gt;i&lt;/sub&gt;的样本数，m是称为等价样本大小的参数，而p是用户指定的参数。如果没有训练集（即n=0），则P(x&lt;sub&gt;i&lt;/sub&gt;|y&lt;sub&gt;j&lt;/sub&gt;)=p, 因此p可以看作是在类yj的样本中观察属性值xi的先验概率。等价样本大小决定先验概率和观测概率n&lt;sub&gt;c&lt;/sub&gt;/n之间的平衡[2]。&lt;/p&gt;
&lt;h3&gt;第2章 朴素贝叶斯文本分类算法&lt;/h3&gt;
&lt;p&gt;现在开始进入本文的主旨部分：如何将贝叶斯分类器应用到文本分类上来。&lt;/p&gt;
&lt;h4&gt;2.1文本分类问题&lt;/h4&gt;
&lt;p&gt;在文本分类中，假设我们有一个文档d∈X，X是文档向量空间(document space)，和一个固定的类集合C={c1,c2,…,cj}，类别又称为标签。显然，文档向量空间是一个高维度空间。我们把一堆打了标签的文档集合&amp;lt;d,c&amp;gt;作为训练样本，&amp;lt;d,c&amp;gt;∈X×C。例如：&lt;/p&gt;
&lt;p&gt;&amp;lt;d,c&amp;gt;={Beijing joins the World Trade Organization, China}&lt;/p&gt;
&lt;p&gt;对于这个只有一句话的文档，我们把它归类到 China，即打上china标签。&lt;/p&gt;
&lt;p&gt;我们期望用某种训练算法，训练出一个函数γ，能够将文档映射到某一个类别：&lt;/p&gt;
&lt;p&gt;γ:X→C&lt;/p&gt;
&lt;p&gt;这种类型的学习方法叫做有监督学习，因为事先有一个监督者（我们事先给出了一堆打好标签的文档）像个老师一样监督着整个学习过程。&lt;/p&gt;
&lt;p&gt;朴素贝叶斯分类器是一种有监督学习，常见有两种模型，多项式模型(multinomial model)和伯努利模型(Bernoulli model)。&lt;/p&gt;
&lt;h4&gt;2.2多项式模型&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;strong&gt;、基本原理&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在多项式模型中， 设某文档d=(t&lt;sub&gt;1&lt;/sub&gt;,t&lt;sub&gt;2&lt;/sub&gt;,…,t&lt;sub&gt;k&lt;/sub&gt;)，t&lt;sub&gt;k&lt;/sub&gt;是该文档中出现过的单词，允许重复，则&lt;/p&gt;
&lt;p&gt;先验概率P(c)= 类c下单词总数/整个训练样本的单词总数&lt;/p&gt;
&lt;p&gt;类条件概率P(t&lt;sub&gt;k&lt;/sub&gt;|c)=(类c下单词t&lt;sub&gt;k&lt;/sub&gt;在各个文档中出现过的次数之和+1)/(类c下单词总数+|V|)&lt;/p&gt;
&lt;p&gt;V是训练样本的单词表（即抽取单词，单词出现多次，只算一个），|V|则表示训练样本包含多少种单词。在这里，m=|V|, p=1/|V|。&lt;/p&gt;
&lt;p&gt;P(t&lt;sub&gt;k&lt;/sub&gt;|c)可以看作是单词t&lt;sub&gt;k&lt;/sub&gt;在证明d属于类c上提供了多大的证据，而P(c)则可以认为是类别c在整体上占多大比例(有多大可能性)。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;strong&gt;、伪代码&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;//C，类别集合，D，用于训练的文本文件集合&lt;/p&gt;
&lt;p&gt;TrainMultiNomialNB(C,D) {&lt;/p&gt;
&lt;p&gt;// 单词出现多次，只算一个&lt;/p&gt;
&lt;p&gt;V←ExtractVocabulary(D)&lt;/p&gt;
&lt;p&gt;// 单词可重复计算&lt;/p&gt;
&lt;p&gt;N←CountTokens(D)&lt;/p&gt;
&lt;p&gt;for each c∈C&lt;/p&gt;
&lt;p&gt;// 计算类别c下的单词总数&lt;/p&gt;
&lt;p&gt;// N和Nc的计算方法和Introduction to Information Retrieval上的不同，个人认为&lt;/p&gt;
&lt;p&gt;//该书是错误的，先验概率和类条件概率的计算方法应当保持一致&lt;/p&gt;
&lt;p&gt;Nc←CountTokensInClass(D,c)&lt;/p&gt;
&lt;p&gt;prior[c]←Nc/N&lt;/p&gt;
&lt;p&gt;// 将类别c下的文档连接成一个大字符串&lt;/p&gt;
&lt;p&gt;text&lt;sub&gt;c&lt;/sub&gt;←ConcatenateTextOfAllDocsInClass(D,c)&lt;/p&gt;
&lt;p&gt;for each t∈V&lt;/p&gt;
&lt;p&gt;// 计算类c下单词t的出现次数&lt;/p&gt;
&lt;p&gt;T&lt;sub&gt;ct&lt;/sub&gt;←CountTokensOfTerm(text&lt;sub&gt;c&lt;/sub&gt;,t)&lt;/p&gt;
&lt;p&gt;for each t∈V&lt;/p&gt;
&lt;p&gt;//计算P(t|c)&lt;/p&gt;
&lt;p&gt;condprob[t][c]←&lt;a href=&quot;http://www.yanjiuyanjiu.com/wp-content/uploads/2012/04/clip_image014.gif&quot;&gt;&lt;img style=&quot;display: inline; border: 0px;&quot; title=&quot;clip_image014&quot; src=&quot;http://www.yanjiuyanjiu.com/wp-content/uploads/2012/04/clip_image014_thumb.gif&quot; alt=&quot;clip_image014&quot; width=&quot;98&quot; height=&quot;64&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;return V,prior,condprob&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;ApplyMultiNomialNB(C,V,prior,condprob,d) {&lt;/p&gt;
&lt;p&gt;// 将文档d中的单词抽取出来，允许重复，如果单词是全新的，在全局单词表V中都&lt;/p&gt;
&lt;p&gt;// 没出现过，则忽略掉&lt;/p&gt;
&lt;p&gt;W←ExtractTokensFromDoc(V,d)&lt;/p&gt;
&lt;p&gt;for each c∈C&lt;/p&gt;
&lt;p&gt;score[c]←prior[c]&lt;/p&gt;
&lt;p&gt;for each t∈W&lt;/p&gt;
&lt;p&gt;if t∈Vd&lt;/p&gt;
&lt;p&gt;score[c] *= condprob[t][c]&lt;/p&gt;
&lt;p&gt;return max(score[c])&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;strong&gt;、举例&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;给定一组分类好了的文本训练数据，如下：&lt;/p&gt;
&lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;64&quot;&gt;docId&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;236&quot;&gt;doc&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;126&quot;&gt;类别&lt;/p&gt;
&lt;p&gt;In c=China?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;64&quot;&gt;1&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;236&quot;&gt;Chinese Beijing Chinese&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;126&quot;&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;64&quot;&gt;2&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;236&quot;&gt;Chinese Chinese Shanghai&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;126&quot;&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;64&quot;&gt;3&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;236&quot;&gt;Chinese Macao&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;126&quot;&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;64&quot;&gt;4&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;236&quot;&gt;Tokyo Japan Chinese&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;126&quot;&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;给定一个新样本Chinese Chinese Chinese Tokyo Japan，对其进行分类。&lt;/p&gt;
&lt;p&gt;该文本用属性向量表示为d=(Chinese, Chinese, Chinese, Tokyo, Japan)，类别集合为Y={yes, no}。&lt;/p&gt;
&lt;p&gt;类yes下总共有8个单词，类no下总共有3个单词，训练样本单词总数为11，因此P(yes)=8/11, P(no)=3/11。类条件概率计算如下：&lt;/p&gt;
&lt;p&gt;P(Chinese | yes)=(5+1)/(8+6)=6/14=3/7&lt;/p&gt;
&lt;p&gt;P(Japan | yes)=P(Tokyo | yes)= (0+1)/(8+6)=1/14&lt;/p&gt;
&lt;p&gt;P(Chinese|no)=(1+1)/(3+6)=2/9&lt;/p&gt;
&lt;p&gt;P(Japan|no)=P(Tokyo| no) =(1+1)/(3+6)=2/9&lt;/p&gt;
&lt;p&gt;分母中的8，是指yes类别下text&lt;sub&gt;c&lt;/sub&gt;的长度，也即训练样本的单词总数，6是指训练样本有Chinese,Beijing,Shanghai, Macao, Tokyo, Japan 共6个单词，3是指no类下共有3个单词。&lt;/p&gt;
&lt;p&gt;有了以上类条件概率，开始计算后验概率，&lt;/p&gt;
&lt;p&gt;P(yes | d)=(3/7)&lt;sup&gt;3&lt;/sup&gt;×1/14×1/14×8/11=108/184877≈0.00058417&lt;/p&gt;
&lt;p&gt;P(no | d)= (2/9)&lt;sup&gt;3&lt;/sup&gt;×2/9×2/9×3/11=32/216513≈0.00014780&lt;/p&gt;
&lt;p&gt;因此，这个文档属于类别china。&lt;/p&gt;
&lt;h4&gt;2.3伯努利模型&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;strong&gt;、基本原理&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;P(c)= 类c下文件总数/整个训练样本的文件总数&lt;/p&gt;
&lt;p&gt;P(t&lt;sub&gt;k&lt;/sub&gt;|c)=(类c下包含单词t&lt;sub&gt;k&lt;/sub&gt;的文件数+1)/(类c下单词总数+2)&lt;/p&gt;
&lt;p&gt;在这里，m=2, p=1/2。&lt;/p&gt;
&lt;p&gt;后验概率的计算，也有点变化，见下面的伪代码。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;strong&gt;、伪代码&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;//C，类别集合，D，用于训练的文本文件集合&lt;/p&gt;
&lt;p&gt;TrainBernoulliNB(C, D) {&lt;/p&gt;
&lt;p&gt;// 单词出现多次，只算一个&lt;/p&gt;
&lt;p&gt;V←ExtractVocabulary(D)&lt;/p&gt;
&lt;p&gt;// 计算文件总数&lt;/p&gt;
&lt;p&gt;N←CountDocs(D)&lt;/p&gt;
&lt;p&gt;for each c∈C&lt;/p&gt;
&lt;p&gt;// 计算类别c下的文件总数&lt;/p&gt;
&lt;p&gt;Nc←CountDocsInClass(D,c)&lt;/p&gt;
&lt;p&gt;prior[c]←Nc/N&lt;/p&gt;
&lt;p&gt;for each t∈V&lt;/p&gt;
&lt;p&gt;// 计算类c下包含单词t的文件数&lt;/p&gt;
&lt;p&gt;Nct←CountDocsInClassContainingTerm(D,c,t)&lt;/p&gt;
&lt;p&gt;//计算P(t|c)&lt;/p&gt;
&lt;p&gt;condprob[t][c]←(Nct+1)/(Nct+2)&lt;/p&gt;
&lt;p&gt;return V,prior,condprob&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;ApplyBernoulliNB(C,V,prior,condprob,d) {&lt;/p&gt;
&lt;p&gt;// 将文档d中单词表抽取出来，如果单词是全新的，在全局单词表V中都没出现过，&lt;/p&gt;
&lt;p&gt;// 则舍弃&lt;/p&gt;
&lt;p&gt;V&lt;sub&gt;d&lt;/sub&gt;←ExtractTermsFromDoc(V,d)&lt;/p&gt;
&lt;p&gt;for each c∈C&lt;/p&gt;
&lt;p&gt;score[c]←prior[c]&lt;/p&gt;
&lt;p&gt;for each t∈V&lt;/p&gt;
&lt;p&gt;if t∈V&lt;sub&gt;d&lt;/sub&gt;&lt;/p&gt;
&lt;p&gt;score[c] *= condprob[t][c]&lt;/p&gt;
&lt;p&gt;else&lt;/p&gt;
&lt;p&gt;score[c] *= (1-condprob[t][c])&lt;/p&gt;
&lt;p&gt;return max(score[c])&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;strong&gt;、举例&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;还是使用前面例子中的数据，不过模型换成了使用伯努利模型。&lt;/p&gt;
&lt;p&gt;类yes下总共有3个文件，类no下有1个文件，训练样本文件总数为11，因此P(yes)=3/4, P(Chinese | yes)=(3+1)/(3+2)=4/5&lt;/p&gt;
&lt;p&gt;P(Japan | yes)=P(Tokyo | yes)=(0+1)/(3+2)=1/5&lt;/p&gt;
&lt;p&gt;P(Beijing | yes)= P(Macao|yes)= P(Shanghai |yes)=(1+1)/(3+2)=2/5&lt;/p&gt;
&lt;p&gt;P(Chinese|no)=(1+1)/(1+2)=2/3&lt;/p&gt;
&lt;p&gt;P(Japan|no)=P(Tokyo| no) =(1+1)/(1+2)=2/3&lt;/p&gt;
&lt;p&gt;P(Beijing| no)= P(Macao| no)= P(Shanghai | no)=(0+1)/(1+2)=1/3&lt;/p&gt;
&lt;p&gt;有了以上类条件概率，开始计算后验概率，&lt;/p&gt;
&lt;p&gt;P(yes | d)=P(yes)×P(Chinese|yes) ×P(Japan|yes) ×P(Tokyo|yes)×(1-P(Beijing|yes)) ×(1-P(Shanghai|yes))×(1-P(Macao|yes))&lt;/p&gt;
&lt;p&gt;=3/4×4/5×1/5×1/5×(1-2/5) ×(1-2/5)×(1-2/5)=81/15625≈0.005&lt;/p&gt;
&lt;p&gt;P(no | d)= 1/4×2/3×2/3×2/3×(1-1/3)×(1-1/3)×(1-1/3)=16/729≈0.022&lt;/p&gt;
&lt;p&gt;因此，这个文档不属于类别china。&lt;/p&gt;
&lt;h4&gt;2.4两个模型的区别&lt;/h4&gt;
&lt;p&gt;二者的计算粒度不一样，多项式模型以单词为粒度，伯努利模型以文件为粒度，因此二者的先验概率和类条件概率的计算方法都不同。&lt;/p&gt;
&lt;p&gt;计算后验概率时，对于一个文档d，多项式模型中，只有在d中出现过的单词，才会参与后验概率计算，伯努利模型中，没有在d中出现，但是在全局单词表中出现的单词，也会参与计算，不过是作为“反方”参与的。&lt;/p&gt;
&lt;h3&gt;第3章 代码详解&lt;/h3&gt;
&lt;p&gt;本文附带了一个eclipse工程，有完整的源代码，以及一个微型文本训练库。&lt;/p&gt;
&lt;p&gt;ChineseSpliter用于中文分词，StopWordsHandler用于判断一个单词是否是停止词，ClassifyResult用于保存结果，IntermediateData用于预处理文本语料库，TrainnedModel用于保存训练后得到的数据，NaiveBayesClassifier是基础类，包含了贝叶斯分类器的主要代码，MultiNomialNB是多项式模型，类似的，BernoulliNB是伯努利模型，二者都继承自NaiveBayesClassifier，都只重写了父类的计算先验概率，类条件概率和后验概率这3个函数。&lt;/p&gt;
&lt;h4&gt;3.1中文分词&lt;/h4&gt;
&lt;p&gt;中文分词不是本文的重点，这里我们直接使用第三方工具，本源码使用的是&lt;a href=&quot;http://www.jesoft.cn/&quot;&gt;极易中文分词组件&lt;/a&gt;，你还可以使用&lt;a href=&quot;http://chtsai.org/&quot;&gt;MMSEG&lt;/a&gt;，中科院的&lt;a href=&quot;http://ictclas.org/&quot;&gt;ICTCLAS&lt;/a&gt;等等。&lt;/p&gt;
&lt;p&gt;/**&lt;/p&gt;
&lt;p&gt;* 对给定的文本进行中文分词.&lt;/p&gt;
&lt;p&gt;*&lt;/p&gt;
&lt;p&gt;* &lt;strong&gt;@param&lt;/strong&gt; text&lt;/p&gt;
&lt;p&gt;* 给定的文本&lt;/p&gt;
&lt;p&gt;* &lt;strong&gt;@param&lt;/strong&gt; splitToken&lt;/p&gt;
&lt;p&gt;* 用于分割的标记,如”|”&lt;/p&gt;
&lt;p&gt;* &lt;strong&gt;@return&lt;/strong&gt; 分词完毕的文本&lt;/p&gt;
&lt;p&gt;*/&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;public&lt;/strong&gt; String split(&lt;strong&gt;final&lt;/strong&gt; String text, &lt;strong&gt;final&lt;/strong&gt; String splitToken) {&lt;/p&gt;
&lt;p&gt;String result = &lt;strong&gt;null&lt;/strong&gt;;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;try&lt;/strong&gt; {&lt;/p&gt;
&lt;p&gt;result = analyzer.segment(text, splitToken);&lt;/p&gt;
&lt;p&gt;} &lt;strong&gt;catch&lt;/strong&gt; (IOException e) {&lt;/p&gt;
&lt;p&gt;e.printStackTrace();&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;return&lt;/strong&gt; result;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4&gt;3.2停止词处理&lt;/h4&gt;
&lt;p&gt;停止词(Stop Word)是指那些无意义的字或词，如“的”、“在”等。去掉文档中的停止词也是必须的一项工作,这里简单的定义了一些常见的停止词，并根据这些常用停止词在分词时进行判断。&lt;/p&gt;
&lt;p&gt;/** 常用停用词. */&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;private&lt;/strong&gt; &lt;strong&gt;static&lt;/strong&gt; String[] &lt;em&gt;stopWordsList&lt;/em&gt; = {&lt;/p&gt;
&lt;p&gt;// 来自 c:\Windows\System32\NOISE.CHS&lt;/p&gt;
&lt;p&gt;“的”, “一”, “不”, “在”, “人”, “有”, “是”, “为”, “以”, “于”, “上”, “他”, “而”,&lt;/p&gt;
&lt;p&gt;“后”, “之”, “来”, “及”, “了”, “因”, “下”, “可”, “到”, “由”, “这”, “与”, “也”,&lt;/p&gt;
&lt;p&gt;“此”, “但”, “并”, “个”, “其”, “已”, “无”, “小”, “我”, “们”, “起”, “最”, “再”,&lt;/p&gt;
&lt;p&gt;“今”, “去”, “好”, “只”, “又”, “或”, “很”, “亦”, “某”, “把”, “那”, “你”, “乃”,&lt;/p&gt;
&lt;p&gt;“它”,&lt;/p&gt;
&lt;p&gt;// 来自网络&lt;/p&gt;
&lt;p&gt;“要”, “将”, “应”, “位”, “新”, “两”, “中”, “更”, “我们”, “自己”, “没有”, ““”, “””,&lt;/p&gt;
&lt;p&gt;“，”, “（”, “）”, “” };&lt;/p&gt;
&lt;p&gt;/**&lt;/p&gt;
&lt;p&gt;* 判断一个词是否是停止词.&lt;/p&gt;
&lt;p&gt;*&lt;/p&gt;
&lt;p&gt;* &lt;strong&gt;@param&lt;/strong&gt; word&lt;/p&gt;
&lt;p&gt;* 要判断的词&lt;/p&gt;
&lt;p&gt;* &lt;strong&gt;@return&lt;/strong&gt; 是停止词，返回true，否则返回false&lt;/p&gt;
&lt;p&gt;*/&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;public&lt;/strong&gt; &lt;strong&gt;static&lt;/strong&gt; &lt;strong&gt;boolean&lt;/strong&gt; isStopWord(&lt;strong&gt;final&lt;/strong&gt; String word) {&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;for&lt;/strong&gt; (&lt;strong&gt;int&lt;/strong&gt; i = 0; i &amp;lt; &lt;em&gt;stopWordsList&lt;/em&gt;.length; ++i) {&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;if&lt;/strong&gt; (word.equalsIgnoreCase(&lt;em&gt;stopWordsList&lt;/em&gt;[i])) {&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;return&lt;/strong&gt; &lt;strong&gt;true&lt;/strong&gt;;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;return&lt;/strong&gt; &lt;strong&gt;false&lt;/strong&gt;;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4&gt;3.3预处理数据&lt;/h4&gt;
&lt;p&gt;我们这里使用&lt;a href=&quot;http://www.sogou.com/labs/dl/c.html&quot;&gt;搜狗的文本分类语料库&lt;/a&gt;作为训练样本，把SogouC.reduced.20061102.tar.gz解压到D盘，目录结构为&lt;/p&gt;
&lt;p&gt;D:\Reduced&lt;/p&gt;
&lt;p&gt;|&amp;#8211; C000008&lt;/p&gt;
&lt;p&gt;|&amp;#8211; C000010&lt;/p&gt;
&lt;p&gt;|&amp;#8211; C000013&lt;/p&gt;
&lt;p&gt;|&amp;#8211; C000014&lt;/p&gt;
&lt;p&gt;|&amp;#8211; C000016&lt;/p&gt;
&lt;p&gt;|&amp;#8211; C000020&lt;/p&gt;
&lt;p&gt;|&amp;#8211; C000022&lt;/p&gt;
&lt;p&gt;|&amp;#8211; C000023&lt;/p&gt;
&lt;p&gt;|&amp;#8211; C000024&lt;/p&gt;
&lt;p&gt;IntermediateData.java主要用于处理文本数据，将所需要的信息计算好，存放到数据库文件中。&lt;/p&gt;
&lt;p&gt;中间数据文件主要保存了如下信息，&lt;/p&gt;
&lt;p&gt;/** 单词X在类别C下出现的总数. */&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;public&lt;/strong&gt; &lt;span style=&quot;text-decoration: underline;&quot;&gt;HashMap&lt;/span&gt;[] filesOfXC;&lt;/p&gt;
&lt;p&gt;/** 给定分类下的文件数目. */&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;public&lt;/strong&gt; &lt;strong&gt;int&lt;/strong&gt;[] filesOfC;&lt;/p&gt;
&lt;p&gt;/** 根目录下的文件总数. */&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;public&lt;/strong&gt; &lt;strong&gt;int&lt;/strong&gt; files;&lt;/p&gt;
&lt;p&gt;/** 单词X在类别C下出现的总数 */&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;public&lt;/strong&gt; &lt;span style=&quot;text-decoration: underline;&quot;&gt;HashMap&lt;/span&gt;[] tokensOfXC;&lt;/p&gt;
&lt;p&gt;/** 类别C下所有单词的总数. */&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;public&lt;/strong&gt; &lt;strong&gt;int&lt;/strong&gt;[] tokensOfC;&lt;/p&gt;
&lt;p&gt;/** 整个语料库中单词的总数. */&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;public&lt;/strong&gt; &lt;strong&gt;int&lt;/strong&gt; tokens;&lt;/p&gt;
&lt;p&gt;/** 整个训练语料所出现的单词. */&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;public&lt;/strong&gt; HashSet&amp;lt;String&amp;gt; vocabulary;&lt;/p&gt;
&lt;p&gt;我们使用命令&lt;/p&gt;
&lt;p&gt;IntermediateData d:\Reduced\ gbk d:\reduced.db&lt;/p&gt;
&lt;p&gt;将文本训练库的信息计算好，保存到中间文件中。以后的阶段，我们都不再需要文本语料库了，只需要reduced.db。&lt;/p&gt;
&lt;h4&gt;3.3训练&lt;/h4&gt;
&lt;p&gt;基本的框架代码都在NaiveBayesClassifier中，MultiNomialNB和BernoulliNB都只是重新实现(override)了&lt;/p&gt;
&lt;p&gt;/** 计算先验概率P(c). */&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;protected&lt;/strong&gt; &lt;strong&gt;void&lt;/strong&gt; calculatePc() {&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;/** 计算类条件概率P(x|c). */&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;protected&lt;/strong&gt; &lt;strong&gt;void&lt;/strong&gt; calculatePxc() {&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;/**&lt;/p&gt;
&lt;p&gt;* 计算文本属性向量X在类&lt;span style=&quot;text-decoration: underline;&quot;&gt;Cj&lt;/span&gt;下的后验概率P(&lt;span style=&quot;text-decoration: underline;&quot;&gt;Cj&lt;/span&gt;|X).&lt;/p&gt;
&lt;p&gt;*&lt;/p&gt;
&lt;p&gt;* &lt;strong&gt;@param&lt;/strong&gt; x&lt;/p&gt;
&lt;p&gt;* 文本属性向量&lt;/p&gt;
&lt;p&gt;* &lt;strong&gt;@param&lt;/strong&gt; cj&lt;/p&gt;
&lt;p&gt;* 给定的类别&lt;/p&gt;
&lt;p&gt;* &lt;strong&gt;@return&lt;/strong&gt; 后验概率&lt;/p&gt;
&lt;p&gt;*/&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;protected&lt;/strong&gt; &lt;strong&gt;double&lt;/strong&gt; calcProd(&lt;strong&gt;final&lt;/strong&gt; String[] x, &lt;strong&gt;final&lt;/strong&gt; &lt;strong&gt;int&lt;/strong&gt; cj) {&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;return&lt;/strong&gt; 0;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;这三个函数。&lt;/p&gt;
&lt;p&gt;训练函数如下：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;public&lt;/strong&gt; &lt;strong&gt;final&lt;/strong&gt; &lt;strong&gt;void&lt;/strong&gt; train(String intermediateData, String modelFile) {&lt;/p&gt;
&lt;p&gt;// 加载中间数据文件&lt;/p&gt;
&lt;p&gt;loadData(intermediateData);&lt;/p&gt;
&lt;p&gt;model = &lt;strong&gt;new&lt;/strong&gt; TrainnedModel(db.classifications.length);&lt;/p&gt;
&lt;p&gt;model.classifications = db.classifications;&lt;/p&gt;
&lt;p&gt;model.vocabulary = db.vocabulary;&lt;/p&gt;
&lt;p&gt;// 开始训练&lt;/p&gt;
&lt;p&gt;calculatePc();&lt;/p&gt;
&lt;p&gt;calculatePxc();&lt;/p&gt;
&lt;p&gt;db = &lt;strong&gt;null&lt;/strong&gt;;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;try&lt;/strong&gt; {&lt;/p&gt;
&lt;p&gt;// 用序列化，将训练得到的结果存放到模型文件中&lt;/p&gt;
&lt;p&gt;ObjectOutputStream out = &lt;strong&gt;new&lt;/strong&gt; ObjectOutputStream(&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;new&lt;/strong&gt; FileOutputStream(modelFile));&lt;/p&gt;
&lt;p&gt;out.writeObject(model);&lt;/p&gt;
&lt;p&gt;out.close();&lt;/p&gt;
&lt;p&gt;} &lt;strong&gt;catch&lt;/strong&gt; (IOException e) {&lt;/p&gt;
&lt;p&gt;e.printStackTrace();&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;我们使用命令：&lt;/p&gt;
&lt;p&gt;MultiNomialNB –t d:\reduced.db d:\reduced.mdl&lt;/p&gt;
&lt;p&gt;开始训练，得到的模型文件保存在reduced.mdl中。&lt;/p&gt;
&lt;h4&gt;3.4分类&lt;/h4&gt;
&lt;p&gt;有了模型文件，就可以用它来进行分类了。&lt;/p&gt;
&lt;p&gt;可以使用命令&lt;/p&gt;
&lt;p&gt;MultiNomialNB d:\reduced.mdl d:\temp.txt gbk&lt;/p&gt;
&lt;p&gt;对文本文件temp.txt进行分类。&lt;/p&gt;
&lt;p&gt;还可以将当初训练出这个模型文件的文本库，进行分类，看看正确率有多少，即“吃自己的狗食”，命令行如下&lt;/p&gt;
&lt;p&gt;MultiNomialNB -r d:\reduced\ gbk d:\reduced.mdl&lt;/p&gt;
&lt;p&gt;分类函数如下：&lt;/p&gt;
&lt;p&gt;/**&lt;/p&gt;
&lt;p&gt;* 对给定的文本进行分类.&lt;/p&gt;
&lt;p&gt;*&lt;/p&gt;
&lt;p&gt;* &lt;strong&gt;@param&lt;/strong&gt; text&lt;/p&gt;
&lt;p&gt;* 给定的文本&lt;/p&gt;
&lt;p&gt;* &lt;strong&gt;@return&lt;/strong&gt; 分类结果&lt;/p&gt;
&lt;p&gt;*/&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;public&lt;/strong&gt; &lt;strong&gt;final&lt;/strong&gt; String classify(&lt;strong&gt;final&lt;/strong&gt; String text) {&lt;/p&gt;
&lt;p&gt;String[] terms = &lt;strong&gt;null&lt;/strong&gt;;&lt;/p&gt;
&lt;p&gt;// 中文分词处理(分词后结果可能还包含有停用词）&lt;/p&gt;
&lt;p&gt;terms = textSpliter.split(text, ” “).split(” “);&lt;/p&gt;
&lt;p&gt;// 去掉停用词，以免影响分类&lt;/p&gt;
&lt;p&gt;terms = ChineseSpliter.&lt;em&gt;dropStopWords&lt;/em&gt;(terms);&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;double&lt;/strong&gt; probility = 0.0;&lt;/p&gt;
&lt;p&gt;// 分类结果&lt;/p&gt;
&lt;p&gt;List&amp;lt;ClassifyResult&amp;gt; crs = &lt;strong&gt;new&lt;/strong&gt; ArrayList&amp;lt;ClassifyResult&amp;gt;();&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;for&lt;/strong&gt; (&lt;strong&gt;int&lt;/strong&gt; i = 0; i &amp;lt; model.classifications.length; i++) {&lt;/p&gt;
&lt;p&gt;// 计算给定的文本属性向量terms在给定的分类&lt;span style=&quot;text-decoration: underline;&quot;&gt;Ci&lt;/span&gt;中的分类条件概率&lt;/p&gt;
&lt;p&gt;probility = calcProd(terms, i);&lt;/p&gt;
&lt;p&gt;// 保存分类结果&lt;/p&gt;
&lt;p&gt;ClassifyResult cr = &lt;strong&gt;new&lt;/strong&gt; ClassifyResult();&lt;/p&gt;
&lt;p&gt;cr.classification = model.classifications[i]; // 分类&lt;/p&gt;
&lt;p&gt;cr.probility = probility; // 关键字在分类的条件概率&lt;/p&gt;
&lt;p&gt;System.&lt;em&gt;out&lt;/em&gt;.println(“In process&amp;#8230;.”);&lt;/p&gt;
&lt;p&gt;System.&lt;em&gt;out&lt;/em&gt;.println(model.classifications[i] + “：” + probility);&lt;/p&gt;
&lt;p&gt;crs.add(cr);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;// 找出最大的元素&lt;/p&gt;
&lt;p&gt;ClassifyResult maxElem = (ClassifyResult) java.util.Collections.&lt;em&gt;max&lt;/em&gt;(&lt;/p&gt;
&lt;p&gt;crs, &lt;strong&gt;new&lt;/strong&gt; Comparator() {&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;public&lt;/strong&gt; &lt;strong&gt;int&lt;/strong&gt; compare(&lt;strong&gt;final&lt;/strong&gt; Object o1, &lt;strong&gt;final&lt;/strong&gt; Object o2) {&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;final&lt;/strong&gt; ClassifyResult m1 = (ClassifyResult) o1;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;final&lt;/strong&gt; ClassifyResult m2 = (ClassifyResult) o2;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;final&lt;/strong&gt; &lt;strong&gt;double&lt;/strong&gt; ret = m1.probility &amp;#8211; m2.probility;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;if&lt;/strong&gt; (ret &amp;lt; 0) {&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;return&lt;/strong&gt; -1;&lt;/p&gt;
&lt;p&gt;} &lt;strong&gt;else&lt;/strong&gt; {&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;return&lt;/strong&gt; 1;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;});&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;return&lt;/strong&gt; maxElem.classification;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;测试正确率的函数getCorrectRate()，核心代码就是对每个文本文件调用classify()，将得到的类别和原始的类别比较，经过统计后就可以得到百分比。&lt;/p&gt;
&lt;p&gt;更多细节请读者阅读源代码。&lt;/p&gt;
&lt;h3&gt;参考文献&lt;/h3&gt;
&lt;p&gt;[1] Christopher D. Manning, Prabhakar Raghavan, Hinrich Schütze, &lt;a href=&quot;http://nlp.stanford.edu/IR-book/&quot;&gt;&lt;em&gt;Introduction to Information Retrieval&lt;/em&gt;&lt;/a&gt;, Cambridge University Press, 2008, chapter 13, &lt;em&gt;Text classification and Naive Bayes&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;[2]Pang-Ning Tan, Michael Steinbach, Vipin Kumar, &lt;a href=&quot;http://book.douban.com/subject/1786120/&quot;&gt;《数据挖掘导论》&lt;/a&gt;，北京：人民邮电出版社，2007，第140~145页。&lt;/p&gt;
&lt;p&gt;[2] 石志伟, 吴功宜, “&lt;a href=&quot;http://d.wanfangdata.com.cn/Conference_5615512.aspx&quot;&gt;基于朴素贝叶斯分类器的文本分类算法&lt;/a&gt;”, 第一届全国信息检索与内容安全学术会议，2004&lt;/p&gt;
&lt;p&gt;[3] 洞庭散人，“&lt;a href=&quot;http://www.cnblogs.com/phinecos/archive/2008/10/21/1315948.html&quot;&gt;基于朴素贝叶斯分类器的文本分类算法（上）&lt;/a&gt;”，“&lt;a href=&quot;http://www.cnblogs.com/phinecos/archive/2008/10/21/1316044.html&quot;&gt;基于朴素贝叶斯分类器的文本分类算法（下）&lt;/a&gt;”，2008&lt;/p&gt;
&lt;p&gt;[4]DL88250, “&lt;a href=&quot;http://blog.csdn.net/DL88250/archive/2008/02/20/2108164.aspx&quot;&gt;朴素贝叶斯中文文本分类器的研究与实现（1）&lt;/a&gt;”，“&lt;a href=&quot;http://blog.csdn.net/DL88250/archive/2008/03/27/2224126.aspx&quot;&gt;朴素贝叶斯中文文本分类器的研究与实现（2）&lt;/a&gt;”，2008&lt;/p&gt;
&lt;p&gt;由于笔者水平有限，本文出现错误在所难免，欢迎读者批评指正，请到原文发表评论或给我发email，谢谢 &lt;img src='http://www.yanjiuyanjiu.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /&gt; &lt;/p&gt;
&lt;p&gt;原文地址：&lt;a href=&quot;http://www.yanjiuyanjiu.com/2010/05/28/naive-bayes-text-classification/&quot;&gt;http://www.yanjiuyanjiu.com/2010/05/28/naive-bayes-text-classification/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.yanjiuyanjiu.com/wp-content/uploads/2010/05/基于朴素贝叶斯的文本分类算法.pdf&quot;&gt;PDF版本&lt;/a&gt;  &lt;a href=&quot;http://www.yanjiuyanjiu.com/wp-content/uploads/2010/05/NaiveBayesClassifier.zip&quot;&gt;源码下载&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/631829313/soulmachine/feedsky/s.gif?r=http://www.yanjiuyanjiu.com/archives/4162&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.yanjiuyanjiu.com/archives/4162/feed</wfw:commentRss><slash:comments>16</slash:comments><description>基于朴素贝叶斯的文本分类算法 作者: 灵魂机器 联系方式：soulmachine@gmail.com 作者博客：www.yanjiuyanjiu.com 摘要：常用的文本分类方法有支持向量机、K-近邻算法和朴素贝叶斯。其中朴素贝叶斯具有容易实现，运行速度快的特点，被广泛使用。本文详细介绍了朴素贝叶斯的基本原理，讨论了两种常见模型：多项式模型（MM）和伯努利模型（BM），实现了可运行的代码，并进行了一些数据测试。 关键字：朴素贝叶斯；文本分类 Text Classification Algorithm Based on Naive Bayes Author: soulmachine Email：soulmachine@gmail.com Blog：www.yanjiuyanjiu.com Abstract:Usually there are three methods for text classification: SVM、KNN and Naïve Bayes. Naïve Bayes is easy to implement and fast, so it is widely used. This article introduced the theory of Naïve Bayes and discussed two popular [...]&lt;img src=&quot;http://www1.feedsky.com/t1/631829313/soulmachine/feedsky/s.gif?r=http://www.yanjiuyanjiu.com/archives/4162&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>朴素贝叶斯</category><category>文本分类</category><category>naive bayes</category><category>数据挖掘</category><category>text classification</category><pubDate>Fri, 28 May 2010 16:37:13 +0800</pubDate><author>admin</author><comments>http://www.yanjiuyanjiu.com/archives/4162#comments</comments><guid isPermaLink="false">http://www.yanjiuyanjiu.com/2010/05/28/%e5%9f%ba%e4%ba%8e%e6%9c%b4%e7%b4%a0%e8%b4%9d%e5%8f%b6%e6%96%af%e7%9a%84%e6%96%87%e6%9c%ac%e5%88%86%e7%b1%bb%e7%ae%97%e6%b3%95-4/</guid><dc:creator>admin</dc:creator><fs:srclink>http://www.yanjiuyanjiu.com/archives/4162</fs:srclink><fs:srcfeed>http://www.yanjiuyanjiu.com/feed</fs:srcfeed><fs:itemid>feedsky/soulmachine/~7298288/631829313/5411851</fs:itemid></item><item><title>推荐给TeX新手的电子书和书籍</title><link>http://www.yanjiuyanjiu.com/archives/4128</link><content:encoded>&lt;p&gt;&lt;strong&gt;CTEX自带的文档：&lt;/strong&gt;&lt;br /&gt;
1、安装好CTEX后，c:\CTEX\CTeX\ctex\doc\下的两个文档，ctex-faq.pdf和lshort-cn.pdf（即93 分钟学会 LaTeX2e）&lt;br /&gt;
2、ftp://ftp.ctex.org/pub/tex/documents/bible/ 下的 LaTeX_manual.zip&lt;br /&gt;
对于初学者，上面3个文档足够了，在c:\CTEX\CTeX\ctex\doc\目录下的其他几个文档也非常好。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果想进一步学习，推荐下面一本书。&lt;/strong&gt;&lt;br /&gt;
3、&lt;a href=&quot;http://www.amazon.cn/mn/detailApp/ref=sr_1_1?_encoding=UTF8&amp;amp;s=books&amp;amp;qid=1271499096&amp;amp;asin=B00114JYBU&amp;amp;sr=8-1&quot;&gt;《LaTeX入门与提高》&lt;/a&gt;，陈志杰，2008，高等教育出版社，卓越上有卖的。&lt;a href=&quot;http://ishare.iask.sina.com.cn/f/7485622.html&quot;&gt;这里有个PDF扫描版&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;网上的免费电子书：&lt;/strong&gt;&lt;br /&gt;
4、&lt;a href=&quot;http://gigapedia.com/items/104415/a-guide-to-latex--document-preparation-for-beginners-and-advanced-users--3rd-edition-&quot;&gt;A Guide to LaTeX&lt;/a&gt;&lt;br /&gt;
5、the latex companion，和第2个文档 LaTeX_manual 在同一个ftp目录下,还有&lt;a href=&quot;http://gigapedia.com/items/3842/the-latex-companion--tools-and-techniques-for-computer-typesetting-&quot;&gt;另一个下载地址&lt;/a&gt;。&lt;br /&gt;
6、&lt;a href=&quot;http://ftp.ctex.org/pub/tex/documents/texguru/homepage/guide.html&quot;&gt;LaTeX2e使用手册&lt;/a&gt;&lt;br /&gt;
7、&lt;a href=&quot;ftp://ftp.ctex.org/pub/tex/documents/bible/LaTeX_graphics.zip&quot;&gt;LaTeX2e插图指南&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;参考资料：&lt;br /&gt;
&lt;a href=&quot;http://bbs.ctex.org/redirect.php?tid=31930&amp;amp;goto=lastpost&quot;&gt;陈志杰老师的《latex入门与提高》这本书怎么样啊？&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://bbs.ctex.org/viewthread.php?&amp;amp;tid=1023&quot;&gt;中国LaTeX 新用户，LaTeX中文必读教程&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/631829314/soulmachine/feedsky/s.gif?r=http://www.yanjiuyanjiu.com/archives/4128&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.yanjiuyanjiu.com/archives/4128/feed</wfw:commentRss><slash:comments>0</slash:comments><description>CTEX自带的文档： 1、安装好CTEX后，c:\CTEX\CTeX\ctex\doc\下的两个文档，ctex-faq.pdf和lshort-cn.pdf（即93 分钟学会 LaTeX2e） 2、ftp://ftp.ctex.org/pub/tex/documents/bible/ 下的 LaTeX_manual.zip 对于初学者，上面3个文档足够了，在c:\CTEX\CTeX\ctex\doc\目录下的其他几个文档也非常好。 如果想进一步学习，推荐下面一本书。 3、《LaTeX入门与提高》，陈志杰，2008，高等教育出版社，卓越上有卖的。这里有个PDF扫描版。 网上的免费电子书： 4、A Guide to LaTeX 5、the latex companion，和第2个文档 LaTeX_manual 在同一个ftp目录下,还有另一个下载地址。 6、LaTeX2e使用手册 7、LaTeX2e插图指南 参考资料： 陈志杰老师的《latex入门与提高》这本书怎么样啊？ 中国LaTeX 新用户，LaTeX中文必读教程&lt;img src=&quot;http://www1.feedsky.com/t1/631829314/soulmachine/feedsky/s.gif?r=http://www.yanjiuyanjiu.com/archives/4128&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>latex</category><category>开源工具</category><category>ctex</category><category>tex</category><pubDate>Sat, 17 Apr 2010 18:23:09 +0800</pubDate><author>admin</author><comments>http://www.yanjiuyanjiu.com/archives/4128#comments</comments><guid isPermaLink="false">http://www.yanjiuyanjiu.com/?p=4128</guid><dc:creator>admin</dc:creator><fs:srclink>http://www.yanjiuyanjiu.com/archives/4128</fs:srclink><fs:srcfeed>http://www.yanjiuyanjiu.com/feed</fs:srcfeed><fs:itemid>feedsky/soulmachine/~7298288/631829314/5411851</fs:itemid></item><item><title>Java 读写图像</title><link>http://www.yanjiuyanjiu.com/archives/4110</link><content:encoded>&lt;p&gt;Java中进行图像I/O（即读图片和写图片，不涉及到复杂图像处理）有三个方法：&lt;br /&gt;
1. Java Image I/O API，支持常见图片，从Java 2 version 1.4.0开始就内置了。&lt;br /&gt;
主页：&lt;a href=&quot;http://java.sun.com/javase/6/docs/technotes/guides/imageio/index.html&quot; target=&quot;_blank&quot;&gt;http://java.sun.com/javase/6/docs/technotes/guides/imageio/index.html&lt;/a&gt;&lt;br /&gt;
2. JAI 中的 Image I/O Tools，支持更多图片类型，例如JPEG-LS, JPEG2000, 和 TIFF。&lt;br /&gt;
主页：&lt;a href=&quot;https://jai-imageio.dev.java.net/&quot; target=&quot;_blank&quot;&gt;https://jai-imageio.dev.java.net/&lt;/a&gt;。JAI 是一个关于图像处理的框架，很庞大，&lt;br /&gt;
其中仅仅jai-imageio是关于图像I/O的，其他的可以不看。&lt;br /&gt;
3. JAI的com.sun.media.jai.codec 也有一定的图像解码能力&lt;/p&gt;
&lt;p&gt;当然，还有众多的java开源工具包可以读写图像，例如JIMI, JMagic等，但JDK目前本身能&lt;br /&gt;
够读写图片，就用JDK的，开发和部署方便，不需要额外下载jar包。&lt;/p&gt;
&lt;p&gt;由于JAI是Java新加入的，很多组件不是正式规范，JDK不自带，因此开发和部署需要额外&lt;br /&gt;
安装，安装文件在官网&lt;a href=&quot;https://jai.dev.java.net/&quot; target=&quot;_blank&quot;&gt;https://jai.dev.java.net/&lt;/a&gt;下载得到。&lt;/p&gt;
&lt;p&gt;如果你仅仅想读取常见格式的图片，不需要用JAI这么高级这么庞大的东西，&lt;br /&gt;
用Java Image I/O API即可。&lt;/p&gt;
&lt;p&gt;下面重点介绍 Java Image I/O API。&lt;/p&gt;
&lt;p&gt;Java Image I/O API 主要在 javax.imageio 下面。JDK已经内置了常见图片格式的插件，&lt;br /&gt;
但它提供了插件体系结构，第三方也可以开发插件支持其他图片格式。&lt;/p&gt;
&lt;p&gt;下面这段代码可以展示，JDK内置支持的图片格式。&lt;br /&gt;
import javax.imageio.*;&lt;br /&gt;
import java.util.Arrays;&lt;/p&gt;
&lt;p&gt;public class HelloWorld {&lt;br /&gt;
public static void main(String args[]) {&lt;br /&gt;
String readFormats[] = ImageIO.getReaderFormatNames();&lt;br /&gt;
String writeFormats[] = ImageIO.getWriterFormatNames();&lt;br /&gt;
System.out.println(“Readers:  ” + Arrays.asList(readFormats));&lt;br /&gt;
System.out.println(“Writers:  ” + Arrays.asList(writeFormats));&lt;br /&gt;
}&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;主页上有一个文档，&lt;a href=&quot;http://java.sun.com/javase/6/docs/technotes/guides/imageio/spec/title.fm.html&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;Java Image I/O API Guide&lt;/strong&gt;&lt;/a&gt;，很通俗易懂，可以让你快速上手。以下&lt;br /&gt;
内容主要来自这个文档的第3章。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第3章 编写图像I/O程序&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;3.1 读写图片&lt;/strong&gt;&lt;br /&gt;
javax.imageio.ImageIO类提供了一组静态方法进行最简单的图像I/O操作。&lt;br /&gt;
读取一个标准格式(GIF, PNG, or JPEG)的图片很简单：&lt;br /&gt;
File f = new File(“c:\images\myimage.gif”);&lt;br /&gt;
BufferedImage bi = ImageIO.read(f);&lt;/p&gt;
&lt;p&gt;Java Image I/O API 会自动探测图片的格式并调用对应的插件进行解码，当安装了一个新&lt;br /&gt;
插件，新的格式会被自动理解，程序代码不需要改变。&lt;/p&gt;
&lt;p&gt;写图片同样简单：&lt;br /&gt;
BufferedImage bi;&lt;br /&gt;
File f = new File(“c:\images\myimage.png”);&lt;br /&gt;
ImageIO.write(im, “png”, f);&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.2 更进一步&lt;/strong&gt;&lt;br /&gt;
上一节谈到的方法对于简单程序已经足够了。不过，Java Image I/O API 提供了为编写复&lt;br /&gt;
杂程序的能力。为了利用API的高级特性，应用程序应当直接使用类ImageReader 和&lt;br /&gt;
ImageWriter。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.3 ImageReader 类&lt;/strong&gt;&lt;br /&gt;
与其用ImageIO类来进行所有的解码操作，不如用ImageIO类去得到一个ImageReader对象，&lt;br /&gt;
再用这个对象去进行读操作：&lt;br /&gt;
Iterator readers = ImageIO.getImageReadersByFormatName(“gif”);&lt;br /&gt;
ImageReader reader = (ImageReader)readers.next();&lt;/p&gt;
&lt;p&gt;ImageReader对象也可以基于文件内容、文件后缀或MIME类型获得。这个用于查找和初始&lt;br /&gt;
化ImageReader对象的机制用到了javax.imageio.spi.ImageReaderSpi类，它可以在不用初&lt;br /&gt;
始化插件的情况下获得插件的信息。”service provider interfaces” (SPIs)将会在下一&lt;br /&gt;
章详细讨论。一旦获得了一个ImageReader对象，必须给它是指一个输入源。大部分&lt;br /&gt;
ImageReader对象可以从ImageInputStream类输入源读取数据，ImageInputStream是Image&lt;br /&gt;
I/O API定义的专用输入源。&lt;/p&gt;
&lt;p&gt;获得一个ImageInputStream 是简单的。给定一个File或InputStream，一个&lt;br /&gt;
ImageInputStream对象可以通过调用如下函数产生：&lt;br /&gt;
Object source; // File or InputStream&lt;br /&gt;
ImageInputStream iis = ImageIO.createImageInputStream(source);&lt;/p&gt;
&lt;p&gt;一旦有了输入源，可以把它与一个ImageReader对象关联起来：&lt;br /&gt;
reader.setInput(iis, true);&lt;/p&gt;
&lt;p&gt;如果输入源文件包含多张图片，而程序不保证按顺序读取时，第二个参数应该设置为&lt;br /&gt;
false。对于那些只允许存储一张图片的文件格式，永远传递true是合理的。&lt;/p&gt;
&lt;p&gt;当ImageReader对象有了输入源后，我们就可以获取图片信息而不用把整张图片数据都读入&lt;br /&gt;
内存。例如，调用reader.getImageWidth(0)可以让我们获得文件中第一张图片的宽度。一&lt;br /&gt;
个好的插件会试图解码文件的必要部分，去获得图片的宽度，而不用读取任何一个像素。&lt;/p&gt;
&lt;p&gt;为读取图片，可以调用reader.read(imageIndex), imageIndex是文件（当包含多张图片时）&lt;br /&gt;
中图片的索引。这与上一节调用ImageIO.read()产生的结果相同。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.3.1 ImageReadParam&lt;/strong&gt;&lt;br /&gt;
如果需要更多的控制，可以向read()方法传递一个ImageReadParam类型的参数。一个&lt;br /&gt;
ImageReadParam对象可以让程序更好的利用内存。它不仅允许指定一个感兴趣的区域，还&lt;br /&gt;
可以指定一个抽样因子，用于向下采样。&lt;/p&gt;
&lt;p&gt;例如，为了只解码图片的左上角的1/4，程序可以先获取一个合适的ImageReadParam对象：&lt;br /&gt;
ImageReadParam param = reader.getDefaultReadParam();&lt;/p&gt;
&lt;p&gt;接下来，指定图片区域：&lt;br /&gt;
import java.awt.Rectangle;&lt;br /&gt;
int imageIndex = 0;&lt;br /&gt;
int half_width = reader.getImageWidth(imageIndex)/2;&lt;br /&gt;
int half_height = reader.getImageHeight(imageIndex)/2;&lt;br /&gt;
Rectangle rect = new Rectangle(0, 0, half_width, half_height);&lt;br /&gt;
param.setSourceRegion(rect);&lt;/p&gt;
&lt;p&gt;最后，读取图片：&lt;br /&gt;
BufferedImage bi = reader.read(imageIndex, param);&lt;/p&gt;
&lt;p&gt;结果是一张新图片，宽和高都只有原图片的一半。&lt;/p&gt;
&lt;p&gt;另一个例子，为了读取每三个像素中的一个，产生一个原图片1/9大小的图片，可以用&lt;br /&gt;
ImageReadParam指定抽样因子：&lt;br /&gt;
param = reader.getDefaultImageParam();&lt;br /&gt;
param.setSourceSubsampling(3, 3, 0, 0);&lt;br /&gt;
BufferedImage bi3 = reader.read(0, param);&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.3.2 IIOParamController&lt;/strong&gt;&lt;br /&gt;
插件有时会提供一个IIOParamController类，这是可选的。略。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.3.3 读多图片文件&lt;/strong&gt;&lt;br /&gt;
ImageReader 中所有与图片打交道的方法都有一个imageIndex 参数，这个参数用于读取多&lt;br /&gt;
图片文件中的一张。&lt;/p&gt;
&lt;p&gt;ImageReader.getNumImages()返回多图片文件中的图片个数。这个方法有一个boolean参数，&lt;br /&gt;
allowSearch。有的图片格式，典型的GIF，没有提供任何获取文件中的图片个数方法，除&lt;br /&gt;
非读取整个进行解析。这样代价很高，因此设置allowSearch为false可以让方法直接返回&lt;br /&gt;
-1，而不是实际的图片个数。如果此参数是true，则该方法总会返回文件中实际的图片个&lt;br /&gt;
数。&lt;/p&gt;
&lt;p&gt;即使在不知道文件中图片个数的情况下，仍可以调用read(imageIndex); 如果索引值过大，&lt;br /&gt;
该方法会抛出IndexOutOfBoundsException异常。因此，程序可以递增索引去获取图片，&lt;br /&gt;
直到异常。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.3.4 读缩略图 &lt;/strong&gt;&lt;br /&gt;
有的图片格式允许一个（或多个）小的预览图，与主图片一起存储在文件中。这些&lt;br /&gt;
“缩略图”对于快速识别图片很有用，不用解码整个图片。&lt;/p&gt;
&lt;p&gt;程序可以调用如下代码，探测一张图片有多少张缩略图：&lt;br /&gt;
reader.getNumThumbnails(imageIndex);&lt;/p&gt;
&lt;p&gt;如果存在缩略图，可以调用如下代码获取：&lt;br /&gt;
int thumbailIndex = 0;&lt;br /&gt;
BufferedImage bi;&lt;br /&gt;
bi = reader.readThumbnail(imageIndex, thumbnailIndex);&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.4 ImageWriter 类 &lt;/strong&gt;&lt;br /&gt;
就像我们可以用ImageIO 的一个方法获取某种图片格式的ImageReader对象一样，我们也可&lt;br /&gt;
以获取ImageWriter对象：&lt;br /&gt;
Iterator writers = ImageIO.getImageWritersByFormatName(“png”);&lt;br /&gt;
ImageWriter writer = (ImageWriter)writers.next();&lt;/p&gt;
&lt;p&gt;一旦获取了一个ImageWriter对象，必须给它设置一个输出源ImageOutputStream。&lt;br /&gt;
File f = new File(“c:\images\myimage.png”);&lt;br /&gt;
ImageOutputStream ios = ImageIO.createImageOutputStream(f);&lt;br /&gt;
writer.setOutput(ios);&lt;/p&gt;
&lt;p&gt;最后，可以把图片写入到输出源：&lt;br /&gt;
BufferedImage bi;&lt;br /&gt;
writer.write(bi);&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.4.1 写多图片文件&lt;/strong&gt;&lt;br /&gt;
IIOImage类用于存储图片，缩略图或元信息的引用。下一节将讨论Metadata，目前，我们&lt;br /&gt;
简单地给Metadata相关参数传递null。&lt;br /&gt;
ImageWriter 类有一个方法write()，用于从IIOImage创建一个新文件，还有一个方法&lt;br /&gt;
writeInsert()，用于向一个已存在文件添加一个IIOImage对象。通过调用这两者，可以创&lt;br /&gt;
建一个多图片文件：&lt;br /&gt;
BufferedImage first_bi, second_bi;&lt;br /&gt;
IIOImage first_IIOImage = new IIOImage(first_bi, null, null);&lt;br /&gt;
IIOImage second_IIOImage = new IIOImage(second_bi, null, null);&lt;br /&gt;
writer.write(null, first_IIOImage, null);&lt;br /&gt;
if (writer.canInsertImage(1)) {&lt;br /&gt;
writer.writeInsert(1, second_IIOImage, null);&lt;br /&gt;
} else {&lt;br /&gt;
System.err.println(“Writer can&amp;#8217;t append a second image!”);&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.5  处理 Metadata &lt;/strong&gt;&lt;br /&gt;
所有与像素无关的信息，都属于在Metadata。javax.imageio.metadata 包含了用于访问&lt;br /&gt;
Metadata的类和接口。&lt;/p&gt;
&lt;p&gt;Image I/O API 将stream metadata 和image metadata区别对待。stream metadata与一个&lt;br /&gt;
文件中存储了多张图片有关，image metadata只与单个图片有关。如果一个文件只包含一张&lt;br /&gt;
图片，那么就只存在image metadata。&lt;/p&gt;
&lt;p&gt;可以通过调用ImageReader.getStreamMetadata 和 getImageMetadata(int imageIndex)来&lt;br /&gt;
获取metadata。这些方法会返回一个实现了IIOMetadata接口的对象，该对象会被向上转化&lt;br /&gt;
为ImageReader类型，&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.6 编码转换&lt;/strong&gt;&lt;br /&gt;
略&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.7 事件监听&lt;/strong&gt;&lt;br /&gt;
略&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/631829315/soulmachine/feedsky/s.gif?r=http://www.yanjiuyanjiu.com/archives/4110&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.yanjiuyanjiu.com/archives/4110/feed</wfw:commentRss><slash:comments>0</slash:comments><description>Java中进行图像I/O（即读图片和写图片，不涉及到复杂图像处理）有三个方法： 1. Java Image I/O API，支持常见图片，从Java 2 version 1.4.0开始就内置了。 主页：http://java.sun.com/javase/6/docs/technotes/guides/imageio/index.html 2. JAI 中的 Image I/O Tools，支持更多图片类型，例如JPEG-LS, JPEG2000, 和 TIFF。 主页：https://jai-imageio.dev.java.net/。JAI 是一个关于图像处理的框架，很庞大， 其中仅仅jai-imageio是关于图像I/O的，其他的可以不看。 3. JAI的com.sun.media.jai.codec 也有一定的图像解码能力 当然，还有众多的java开源工具包可以读写图像，例如JIMI, JMagic等，但JDK目前本身能 够读写图片，就用JDK的，开发和部署方便，不需要额外下载jar包。 由于JAI是Java新加入的，很多组件不是正式规范，JDK不自带，因此开发和部署需要额外 安装，安装文件在官网https://jai.dev.java.net/下载得到。 如果你仅仅想读取常见格式的图片，不需要用JAI这么高级这么庞大的东西， 用Java Image I/O API即可。 下面重点介绍 Java Image I/O API。 Java Image I/O API 主要在 javax.imageio 下面。JDK已经内置了常见图片格式的插件， 但它提供了插件体系结构，第三方也可以开发插件支持其他图片格式。 下面这段代码可以展示，JDK内置支持的图片格式。 import javax.imageio.*; import java.util.Arrays; public class [...]&lt;img src=&quot;http://www1.feedsky.com/t1/631829315/soulmachine/feedsky/s.gif?r=http://www.yanjiuyanjiu.com/archives/4110&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>开源工具</category><category>image</category><pubDate>Thu, 01 Apr 2010 12:08:07 +0800</pubDate><author>admin</author><comments>http://www.yanjiuyanjiu.com/archives/4110#comments</comments><guid isPermaLink="false">http://www.yanjiuyanjiu.com/?p=4110</guid><dc:creator>admin</dc:creator><fs:srclink>http://www.yanjiuyanjiu.com/archives/4110</fs:srclink><fs:srcfeed>http://www.yanjiuyanjiu.com/feed</fs:srcfeed><fs:itemid>feedsky/soulmachine/~7298288/631829315/5411851</fs:itemid></item><item><title>Java质量检测评估工具</title><link>http://www.yanjiuyanjiu.com/archives/4102</link><content:encoded>&lt;p&gt;Java代码质量检测评估工具&lt;br /&gt;
“五大” 代码分析领域：&lt;br /&gt;
* 编码风格&lt;br /&gt;
* 冗余代码&lt;br /&gt;
* 代码覆盖率&lt;br /&gt;
* 依赖项分析&lt;br /&gt;
* 复杂度监控&lt;/p&gt;
&lt;p&gt;一下列举了一些目前比较流行的工具。网址后面列出了其PR值，可以反映此工具的流行度。&lt;br /&gt;
1、编码风格&lt;br /&gt;
CheckStyle&lt;br /&gt;
Home page: &lt;a href=&quot;http://checkstyle.sourceforge.net/&quot; target=&quot;_blank&quot;&gt;http://checkstyle.sourceforge.net/&lt;/a&gt; (6)&lt;br /&gt;
对应的eclipse插件有多个，其中eclipsecs最常用&lt;br /&gt;
Home page: &lt;a href=&quot;http://eclipse-cs.sourceforge.net/&quot; target=&quot;_blank&quot;&gt;http://eclipse-cs.sourceforge.net/&lt;/a&gt; (6)&lt;br /&gt;
eclipse插件URL：&lt;a href=&quot;http://eclipse-cs.sf.net/update/&quot; target=&quot;_blank&quot;&gt;http://eclipse-cs.sf.net/update/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2、冗余代码&lt;br /&gt;
Simian &lt;a href=&quot;http://www.redhillconsulting.com.au/products/simian/&quot; target=&quot;_blank&quot;&gt;http://www.redhillconsulting.com.au/products/simian/&lt;/a&gt; (5)&lt;br /&gt;
PMD 的 CPD &lt;a href=&quot;http://pmd.sourceforge.net/cpd.html&quot; target=&quot;_blank&quot;&gt;http://pmd.sourceforge.net/cpd.html&lt;/a&gt; (5)&lt;/p&gt;
&lt;p&gt;3、代码覆盖率&lt;br /&gt;
EMMA  &lt;a href=&quot;http://emma.sourceforge.net/&quot; target=&quot;_blank&quot;&gt;http://emma.sourceforge.net/&lt;/a&gt; (6)&lt;br /&gt;
Cobertura  &lt;a href=&quot;http://cobertura.sourceforge.net/&quot; target=&quot;_blank&quot;&gt;http://cobertura.sourceforge.net/&lt;/a&gt; (6)&lt;br /&gt;
EclEmma &lt;a href=&quot;http://update.eclemma.org/&quot; target=&quot;_blank&quot;&gt;http://update.eclemma.org/&lt;/a&gt; (5)&lt;br /&gt;
Coverlipse &lt;a href=&quot;http://coverlipse.sourceforge.net/&quot; target=&quot;_blank&quot;&gt;http://coverlipse.sourceforge.net/&lt;/a&gt; (3)&lt;/p&gt;
&lt;p&gt;4、依赖项分析&lt;br /&gt;
JDepend &lt;a href=&quot;http://clarkware.com/software/JDepend.html&quot; target=&quot;_blank&quot;&gt;http://clarkware.com/software/JDepend.html&lt;/a&gt; (6)&lt;/p&gt;
&lt;p&gt;5、复杂度监控&lt;br /&gt;
Metrics &lt;a href=&quot;http://metrics.sourceforge.net/&quot; target=&quot;_blank&quot;&gt;http://metrics.sourceforge.net/&lt;/a&gt; (4)&lt;/p&gt;
&lt;p&gt;具有以上两项或两项以上的综合工具（也称为静态分析工具）：&lt;br /&gt;
1、PMD&lt;br /&gt;
Home page: &lt;a href=&quot;http://pmd.sourceforge.net/cpd.html&quot; target=&quot;_blank&quot;&gt;http://pmd.sourceforge.net/&lt;/a&gt; (6)&lt;br /&gt;
eclipse插件URL：&lt;a href=&quot;http://pmd.sourceforge.net/eclipse&quot; target=&quot;_blank&quot;&gt;http://pmd.sourceforge.net/eclipse&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2、FindBugs &lt;a href=&quot;http://findbugs.sourceforge.net/&quot; target=&quot;_blank&quot;&gt;http://findbugs.sourceforge.net/&lt;/a&gt; (6)&lt;br /&gt;
eclipse插件URL：&lt;a href=&quot;http://findbugs.cs.umd.edu/eclipse&quot; target=&quot;_blank&quot;&gt;http://findbugs.cs.umd.edu/eclipse&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;FindBugs 检查程序生成的class文件，即分析字节码&lt;br /&gt;
PMD 检查源码，分析源代码&lt;/p&gt;
&lt;p&gt;3、Jtest &lt;a href=&quot;http://www.parasoft.com/jtest&quot; target=&quot;_blank&quot;&gt;http://www.parasoft.com/jtest&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;4、Jlint &lt;a href=&quot;http://artho.com/jlint/&quot; target=&quot;_blank&quot;&gt;http://artho.com/jlint/&lt;/a&gt; (5)&lt;/p&gt;
&lt;p&gt;5、Lint4j &lt;a href=&quot;http://www.jutils.com/&quot; target=&quot;_blank&quot;&gt;http://www.jutils.com/&lt;/a&gt; (4)&lt;/p&gt;
&lt;p&gt;参考资料：&lt;a href=&quot;http://blog.csdn.net/cb_121/archive/2009/05/22/4208792.aspx&quot; target=&quot;_blank&quot;&gt;http://blog.csdn.net/cb_121/archive/2009/05/22/4208792.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;我个人平时最常用的是Checkstyle，其次是PMD，读者可以参考一下。&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/631829316/soulmachine/feedsky/s.gif?r=http://www.yanjiuyanjiu.com/archives/4102&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.yanjiuyanjiu.com/archives/4102/feed</wfw:commentRss><slash:comments>0</slash:comments><description>Java代码质量检测评估工具 “五大” 代码分析领域： * 编码风格 * 冗余代码 * 代码覆盖率 * 依赖项分析 * 复杂度监控 一下列举了一些目前比较流行的工具。网址后面列出了其PR值，可以反映此工具的流行度。 1、编码风格 CheckStyle Home page: http://checkstyle.sourceforge.net/ (6) 对应的eclipse插件有多个，其中eclipsecs最常用 Home page: http://eclipse-cs.sourceforge.net/ (6) eclipse插件URL：http://eclipse-cs.sf.net/update/ 2、冗余代码 Simian http://www.redhillconsulting.com.au/products/simian/ (5) PMD 的 CPD http://pmd.sourceforge.net/cpd.html (5) 3、代码覆盖率 EMMA  http://emma.sourceforge.net/ (6) Cobertura  http://cobertura.sourceforge.net/ (6) EclEmma http://update.eclemma.org/ (5) Coverlipse http://coverlipse.sourceforge.net/ (3) 4、依赖项分析 JDepend http://clarkware.com/software/JDepend.html (6) 5、复杂度监控 Metrics http://metrics.sourceforge.net/ [...]&lt;img src=&quot;http://www1.feedsky.com/t1/631829316/soulmachine/feedsky/s.gif?r=http://www.yanjiuyanjiu.com/archives/4102&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>开源工具</category><category>QA</category><pubDate>Wed, 31 Mar 2010 17:17:02 +0800</pubDate><author>admin</author><comments>http://www.yanjiuyanjiu.com/archives/4102#comments</comments><guid isPermaLink="false">http://www.yanjiuyanjiu.com/?p=4102</guid><dc:creator>admin</dc:creator><fs:srclink>http://www.yanjiuyanjiu.com/archives/4102</fs:srclink><fs:srcfeed>http://www.yanjiuyanjiu.com/feed</fs:srcfeed><fs:itemid>feedsky/soulmachine/~7298288/631829316/5411851</fs:itemid></item><item><title>使用pdfbox 抽取PDF文件中的文本</title><link>http://www.yanjiuyanjiu.com/archives/4090</link><content:encoded>&lt;pre&gt;&lt;strong&gt;&lt;/strong&gt;[code lang=&quot;java&quot;]
package com.yanjiuyanjiu.search;

import java.io.File;
import java.io.IOException;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.util.PDFTextStripper;

/**
 * 抽去PDF文件中的文本.
 * @author soulmachine
 *
 */
public final class PDFboxTest {
 /** 禁止创建对象. */
 private PDFboxTest() {
 }
 /**
 * 抽取PDF中的文本.
 * @param f PDF文件
 * @return PDF对应的文本字符串
 */
 public static String getText(final File f) {
 String text = &amp;quot;&amp;quot;;
 try {
 PDDocument pdfdocument = PDDocument.load(f);
 PDFTextStripper stripper = new PDFTextStripper();
 stripper.setStartPage(1); // 只抽取第1页和第2页
 stripper.setEndPage(2);
 text = stripper.getText(pdfdocument);
 pdfdocument.close();

 } catch (IOException e) {
 e.printStackTrace();
 }

 return text;
 }

 /** 测试.
 *
 * @param args PDF文件路径
 */
 public static void main(final String[]  args) {
 File file = new File(args[0]);
 System.out.println(PDFboxTest.getText(file));
 }
}

[/code]

&lt;strong&gt;&lt;a href=&quot;upload/PDFExtractor.zip&quot; target=&quot;_blank&quot;&gt;eclipse工程文件下载&lt;/a&gt;&lt;/strong&gt;
&lt;/pre&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/631829317/soulmachine/feedsky/s.gif?r=http://www.yanjiuyanjiu.com/archives/4090&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.yanjiuyanjiu.com/archives/4090/feed</wfw:commentRss><slash:comments>0</slash:comments><description>[code lang=&quot;java&quot;] package com.yanjiuyanjiu.search; import java.io.File; import java.io.IOException; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.util.PDFTextStripper; /** * 抽去PDF文件中的文本. * @author soulmachine * */ public final class PDFboxTest { /** 禁止创建对象. */ private PDFboxTest() { } /** * 抽取PDF中的文本. * @param f PDF文件 * @return PDF对应的文本字符串 */ public static String getText(final File f) { String text = &amp;#34;&amp;#34;; try [...]&lt;img src=&quot;http://www1.feedsky.com/t1/631829317/soulmachine/feedsky/s.gif?r=http://www.yanjiuyanjiu.com/archives/4090&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>开源工具</category><category>pdfbox</category><pubDate>Sun, 28 Mar 2010 19:54:03 +0800</pubDate><author>admin</author><comments>http://www.yanjiuyanjiu.com/archives/4090#comments</comments><guid isPermaLink="false">http://www.yanjiuyanjiu.com/?p=4090</guid><dc:creator>admin</dc:creator><fs:srclink>http://www.yanjiuyanjiu.com/archives/4090</fs:srclink><fs:srcfeed>http://www.yanjiuyanjiu.com/feed</fs:srcfeed><fs:itemid>feedsky/soulmachine/~7298288/631829317/5411851</fs:itemid></item><item><title>java命令行下运行class文件</title><link>http://www.yanjiuyanjiu.com/archives/4072</link><content:encoded>&lt;p&gt;今天碰到了一个很变态的问题，写了一个很简单的HelloWord.java，内容如下：&lt;br /&gt;
package com.yanjiuyanjiu;&lt;/p&gt;
&lt;p&gt;public class HelloWorld {&lt;br /&gt;
public static void main(String args[]) {&lt;br /&gt;
System.out.println(“Hello World!”);&lt;br /&gt;
}&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;在eclipse中运行是可以的，但是在命令行下运行总是失败。我的工程位置为 d:\workspace\HelloWorld\。&lt;/p&gt;
&lt;p&gt;尝试了很多次，如下&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #808080;&quot;&gt;d:\workspace\HelloWorld\bin\com\yanjiuyanjiu\&amp;gt;java HelloWorld&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #808080;&quot;&gt;Exception in thread “main” java.lang.NoClassDefFoundError: HelloWorld (wrong name: com/yanjiuyanjiu/HelloWorld)&lt;br /&gt;
at java.lang.ClassLoader.defineClass1(Native Method)&lt;br /&gt;
at java.lang.ClassLoader.defineClassCond(Unknown Source)&lt;br /&gt;
at java.lang.ClassLoader.defineClass(Unknown Source)&lt;br /&gt;
at java.security.SecureClassLoader.defineClass(Unknown Source)&lt;br /&gt;
at java.net.URLClassLoader.defineClass(Unknown Source)&lt;br /&gt;
at java.net.URLClassLoader.access$000(Unknown Source)&lt;br /&gt;
at java.net.URLClassLoader$1.run(Unknown Source)&lt;br /&gt;
at java.security.AccessController.doPrivileged(Native Method)&lt;br /&gt;
at java.net.URLClassLoader.findClass(Unknown Source)&lt;br /&gt;
at java.lang.ClassLoader.loadClass(Unknown Source)&lt;br /&gt;
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)&lt;br /&gt;
at java.lang.ClassLoader.loadClass(Unknown Source)&lt;br /&gt;
Could not find the main class: HelloWorld.  Program will exit.&lt;br /&gt;
Exception in thread “main”&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #808080;&quot;&gt;d:\workspace\HelloWorld\bin\com\yanjiuyanjiu\&amp;gt;java -classpath .; HelloWorld&lt;br /&gt;
Exception in thread “main” java.lang.NoClassDefFoundError: HelloWorld (wrong name: com/yanjiuyanjiu/HelloWorld)&lt;br /&gt;
at java.lang.ClassLoader.defineClass1(Native Method)&lt;br /&gt;
at java.lang.ClassLoader.defineClassCond(Unknown Source)&lt;br /&gt;
at java.lang.ClassLoader.defineClass(Unknown Source)&lt;br /&gt;
at java.security.SecureClassLoader.defineClass(Unknown Source)&lt;br /&gt;
at java.net.URLClassLoader.defineClass(Unknown Source)&lt;br /&gt;
at java.net.URLClassLoader.access$000(Unknown Source)&lt;br /&gt;
at java.net.URLClassLoader$1.run(Unknown Source)&lt;br /&gt;
at java.security.AccessController.doPrivileged(Native Method)&lt;br /&gt;
at java.net.URLClassLoader.findClass(Unknown Source)&lt;br /&gt;
at java.lang.ClassLoader.loadClass(Unknown Source)&lt;br /&gt;
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)&lt;br /&gt;
at java.lang.ClassLoader.loadClass(Unknown Source)&lt;br /&gt;
Could not find the main class: HelloWorld.  Program will exit.&lt;br /&gt;
Exception in thread “main”&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #808080;&quot;&gt;d:\workspace\HelloWorld\bin\com\yanjiuyanjiu\&amp;gt;cd..&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #808080;&quot;&gt;d:\workspace\HelloWorld\bin\com\&amp;gt;cd..&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #808080;&quot;&gt;d:\workspace\HelloWorld\bin\&amp;gt;java -classpath .; com/yanjiuyanjiu/HelloWorld    &lt;span style=&quot;color: #ff0000;&quot;&gt;只有这个成功&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #808080;&quot;&gt;Hello World!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #808080;&quot;&gt;d:\workspace\HelloWorld\bin\&amp;gt;java -classpath .; com\yanjiuyanjiu\HelloWorld    &lt;span style=&quot;color: #ff0000;&quot;&gt;换了个斜杠就不行了&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #808080;&quot;&gt;Exception in thread “main” java.lang.NoClassDefFoundError: com\yanjiuyanjiu\HelloWorld (wrong name: com/yanjiuyanjiu/HelloWorld)&lt;br /&gt;
at java.lang.ClassLoader.defineClass1(Native Method)&lt;br /&gt;
at java.lang.ClassLoader.defineClassCond(Unknown Source)&lt;br /&gt;
at java.lang.ClassLoader.defineClass(Unknown Source)&lt;br /&gt;
at java.security.SecureClassLoader.defineClass(Unknown Source)&lt;br /&gt;
at java.net.URLClassLoader.defineClass(Unknown Source)&lt;br /&gt;
at java.net.URLClassLoader.access$000(Unknown Source)&lt;br /&gt;
at java.net.URLClassLoader$1.run(Unknown Source)&lt;br /&gt;
at java.security.AccessController.doPrivileged(Native Method)&lt;br /&gt;
at java.net.URLClassLoader.findClass(Unknown Source)&lt;br /&gt;
at java.lang.ClassLoader.loadClass(Unknown Source)&lt;br /&gt;
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)&lt;br /&gt;
at java.lang.ClassLoader.loadClass(Unknown Source)&lt;br /&gt;
Could not find the main class: com\yanjiuyanjiu\HelloWorld.  Program will exit.&lt;br /&gt;
Exception in thread “main”&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #808080;&quot;&gt;d:\workspace\HelloWorld\bin\&amp;gt;java -classpath ./com/yanjiuyanjiu/; HelloWorld&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #808080;&quot;&gt;Exception in thread “main”java.lang.NoClassDefFoundError: HelloWorld (wrong name: com/yanjiuyanjiu/HelloWorld)&lt;br /&gt;
at java.lang.ClassLoader.defineClass1(Native Method)&lt;br /&gt;
at java.lang.ClassLoader.defineClassCond(Unknown Source)&lt;br /&gt;
at java.lang.ClassLoader.defineClass(Unknown Source)&lt;br /&gt;
at java.security.SecureClassLoader.defineClass(Unknown Source)&lt;br /&gt;
at java.net.URLClassLoader.defineClass(Unknown Source)&lt;br /&gt;
at java.net.URLClassLoader.access$000(Unknown Source)&lt;br /&gt;
at java.net.URLClassLoader$1.run(Unknown Source)&lt;br /&gt;
at java.security.AccessController.doPrivileged(Native Method)&lt;br /&gt;
at java.net.URLClassLoader.findClass(Unknown Source)&lt;br /&gt;
at java.lang.ClassLoader.loadClass(Unknown Source)&lt;br /&gt;
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)&lt;br /&gt;
at java.lang.ClassLoader.loadClass(Unknown Source)&lt;br /&gt;
Could not find the main class: HelloWorld.  Program will exit.&lt;br /&gt;
Exception in thread “main”&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;在网上搜索了大半天，大部分说是环境 变量，classpath或JDK 版本的问题，还有执行时文件名 class后缀不要。我一一试过，都没有解决。最后无意中换了一下命令符的位置，成功了。总结如下：&lt;br /&gt;
1. 环境变量，CLASSPATH当然要设置好，执行时不要带class后缀；&lt;br /&gt;
2. 路径中的斜杠用“/”而不是“\”；&lt;br /&gt;
3. 命令符的当前目录要在包的起点。比如这里应该在 d:\workspace\HelloWorld\bin\&amp;gt;，如果在 d:\workspace\HelloWorld\bin\com\yanjiuyanjiu\&amp;gt;，反而不行，有点“近水楼台不得月”的意思，不知 道为什么，还请高手解释一下。&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/631829318/soulmachine/feedsky/s.gif?r=http://www.yanjiuyanjiu.com/archives/4072&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.yanjiuyanjiu.com/archives/4072/feed</wfw:commentRss><slash:comments>3</slash:comments><description>今天碰到了一个很变态的问题，写了一个很简单的HelloWord.java，内容如下： package com.yanjiuyanjiu; public class HelloWorld { public static void main(String args[]) { System.out.println(“Hello World!”); } } 在eclipse中运行是可以的，但是在命令行下运行总是失败。我的工程位置为 d:\workspace\HelloWorld\。 尝试了很多次，如下 d:\workspace\HelloWorld\bin\com\yanjiuyanjiu\&amp;#62;java HelloWorld Exception in thread “main” java.lang.NoClassDefFoundError: HelloWorld (wrong name: com/yanjiuyanjiu/HelloWorld) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(Unknown Source) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$000(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) [...]&lt;img src=&quot;http://www1.feedsky.com/t1/631829318/soulmachine/feedsky/s.gif?r=http://www.yanjiuyanjiu.com/archives/4072&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>语言与算法</category><pubDate>Mon, 15 Feb 2010 16:16:10 +0800</pubDate><author>admin</author><comments>http://www.yanjiuyanjiu.com/archives/4072#comments</comments><guid isPermaLink="false">http://www.yanjiuyanjiu.com/archives/4072.html</guid><dc:creator>admin</dc:creator><fs:srclink>http://www.yanjiuyanjiu.com/archives/4072</fs:srclink><fs:srcfeed>http://www.yanjiuyanjiu.com/feed</fs:srcfeed><fs:itemid>feedsky/soulmachine/~7298288/631829318/5411851</fs:itemid></item></channel></rss>
