惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V2EX - 技术
V2EX - 技术
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Latest news
Latest news
T
The Exploit Database - CXSecurity.com
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
L
Lohrmann on Cybersecurity
aimingoo的专栏
aimingoo的专栏
B
Blog
T
Threat Research - Cisco Blogs
罗磊的独立博客
Application and Cybersecurity Blog
Application and Cybersecurity Blog
P
Proofpoint News Feed
P
Palo Alto Networks Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
宝玉的分享
宝玉的分享
博客园 - 司徒正美
Google DeepMind News
Google DeepMind News
Blog — PlanetScale
Blog — PlanetScale
T
Tor Project blog
阮一峰的网络日志
阮一峰的网络日志
Last Week in AI
Last Week in AI
Martin Fowler
Martin Fowler
酷 壳 – CoolShell
酷 壳 – CoolShell
Recorded Future
Recorded Future
D
DataBreaches.Net
Y
Y Combinator Blog
大猫的无限游戏
大猫的无限游戏
IT之家
IT之家
B
Blog RSS Feed
Scott Helme
Scott Helme
P
Proofpoint News Feed
V
Vulnerabilities – Threatpost
A
Arctic Wolf
Help Net Security
Help Net Security
L
LINUX DO - 最新话题
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Vercel News
Vercel News
AWS News Blog
AWS News Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
S
Schneier on Security
Hacker News: Ask HN
Hacker News: Ask HN
N
Netflix TechBlog - Medium
L
LangChain Blog
博客园 - 叶小钗
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
M
MIT News - Artificial intelligence
N
News and Events Feed by Topic
Webroot Blog
Webroot Blog
W
WeLiveSecurity

博客园 - Tachikoma

用Ruby实现 Web Service Server ,并用Ruby发送 HTTP请求 Web Service Android 使用 Ksoap2 出现的低级错误... - Tachikoma Cygwin中通过RJB在Ruby下调用ICTCLAS(JAVA) ICTCLAS4J 的编译脚本 Ruby Sandbox 实现运行客户代码 - Tachikoma Ruby在使用MongoDB时,对Cursor的重新包装 RJB 在windows下的一些安装事项 Ruby手工测试正确,rcov测试失败的解决 在dell dimension 5150 上安装 leopard 手记 Rails测试中清空数据表/载入空fixtures RDoc 解决同名module 与 Class的问题 C 实用的 e-editor 的bundle Best of Ruby Quiz - Animal Quiz Best of Ruby Quiz - GEDCOM Parser Best of Ruby Quiz - MadLib - Tachikoma 使用selenium-on-rails的一些讨论 3]assertXpathCount的使用 使用selenium-on-rails的一些讨论 2]清理缓存 - Tachikoma - 博客园 使用selenium-on-rails的一些讨论 [0,1] 关于 rails ActiveRecord 属性 以及 foreign_key 不直接用数据库项目 时的一些讨论
ruby 下使用 ICTCLAS(JAVA)
Tachikoma · 2010-01-30 · via 博客园 - Tachikoma

ICTCLAS并没有RUBY开发版本,RUBY可以使用C版本和JAVA版本的ICTCLAS来做分词

RUBY用C的代码,涉及到重写接口和包装的问题,比较麻烦

在此讨论RUBY用JAVA版本的ICTCLAS实现分词

总体思想:RJB是个很精彩的库

1. 下载ICTCLAS4j

2. 目录结构

=
==ICTCLAS.rb
==ICTCLAS(ICTCLAS4j的源文件)
==DATA(复制ICTCLAS4j的源文件中的DATA文件夹,为什么复制在此我们稍后讨论)

3. 环境

  Windows 7

  Ruby 1.8.6

  rjb-1.2.0-x86-mswin32-60

4. 安装RJB

  http://www.cnblogs.com/Tachikoma/archive/2010/01/28/1658261.html

  这是我写的 RJB 在windows下的一些安装事项

5.  ICTCLAS.rb 的源代码

#代码用UTF-8格式保存
require "rubygems"
require "rjb"

require "iconv"

class ICTCLAS
	def self.fenci(input)
		output = ""
			Rjb::load(classpath="ICTCLAS/bin")
			segtag_class = Rjb::import('org.ictclas4j.segment.SegTag')
			string_class = Rjb::import('java.lang.String')
			input = string_class.new_with_sig("Ljava.lang.String;" , input)
			segtag = segtag_class.new_with_sig("I",1)
			seg_res = segtag.split(input)
			output = seg_res.getFinalResult()
		output
	end
end

output = ICTCLAS.fenci("这篇文章摘自Tachikoma的乱七八糟")
puts Iconv.iconv("GBK","utf-8",output) #转换码制以便输出

6. 在我们代码的根目录下(这点很重要,稍后讨论),运行

ruby ICTCLAS.rb

可以看到结果

这/r 篇/q 文章/n 摘自/v Tachikoma/nx 的/b 乱七八糟/i

讨论:

1. 路径问题

  前面提到过两个问题

    1] 将ICTCLAS4j 的 DATA 文件夹 复制到代码根目录下

    2] 必须从代码根目录启动程序

  否则易出现以下错误

in `method_missing': unknown exception (NullPointerException)

  其原因就是 ICTCLAS4j 源代码中,org.ictclas4j.bean.Dictionary中load方法使用相对路径读取字典文件(位于DATA文件夹),就要求DATA文件夹位于程序启动目录下

  这个可以认为是ICTCLAS4j的一个BUG吧

  P.S. 当然也自然有以下两种思路来解决这个问题

    1] 修改源代码,重新编译ICTCLAS4j,使用绝对路径

    2] 使用jvm启动参数 user.dir,但是经过多次尝试,失败

  问题解决:

    重新修改ICTCLAS.rb

require "rubygems"
require "rjb"

require "iconv"

class ICTCLAS
	def self.fenci(input)
		root_path = "#{File.dirname(__FILE__)}/ICTCLAS"
		output = ""
		Dir.chdir(root_path) do |path|		
			Rjb::load(classpath="bin")
			segtag_class = Rjb::import('org.ictclas4j.segment.SegTag')
			string_class = Rjb::import('java.lang.String')
			input = string_class.new_with_sig("Ljava.lang.String;" , input)
			segtag = segtag_class.new_with_sig("I",1)
			seg_res = segtag.split(input)
			output = seg_res.getFinalResult()
		end
		output
	end
end

     这样就可以从任意位置调用 ICTCLAS.fenci 方法 , DATA文件夹也可以放在ICTCLAS4j文件夹下