《信息检索》大作业1、2:建立索引、检索、查询扩展、系统评估

源代码下载:https://github.com/houseyoung/IR-Homework1-2

作业一:索引的建立
1、切词及词频统计:利用已提供的海量智能分词软件(代码中使用的是庖丁解牛Paoding Analyzer)对文档进行切词处理,并进行词频统计,形成DocIndex文件,结构为:文档号、频率、词。
2、分配词权重:采用词频标准化tfi=tfi/Max(tf)tf*idf两种方式分配词的权重。由DocIndex文件生成DocIndex(tf)DocIndex(tf*idf)文件。注意阈值的确定,词的取舍。
3、形成倒置文档:将DocIndex(tf)DocIndex(tf*idf)文件转换为DocInvert(tf)DocInvert (tf*idf)文件。

作业二:检索及评估系统
1、Query处理(与文档处理采用相同方法:切词,选择关键词等)。
2、用VSM(向量空间模型)方法,计算一个查询与一个文档集合中各文档的相似度,并排序输出结果(对问题1020输出详细结果,其他问题只记录文档排序即可)
3、应用查询扩展方法对Query处理后,对同一问题再次进行检索,并排序输出结果(对问题1020输出详细结果,其他问题只记录文档排序即可)
4、应用MRR(Mean Reciprocal Rank)方法,计算系统的MRR值。

使用Nginx等反向代理时如何从Request中获取客户端真实IP地址

在Java Web项目中,若想获取客户端的IP地址,最简单的方式便是使用HttpServletRequest中的getRemoteAddr()方法。但若使用该方法进行获取,一旦项目经过了反向代理(如Nginx),则获取到的IP地址是反向代理服务器的IP地址,而非客户端的真实IP地址。

在使用Nginx做反向代理的情况下,若想获取到客户端的真实IP地址,首先要保证Nginx的配置文件中有proxy_set_header X-Real-IP $remote_addr; 这一句。然后使用HttpServletRequest中的getHeader("X-Real-IP")方法,获取HTTP请求头中"X-Real-IP"中的内容,该内容即为客户端的真实IP地址。

代码样例如下:

// 访问者的IP地址(若未经过反向代理,则该地址为真实的访问者IP地址,否则为反向代理服务器的IP地址)
String customerIp = httpServletRequest.getRemoteAddr();
// 访问者的真实IP地址(若经过反向代理,则该地址为真实的访问者IP地址,否则为空)
String xRealIp = httpServletRequest.getHeader("X-Real-IP");
// 若存在X-Real-IP,则用X-Real-IP作为访问者的IP地址
if (xRealIp != null && !"".equals(xRealIp)) {
 customerIp = xRealIp;
}

蚁群算法解决TSP问题的Java实现(带图形用户界面)

截图:
TSP

源代码下载:https://github.com/houseyoung/TSP

算法主要基于杨剑峰《蚁群算法及其应用研究》论文第3.2~3.4节中的“基本蚁群算法”。代码基于http://blog.csdn.net/wangqiuyun/article/details/8878298进行改进。图形用户界面使用Swing编写。

TSP数据提供了ATT48(美国本土48州首府)、CHN31(中国大陆31省省会)、CHN144(中国144个主要城市)三种。读者可自行根据格式更换不同的测试数据。

注:GUI部分使用IntelliJ IDEA自带的GUI Form创建,有网友测试发现在Eclipse中无法正确执行。

在Mac下安装Common Lisp运行环境(SBCL + Emacs + SLIME)

安装SBCL

SBCL(Steel Bank Common Lisp)是一个开源的Common Lisp编译器,安装方法如下:

1.进入http://www.sbcl.org/platform-table.html,下载相应的版本。
2.将下载下来的.tar.bz2文件解压缩。
3.在终端中进入上一步解压缩得到的文件夹。
4.执行如下指令:

sh install.sh

安装完毕后,我们在终端中执行sbcl,就可以执行Common Lisp指令了。不过,sbcl自带的编辑器功能较弱,因而我们一般使用Emacs+Slime来作为IDE。

安装Homebrew

OS X自带Emacs,然而这个Emacs的版本过低,因而我们需要更新它,我们可以借助Homebrew来更新Emacs。

Homebrew是一个Mac下的包管理器,类似于CentOS下的yum、Ubuntu下的apt-get。

Homebrew的安装方法非常简单,进入官网:http://brew.sh/index_zh-cn.html,将指令复制到终端中,执行即可。

更新Emacs

使用Homebrew更新Emacs非常简单,在终端中执行如下指令即可:

brew install emacs –HEAD –use-git-head –cocoa –with-gnutls

安装SLIME

SLIME(The Superior Lisp Interaction Mode for Emacs)是Emacs下的Lisp开发插件,安装方法如下:

1.进入https://github.com/slime/slime,将Slime下载下来。
2.将下载的zip包解压缩,将解压缩得到的目录复制到~/.emacs.d目录下(若该目录不存在,需在终端中执行mkdir ~/.emacs.d指令创建该目录)
3.配置Emacs的配置文件。编辑~/.emacs(若该文件不存在,需在终端中执行touch ~/.emacs指令创建该文件),添加如下内容:

(setq inferior-lisp-program "/usr/local/bin/sbcl")
(add-to-list 'load-path "~/.emacs.d/slime/")
(require 'slime)
(slime-setup)

保存后,在终端中运行emacs,按下M-x(在Mac下即为Option-x),输入slime,编辑器底部显示“Swank started at port: XXXXX.”后,就可以在Emacs中进行Common Lisp开发了。

使用WebSocket导致jUnit单元测试报No suitable default RequestUpgradeStrategy found错误的解决方法

若在SpringMVC项目中使用了WebSocket,在运行jUnit单元测试时,可能会报如下错误:

Caused by: java.lang.IllegalStateException: No suitable default RequestUpgradeStrategy found

若出现上述异常,在Maven的pom.xml中添加如下依赖,问题即可解决:

<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-websocket</artifactId>
<version>7.0.52</version>
<scope>test</scope>
</dependency>

Reference:
StackOverflow

基于JavaFX的2048游戏

游戏截图 | Game screenshot

Gui2048

源代码 | Source code

https://github.com/houseyoung/Gui2048

如何运行本游戏 | How to run this game

1.在命令提示符(Windows)/终端(OS X或Linux)中进入src目录。
2.执行javac *.java
3.执行java Gui2048 (可在本命令后附加一些参数,详情见下文。)

1.Open src folder in Command Prompt(Windows)/Terminal(OS X or Linux).
2.Execute javac *.java
3.Execute java Gui2048 (You can add some command line arguments after this command, see below for details.)

如何玩本游戏 | How to play this game

方向键 -> 控制方块移动。
s键 -> 保存游戏。
u键 -> 撤销移动。只可撤销一步。
r键 -> 将所有方块顺时针移动。

Arrow keys -> Move the tiles.
"s" key -> Save the board.
"u" key -> Undo. User can only do undo once at a time.
"r" key -> Rotates the board by 90 degrees clockwise.

命令行参数 | Command line arguments

-s [size] -> 设置游戏的维数。若不使用该参数,游戏维数默认为4x4。
-i [file] -> 从保存的文件中读取游戏。当-i与-s参数同时存在时,-s参数不起作用,游戏采用保存的文件中定义的维度。
-o [file] -> 设置保存游戏时存储的文件名。若不使用该参数,默认使用"2048.board"存储。

-s [size] -> Specifies the size of the 2048 board, the default size is 4.
-i [file] -> Specifies a 2048 board that should be loaded. If both -s and -i are used, then the size of the board will be determined by the input file.
-o [file] -> Specifies a file that should be used to save the 2048 board. If none specified then the default "2048.board" file will be used.

启动Linux时报unknown filesystem错误的解决方法

1、执行ls命令,查看当前一共有几个分区。一般会返回类似如下的文字:

(hd0) (hd0,msdos3) (hd0,msdos2) (hd0,msdos1)

2、由于我们不知道哪一个是Linux分区,所以此时只能一个个进行尝试。
执行ls (hd0,msdosX)/,如果该分区不是Linux分区,会返回unknown filesystem,循环执行这个指令,直到返回出分区包含的内容而不是unknown filesystem

3、查看这个分区的内容,找到grub目录所在的位置(一般是grub/或boot/grub)

4、依次执行如下命令:
set root=第2步找到的分区号,例如set root=hd0,msdos3
set prefix=(第2步找到的分区号)/第3步找到的目录
,例如set prefix=(hd0,msdos3)/grub

5、执行insmod normal,若不报错,则证明我们找到了正确的分区,再执行normal,就可以进入grub的引导界面了。

6、我们之前的操作只是临时的修复,重启后仍会报错,所以进入Linux后,应当修复grub引导。进入终端,依次执行如下指令:
sudo update-grub
sudo grub-install /dev/sda

注:/dev/sda是Liunx安装磁盘的地址

一个基于Lucene的全文搜索引擎

本系统基于Lucene 4.6.0,使用庖丁解牛(Paoding Analyzer)作为中文分词器,使用Spring MVC作为Web框架。
本系统对src\webapps\resources\Doc目录中的Word文档进行索引,其中默认放置了30篇文档。

源代码下载:https://github.com/houseyoung/IR-Homework3
在线访问本系统:http://ir.houseyoung.cn (不能访问)

系统截图:
首页:
首页
搜索结果列表:
搜索结果列表
文档在线查看:
文档在线查看

代码功能简要说明:
IndexService:建立索引。系统启动时自动执行此方法。
SearchService:根据用户输入的关键词执行搜索。
WordToHtmlService:将Word文档的内容转换为符合HTML格式的内容。目前仅对文字进行了处理,表格与图片暂不支持。

本系统是XXXXXX大学信息与软件工程学院《信息检索》课程的大作业,因时间及能力所限,存在问题在所难免。各位在运行时遇到什么问题,或者对本系统有什么建议,可以在本篇博客下评论,笔者将会尽力进行解答。也欢迎各位来一起完善这个系统。

通过haproxy对ss进行国内中转

很多人喜欢购买一台国外的VPS,然后搭建一个ss服务器供自己使用。然而国内部分网络(如校园网)对于访问国外地址十分不友好,时不时会出现无法连接或者速度很慢的情况。这时候我们可以购买一台国内的VPS,然后在国内的VPS上配置haproxy来对ss服务进行中转,从而实现加速的目的。具体步骤如下:

1、安装haproxy,我用的是一台CentOS服务器,只需要使用yum指令即可安装: yum install haproxy -y,对于其他的Linux发行版的安装方法,各位可自行Google之。
2、编辑haproxy配置文件,将/etc/haproxy/haproxy.cfg修改为如下内容:

global
ulimit-n 51200

defaults
log global
mode tcp
option dontlognull
timeout connect 1000
timeout client 150000
timeout server 150000

frontend ss-in
bind *:8388
default_backend ss-out

backend ss-out
server server1 ss服务器的地址:端口号 maxconn 20480

3、执行haproxy -f /etc/haproxy/haproxy.cfg以使修改生效

之后就可以通过国内VPS的地址来使用ss了。

使用Nginx反向代理Tomcat

一、配置Tomcat中的Web项目

编辑Tomcat安装目录/conf/server.xml文件,在默认的Host后插入一个新的Host,代码如下:

   <Host name="网站域名" appBase="" unpackWARS="true" autoDeploy="true">
            <Context path="" docBase="Web项目在本机的存放位置" debug="0" reloadable="true" crossContext="true" />
    </Host>

二、配置Nginx

1、进入Nginx安装目录(使用yum安装的Nginx为/etc/nginx)下的conf.d目录(低版本Nginx为conf目录)

2、新建一个.conf文件,内容如下:

server {
listen 80;
server_name 网站域名;

location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}