rmmseg 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/History.txt CHANGED
@@ -1,3 +1,7 @@
1
+ === 0.1.1 / 2008-02-05
2
+
3
+ * Use bones instead of hoe as building tool.
4
+
1
5
  === 0.1.0 / 2008-02-01
2
6
 
3
7
  * Add filter to filter out Chinese punctuations.
data/Manifest.txt CHANGED
@@ -37,3 +37,14 @@ spec/simple_algorithm_spec.rb
37
37
  spec/spec_helper.rb
38
38
  spec/svwl_rule_spec.rb
39
39
  spec/word_spec.rb
40
+ tasks/annotations.rake
41
+ tasks/doc.rake
42
+ tasks/gem.rake
43
+ tasks/homepage.rake
44
+ tasks/manifest.rake
45
+ tasks/post_load.rake
46
+ tasks/rubyforge.rake
47
+ tasks/setup.rb
48
+ tasks/spec.rake
49
+ tasks/svn.rake
50
+ tasks/test.rake
data/README.txt CHANGED
@@ -1,7 +1,6 @@
1
1
  = rmmseg
2
-
3
- * http://rmmseg.rubyforge.org
4
- * mailto:pluskid@gmail.com
2
+ by pluskid
3
+ http://rmmseg.rubyforge.org
5
4
 
6
5
  == DESCRIPTION:
7
6
 
data/Rakefile CHANGED
@@ -1,33 +1,22 @@
1
1
  # -*- ruby -*-
2
2
 
3
- $: << File.join(File.dirname(__FILE__), "lib")
3
+ load 'tasks/setup.rb'
4
4
 
5
- require 'rubygems'
6
- require 'hoe'
5
+ ensure_in_path 'lib'
7
6
  require 'rmmseg'
8
7
 
9
- Hoe.new('rmmseg', RMMSeg::VERSION) do |p|
10
- p.rubyforge_name = 'rmmseg'
11
- p.author = 'pluskid'
12
- p.email = 'pluskid@gmail.com'
13
- p.test_globs = ["spec/spec.rb"]
14
- p.rdoc_pattern = /^lib\/.*\.rb$|\.txt$/
15
- p.summary = <<-END
16
- RMMSeg is an implementation of MMSEG algorithm in Ruby. MMSEG is a
17
- Chinese segmentation algorithm based on two variants of maximum
18
- matching.
8
+ task :default => 'spec:run'
19
9
 
20
- RMMSeg can be used as a stand alone program or as an Analyzer of
21
- Ferret.
22
- END
23
- end
10
+ PROJ.name = 'rmmseg'
11
+ PROJ.authors = 'pluskid'
12
+ PROJ.email = 'pluskid@gmail.com'
13
+ PROJ.url = 'http://rmmseg.rubyforge.org'
14
+ PROJ.rubyforge_name = 'rmmseg'
15
+ PROJ.rdoc_remote_dir = 'rmmseg'
16
+ PROJ.version = RMMSeg::VERSION
24
17
 
25
- task :homepage do
26
- sh "cd misc && gerbil html homepage.erb > homepage.html"
27
- end
18
+ PROJ.exclude << '\.git'
28
19
 
29
- task :publish_homepage do
30
- sh "scp misc/homepage.html rubyforge.org:/var/www/gforge-projects/rmmseg/index.html"
31
- end
20
+ PROJ.spec_opts << '--color'
32
21
 
33
22
  # vim: syntax=Ruby
@@ -139,13 +139,8 @@ module RMMSeg
139
139
  end
140
140
 
141
141
  # Determine whether a character is a basic latin character.
142
- #--
143
- # TODO: Implement this method in a more correct way.
144
- # currently I use number of bytes in this char to determine this.
145
- # If it is a one-byte char, I consider it a basic latin.
146
- #++
147
142
  def basic_latin?(char)
148
- char.size == 1
143
+ !char.mbchar?
149
144
  end
150
145
 
151
146
  # Determine whether a character can be part of a basic latin
data/lib/rmmseg/ferret.rb CHANGED
@@ -2,6 +2,7 @@
2
2
  require 'singleton'
3
3
  require 'rubygems'
4
4
  require 'ferret'
5
+ require 'rmmseg'
5
6
 
6
7
  module RMMSeg
7
8
  module Ferret
data/lib/rmmseg.rb CHANGED
@@ -6,7 +6,7 @@ require 'rmmseg/simple_algorithm'
6
6
  require 'rmmseg/complex_algorithm'
7
7
 
8
8
  module RMMSeg
9
- VERSION = '0.1.0'
9
+ VERSION = '0.1.1'
10
10
 
11
11
  # Segment +text+ using the algorithm configured.
12
12
  def segment(text)
@@ -6,8 +6,8 @@ require 'rmmseg/ferret'
6
6
  analyzer = RMMSeg::Ferret::Analyzer.new { |tokenizer|
7
7
  Ferret::Analysis::LowerCaseFilter.new(tokenizer)
8
8
  }
9
- $index = Ferret::Index::Index.new(:analyzer => analyzer,
10
- :path => '/tmp/index')
9
+
10
+ $index = Ferret::Index::Index.new(:analyzer => analyzer)
11
11
 
12
12
  $index << {
13
13
  :title => "分词",
data/misc/homepage.erb CHANGED
@@ -167,7 +167,3 @@
167
167
  * "Implementation Details":http://pluskid.lifegoo.com/?p=261: My blog post about the implementation details of RMMSeg (Chinese).
168
168
  * "Author's Email":mailto:pluskid@gmail.com: Contact me if you have any problem.
169
169
  <% end %>
170
-
171
- <% footer do %>
172
- "[Validate]":http://validator.w3.org/check/referer
173
- <% end %>
data/misc/homepage.html CHANGED
@@ -2,9 +2,9 @@
2
2
  <html>
3
3
  <head>
4
4
  <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
5
- <meta name="date" content="01 February 2008"/>
5
+ <meta name="date" content="04 February 2008"/>
6
6
  <meta name="author" content="pluskid"/>
7
- <meta name="generator" content="Gerbil 1.1.0"/>
7
+ <meta name="generator" content="Gerbil 2.0.0"/>
8
8
  <title>RMMSeg Homepage</title>
9
9
 
10
10
  <style type="text/css" media="screen">
@@ -94,6 +94,8 @@
94
94
  table
95
95
  {
96
96
  border : none;
97
+ margin : auto; /* center horizontally */
98
+ margin-top : 1em;
97
99
  }
98
100
 
99
101
  th,
@@ -110,11 +112,6 @@
110
112
  background-color : #F5F5F5;
111
113
  }
112
114
 
113
- table
114
- {
115
- margin : auto;
116
- }
117
-
118
115
  /* document structure */
119
116
 
120
117
  #header
@@ -484,6 +481,8 @@
484
481
  table
485
482
  {
486
483
  border : none;
484
+ margin : auto; /* center horizontally */
485
+ margin-top : 1em;
487
486
  }
488
487
 
489
488
  th,
@@ -500,11 +499,6 @@
500
499
  background-color : #F5F5F5;
501
500
  }
502
501
 
503
- table
504
- {
505
- margin : auto;
506
- }
507
-
508
502
  /* document structure */
509
503
 
510
504
  #header
@@ -759,23 +753,27 @@
759
753
  </style>
760
754
  </head>
761
755
  <body>
756
+
762
757
  <div id="header">
758
+
763
759
 
764
760
  <h1 class="title">RMMSeg Homepage</h1>
765
761
  <h2 class="authors"><a href="http://pluskid.lifegoo.com">pluskid</a></h2>
766
- <h3 class="date">01 February 2008</h3>
762
+ <h3 class="date">04 February 2008</h3>
763
+
767
764
  </div>
765
+
768
766
 
769
767
 
770
- <div id="toc"><h1>Contents</h1> <ul><li>1&nbsp;&nbsp;<a id="a-606801458" href="#Introduction">Introduction</a></li><li>2&nbsp;&nbsp;<a id="a-606803598" href="#Setup">Setup</a><ul><li>2.1&nbsp;&nbsp;<a id="a-606805098" href="#Requirements">Requirements</a></li><li>2.2&nbsp;&nbsp;<a id="a-606807208" href="#Installation">Installation</a><ul><li>2.2.1&nbsp;&nbsp;<a id="a-606808808" href="#Using-RubyGems">Using RubyGems</a></li><li>2.2.2&nbsp;&nbsp;<a id="a-606810898" href="#From-Subversion">From Subversion</a></li></ul></li></ul></li><li>3&nbsp;&nbsp;<a id="a-606815688" href="#Usage">Usage</a><ul><li>3.1&nbsp;&nbsp;<a id="a-606817228" href="#Stand-Alone-rmmseg">Stand Alone rmmseg</a></li><li>3.2&nbsp;&nbsp;<a id="a-606819308" href="#Analyzer-for-Ferret">Analyzer for Ferret</a></li><li>3.3&nbsp;&nbsp;<a id="a-606825488" href="#Customization">Customization</a></li></ul></li><li>4&nbsp;&nbsp;<a id="a-606828108" href="#Resources">Resources</a></li></ul></div>
768
+ <div id="toc"><h1>Contents</h1> <ul><li>1&nbsp;&nbsp;<a id="a-606973768" href="#Introduction">Introduction</a></li><li>2&nbsp;&nbsp;<a id="a-606975908" href="#Setup">Setup</a><ul><li>2.1&nbsp;&nbsp;<a id="a-606977408" href="#Requirements">Requirements</a></li><li>2.2&nbsp;&nbsp;<a id="a-606979518" href="#Installation">Installation</a><ul><li>2.2.1&nbsp;&nbsp;<a id="a-606981118" href="#Using-RubyGems">Using RubyGems</a></li><li>2.2.2&nbsp;&nbsp;<a id="a-606983208" href="#From-Subversion">From Subversion</a></li></ul></li></ul></li><li>3&nbsp;&nbsp;<a id="a-606987998" href="#Usage">Usage</a><ul><li>3.1&nbsp;&nbsp;<a id="a-606989538" href="#Stand-Alone-rmmseg">Stand Alone rmmseg</a></li><li>3.2&nbsp;&nbsp;<a id="a-606991618" href="#Analyzer-for-Ferret">Analyzer for Ferret</a></li><li>3.3&nbsp;&nbsp;<a id="a-606997828" href="#Customization">Customization</a></li></ul></li><li>4&nbsp;&nbsp;<a id="a-606008348" href="#Resources">Resources</a></li></ul></div>
771
769
 
772
- <div id="lof"><h1>Figures</h1> <ol><li><a id="a-606823268" href="#Ferret-Example-Screenshot">Ferret Example Screenshot</a></li></ol><h1>Notes</h1> <ol><li><a id="a-606812538" href="#The-latest-code-might-be-unstable">The latest code might be unstable</a></li></ol></div>
770
+ <div id="lof"><h1>Figures</h1> <ol><li><a id="a-606995608" href="#Ferret-Example-Screenshot">Ferret Example Screenshot</a></li></ol><h1>Notes</h1> <ol><li><a id="a-606984848" href="#The-latest-code-might-be-unstable">The latest code might be unstable</a></li></ol></div>
773
771
 
774
772
  <div id="content">
775
773
  <div class="chapter">
776
774
  <h1 class="title">
777
775
  Chapter
778
- <a class="toc" id="Introduction" href="#a-606801458">1</a>
776
+ <a class="toc" id="Introduction" href="#a-606973768">1</a>
779
777
 
780
778
  <br/>
781
779
 
@@ -811,7 +809,7 @@ following essays:</p>
811
809
  <div class="chapter">
812
810
  <h1 class="title">
813
811
  Chapter
814
- <a class="toc" id="Setup" href="#a-606803598">2</a>
812
+ <a class="toc" id="Setup" href="#a-606975908">2</a>
815
813
 
816
814
  <br/>
817
815
 
@@ -820,7 +818,7 @@ following essays:</p>
820
818
 
821
819
  <div class="content"><div class="section">
822
820
  <h2 class="title">
823
- <a class="toc" id="Requirements" href="#a-606805098">2.1</a>&nbsp;&nbsp;Requirements
821
+ <a class="toc" id="Requirements" href="#a-606977408">2.1</a>&nbsp;&nbsp;Requirements
824
822
  </h2>
825
823
  <div class="content">Your system needs the following software to run RMMSeg.
826
824
 
@@ -850,11 +848,11 @@ following essays:</p>
850
848
  </div>
851
849
  <div class="section">
852
850
  <h2 class="title">
853
- <a class="toc" id="Installation" href="#a-606807208">2.2</a>&nbsp;&nbsp;Installation
851
+ <a class="toc" id="Installation" href="#a-606979518">2.2</a>&nbsp;&nbsp;Installation
854
852
  </h2>
855
853
  <div class="content"><div class="section">
856
854
  <h3 class="title">
857
- <a class="toc" id="Using-RubyGems" href="#a-606808808">2.2.1</a>&nbsp;&nbsp;Using RubyGems
855
+ <a class="toc" id="Using-RubyGems" href="#a-606981118">2.2.1</a>&nbsp;&nbsp;Using RubyGems
858
856
  </h3>
859
857
  <div class="content"><p>To install the gem remotely from <a href="http://rubyforge.org">RubyForge</a> :</p>
860
858
 
@@ -869,11 +867,11 @@ following essays:</p>
869
867
  </div>
870
868
  <div class="section">
871
869
  <h3 class="title">
872
- <a class="toc" id="From-Subversion" href="#a-606810898">2.2.2</a>&nbsp;&nbsp;From Subversion
870
+ <a class="toc" id="From-Subversion" href="#a-606983208">2.2.2</a>&nbsp;&nbsp;From Subversion
873
871
  </h3>
874
872
  <div class="content"><p>From subversion repository hosted at <a href="http://rmmseg.rubyforge.org/svn/">RubyForge</a>, you can always get the latest source code.
875
873
  <div class="note">
876
- <p class="title"><a class="toc" id="The-latest-code-might-be-unstable" href="#a-606812538">Note 1</a>.&nbsp;&nbsp;The latest code might be unstable</p>
874
+ <p class="title"><a class="toc" id="The-latest-code-might-be-unstable" href="#a-606984848">Note 1</a>.&nbsp;&nbsp;The latest code might be unstable</p>
877
875
 
878
876
  <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABHNCSVQICAgI
879
877
  fAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3
@@ -954,7 +952,7 @@ DUCQhrhWJkj394A0gKeUCjVo3r9Zv0r2P3yyQqPd16MPAAAAAElFTkSuQmCC
954
952
  <div class="chapter">
955
953
  <h1 class="title">
956
954
  Chapter
957
- <a class="toc" id="Usage" href="#a-606815688">3</a>
955
+ <a class="toc" id="Usage" href="#a-606987998">3</a>
958
956
 
959
957
  <br/>
960
958
 
@@ -963,7 +961,7 @@ DUCQhrhWJkj394A0gKeUCjVo3r9Zv0r2P3yyQqPd16MPAAAAAElFTkSuQmCC
963
961
 
964
962
  <div class="content"><div class="section">
965
963
  <h2 class="title">
966
- <a class="toc" id="Stand-Alone-rmmseg" href="#a-606817228">3.1</a>&nbsp;&nbsp;Stand Alone rmmseg
964
+ <a class="toc" id="Stand-Alone-rmmseg" href="#a-606989538">3.1</a>&nbsp;&nbsp;Stand Alone rmmseg
967
965
  </h2>
968
966
  <div class="content"><p>RMMSeg comes with a script <code class="code">rmmseg</code>. To get the basic usage, just execute it with <code class="code">-h</code> option:</p>
969
967
 
@@ -980,7 +978,7 @@ example:</p>
980
978
  </div>
981
979
  <div class="section">
982
980
  <h2 class="title">
983
- <a class="toc" id="Analyzer-for-Ferret" href="#a-606819308">3.2</a>&nbsp;&nbsp;Analyzer for Ferret
981
+ <a class="toc" id="Analyzer-for-Ferret" href="#a-606991618">3.2</a>&nbsp;&nbsp;Analyzer for Ferret
984
982
  </h2>
985
983
  <div class="content"><p>RMMSeg include an analyzer for Ferret. It is simply ready to
986
984
  use. Just require it and pass it to Ferret. Here&#8217;s a complete
@@ -993,7 +991,10 @@ require <span style="background-color:#fff0f0"><span style="color:#710">'</span>
993
991
  require <span style="background-color:#fff0f0"><span style="color:#710">'</span><span style="color:#D20">rmmseg</span><span style="color:#710">'</span></span>
994
992
  require <span style="background-color:#fff0f0"><span style="color:#710">'</span><span style="color:#D20">rmmseg/ferret</span><span style="color:#710">'</span></span>
995
993
 
996
- analyzer = <span style="color:#036; font-weight:bold">RMMSeg</span>::<span style="color:#036; font-weight:bold">Ferret</span>::<span style="color:#036; font-weight:bold">Analyzer</span>.new
994
+ analyzer = <span style="color:#036; font-weight:bold">RMMSeg</span>::<span style="color:#036; font-weight:bold">Ferret</span>::<span style="color:#036; font-weight:bold">Analyzer</span>.new { |tokenizer|
995
+ <span style="color:#036; font-weight:bold">Ferret</span>::<span style="color:#036; font-weight:bold">Analysis</span>::<span style="color:#036; font-weight:bold">LowerCaseFilter</span>.new(tokenizer)
996
+ }
997
+
997
998
  <span style="color:#d70; font-weight:bold">$index</span> = <span style="color:#036; font-weight:bold">Ferret</span>::<span style="color:#036; font-weight:bold">Index</span>::<span style="color:#036; font-weight:bold">Index</span>.new(<span style="color:#A60">:analyzer</span> =&gt; analyzer)
998
999
 
999
1000
  <span style="color:#d70; font-weight:bold">$index</span> &lt;&lt; {
@@ -1089,13 +1090,13 @@ highlighted as in <a class="xref" href="#Ferret-Example-Screenshot">Figure 1: <e
1089
1090
 
1090
1091
 
1091
1092
  <p><div class="figure">
1092
- <p class="title"><a class="toc" id="Ferret-Example-Screenshot" href="#a-606823268">Figure 1</a>.&nbsp;&nbsp;Ferret Example Screenshot</p>
1093
+ <p class="title"><a class="toc" id="Ferret-Example-Screenshot" href="#a-606995608">Figure 1</a>.&nbsp;&nbsp;Ferret Example Screenshot</p>
1093
1094
  <div class="content"><img src="http://pluskid.lifegoo.com/wp-content/uploads/2008/02/rmmseg.png" alt="" /></div>
1094
1095
  </div></p></div>
1095
1096
  </div>
1096
1097
  <div class="section">
1097
1098
  <h2 class="title">
1098
- <a class="toc" id="Customization" href="#a-606825488">3.3</a>&nbsp;&nbsp;Customization
1099
+ <a class="toc" id="Customization" href="#a-606997828">3.3</a>&nbsp;&nbsp;Customization
1099
1100
  </h2>
1100
1101
  <div class="content"><p>RMMSeg can be customized through <code class="code"><span style="color:#036; font-weight:bold">RMMSeg</span>::<span style="color:#036; font-weight:bold">Config</span></code>. For example, to use your own dictionaries, just set it before starting to do segmentation:</p>
1101
1102
 
@@ -1122,7 +1123,7 @@ highlighted as in <a class="xref" href="#Ferret-Example-Screenshot">Figure 1: <e
1122
1123
  <div class="chapter">
1123
1124
  <h1 class="title">
1124
1125
  Chapter
1125
- <a class="toc" id="Resources" href="#a-606828108">4</a>
1126
+ <a class="toc" id="Resources" href="#a-606008348">4</a>
1126
1127
 
1127
1128
  <br/>
1128
1129
 
@@ -1135,16 +1136,17 @@ highlighted as in <a class="xref" href="#Ferret-Example-Screenshot">Figure 1: <e
1135
1136
  <li><a href="http://pluskid.lifegoo.com/?p=261">Implementation Details</a>: My blog post about the implementation details of RMMSeg (Chinese).</li>
1136
1137
  <li><a href="mailto:pluskid@gmail.com">Author&#8217;s Email</a>: Contact me if you have any problem.</li>
1137
1138
  </ul></div>
1138
- </div>
1139
- </div>
1139
+ </div></div>
1140
1140
 
1141
1141
 
1142
1142
  <br style="display: none"/>
1143
1143
  <hr style="display: none"/>
1144
1144
  <br style="display: none"/>
1145
1145
 
1146
+
1146
1147
  <div id="footer">
1147
- <a href="http://validator.w3.org/check/referer">[Validate]</a>
1148
+
1149
+ Generated on Mon Feb 04 16:17:21 +0800 2008 by <a href="http://gerbil.rubyforge.org">Gerbil</a> 2.0.0.
1148
1150
 
1149
1151
  <p>The admonition icons (<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABHNCSVQICAgI
1150
1152
  fAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3
@@ -1204,6 +1206,8 @@ YvOZpmnxjo6O3x48eHA76S4UB3qEUgohRBQoGLoyKTJJp+nyR97kmA1IwANS
1204
1206
  wODQ1auUSmYP9UNjoQBwAIv0DBUMFb6WZpNuRB9wSYsfUEr5kOdfSiGETrr1
1205
1207
  DUCQhrhWJkj394A0gKeUCjVo3r9Zv0r2P3yyQqPd16MPAAAAAElFTkSuQmCC
1206
1208
  " alt="note"/>) used in this document are Copyright &copy; 2005 <a href="http://tango.freedesktop.org">Tango Desktop Project</a>. They are part of the <a href="http://tango.freedesktop.org/Tango_Icon_Library">Tango Icon Theme</a> set, which is distributed under the <a href="http://creativecommons.org/licenses/by-sa/2.5/">Creative Commons Attribution-ShareAlike 2.5 License Agreement</a>.</p>
1209
+
1207
1210
  </div>
1211
+
1208
1212
  </body>
1209
1213
  </html>
data/spec/spec_helper.rb CHANGED
@@ -1,9 +1,6 @@
1
1
  $: << File.join(File.dirname(__FILE__), "../lib")
2
2
  require 'rmmseg'
3
3
 
4
- require 'rubygems'
5
- require 'spec'
6
-
7
4
  def gen_words words, freqs=nil
8
5
  if freqs.nil?
9
6
  words.map { |word| RMMSeg::Word.new(word) }
@@ -0,0 +1,30 @@
1
+ # $Id$
2
+
3
+ if HAVE_BONES
4
+
5
+ desc "Enumerate all annotations"
6
+ task :notes do
7
+ Bones::AnnotationExtractor.enumerate(
8
+ PROJ, "OPTIMIZE|FIXME|TODO", :tag => true)
9
+ end
10
+
11
+ namespace :notes do
12
+ desc "Enumerate all OPTIMIZE annotations"
13
+ task :optimize do
14
+ Bones::AnnotationExtractor.enumerate(PROJ, "OPTIMIZE")
15
+ end
16
+
17
+ desc "Enumerate all FIXME annotations"
18
+ task :fixme do
19
+ Bones::AnnotationExtractor.enumerate(PROJ, "FIXME")
20
+ end
21
+
22
+ desc "Enumerate all TODO annotations"
23
+ task :todo do
24
+ Bones::AnnotationExtractor.enumerate(PROJ, "TODO")
25
+ end
26
+ end
27
+
28
+ end # if HAVE_BONES
29
+
30
+ # EOF
data/tasks/doc.rake ADDED
@@ -0,0 +1,49 @@
1
+ # $Id$
2
+
3
+ require 'rake/rdoctask'
4
+
5
+ namespace :doc do
6
+
7
+ desc 'Generate RDoc documentation'
8
+ Rake::RDocTask.new do |rd|
9
+ rd.main = PROJ.rdoc_main
10
+ rd.rdoc_dir = PROJ.rdoc_dir
11
+
12
+ incl = Regexp.new(PROJ.rdoc_include.join('|'))
13
+ excl = Regexp.new(PROJ.rdoc_exclude.join('|'))
14
+ files = PROJ.files.find_all do |fn|
15
+ case fn
16
+ when excl; false
17
+ when incl; true
18
+ else false end
19
+ end
20
+ rd.rdoc_files.push(*files)
21
+
22
+ title = "#{PROJ.name}-#{PROJ.version} Documentation"
23
+ title = "#{PROJ.rubyforge_name}'s " + title if PROJ.rubyforge_name != title
24
+
25
+ rd.options << "-t #{title}"
26
+ rd.options.concat(PROJ.rdoc_opts)
27
+ end
28
+
29
+ desc 'Generate ri locally for testing'
30
+ task :ri => :clobber_ri do
31
+ sh "#{RDOC} --ri -o ri ."
32
+ end
33
+
34
+ desc 'Remove ri products'
35
+ task :clobber_ri do
36
+ rm_r 'ri' rescue nil
37
+ end
38
+
39
+ end # namespace :doc
40
+
41
+ desc 'Alias to doc:rdoc'
42
+ task :doc => 'doc:rdoc'
43
+
44
+ desc 'Remove all build products'
45
+ task :clobber => %w(doc:clobber_rdoc doc:clobber_ri)
46
+
47
+ remove_desc_for_task %w(doc:clobber_rdoc doc:clobber_ri)
48
+
49
+ # EOF
data/tasks/gem.rake ADDED
@@ -0,0 +1,89 @@
1
+ # $Id$
2
+
3
+ require 'rake/gempackagetask'
4
+
5
+ namespace :gem do
6
+
7
+ PROJ.spec = Gem::Specification.new do |s|
8
+ s.name = PROJ.name
9
+ s.version = PROJ.version
10
+ s.summary = PROJ.summary
11
+ s.authors = Array(PROJ.authors)
12
+ s.email = PROJ.email
13
+ s.homepage = Array(PROJ.url).first
14
+ s.rubyforge_project = PROJ.rubyforge_name
15
+
16
+ s.description = PROJ.description
17
+
18
+ PROJ.dependencies.each do |dep|
19
+ s.add_dependency(*dep)
20
+ end
21
+
22
+ s.files = PROJ.files
23
+ s.executables = PROJ.executables.map {|fn| File.basename(fn)}
24
+ s.extensions = PROJ.files.grep %r/extconf\.rb$/
25
+
26
+ s.bindir = 'bin'
27
+ dirs = Dir["{#{PROJ.libs.join(',')}}"]
28
+ s.require_paths = dirs unless dirs.empty?
29
+
30
+ incl = Regexp.new(PROJ.rdoc_include.join('|'))
31
+ excl = PROJ.rdoc_exclude.dup.concat %w[\.rb$ ^(\.\/|\/)?ext]
32
+ excl = Regexp.new(excl.join('|'))
33
+ rdoc_files = PROJ.files.find_all do |fn|
34
+ case fn
35
+ when excl; false
36
+ when incl; true
37
+ else false end
38
+ end
39
+ s.rdoc_options = PROJ.rdoc_opts + ['--main', PROJ.rdoc_main]
40
+ s.extra_rdoc_files = rdoc_files
41
+ s.has_rdoc = true
42
+
43
+ if test ?f, PROJ.test_file
44
+ s.test_file = PROJ.test_file
45
+ else
46
+ s.test_files = PROJ.tests.to_a
47
+ end
48
+
49
+ # Do any extra stuff the user wants
50
+ # spec_extras.each do |msg, val|
51
+ # case val
52
+ # when Proc
53
+ # val.call(s.send(msg))
54
+ # else
55
+ # s.send "#{msg}=", val
56
+ # end
57
+ # end
58
+ end
59
+
60
+ desc 'Show information about the gem'
61
+ task :debug do
62
+ puts PROJ.spec.to_ruby
63
+ end
64
+
65
+ Rake::GemPackageTask.new(PROJ.spec) do |pkg|
66
+ pkg.need_tar = PROJ.need_tar
67
+ pkg.need_zip = PROJ.need_zip
68
+ end
69
+
70
+ desc 'Install the gem'
71
+ task :install => [:clobber, :package] do
72
+ sh "#{SUDO} #{GEM} install pkg/#{PROJ.spec.full_name}"
73
+ end
74
+
75
+ desc 'Uninstall the gem'
76
+ task :uninstall do
77
+ sh "#{SUDO} #{GEM} uninstall -v '#{PROJ.version}' -x #{PROJ.name}"
78
+ end
79
+
80
+ end # namespace :gem
81
+
82
+ desc 'Alias to gem:package'
83
+ task :gem => 'gem:package'
84
+
85
+ task :clobber => 'gem:clobber_package'
86
+
87
+ remove_desc_for_task %w(gem:clobber_package)
88
+
89
+ # EOF
@@ -0,0 +1,12 @@
1
+ namespace :homepage do
2
+ desc 'generate homepage'
3
+ task :generate do
4
+ sh "cd misc && gerbil html homepage.erb > homepage.html"
5
+ end
6
+
7
+ desc 'publish homepage to rubyforge'
8
+ task :publish => :generate do
9
+ remote_path = "rubyforge.org:/var/www/gforge-projects"
10
+ sh "scp misc/homepage.html #{remote_path}/rmmseg/index.html"
11
+ end
12
+ end
@@ -0,0 +1,44 @@
1
+ # $Id$
2
+
3
+ require 'find'
4
+
5
+ namespace :manifest do
6
+
7
+ desc 'Verify the manifest'
8
+ task :check do
9
+ fn = 'Manifest.tmp'
10
+ files = []
11
+ exclude = Regexp.new(PROJ.exclude.join('|'))
12
+ Find.find '.' do |path|
13
+ path.sub! %r/^(\.\/|\/)/o, ''
14
+ next unless test ?f, path
15
+ next if path =~ exclude
16
+ files << path
17
+ end
18
+
19
+ File.open(fn, 'w') {|fp| fp.puts files.sort}
20
+ system "#{DIFF} -du Manifest.txt #{fn}"
21
+ rm fn rescue nil
22
+ end
23
+
24
+ desc 'Create a new manifest'
25
+ task :create do
26
+ fn = 'Manifest.txt'
27
+ files = []
28
+ exclude = Regexp.new(PROJ.exclude.join('|'))
29
+ Find.find '.' do |path|
30
+ path.sub! %r/^(\.\/|\/)/o, ''
31
+ next unless test ?f, path
32
+ next if path =~ exclude
33
+ files << path
34
+ end
35
+
36
+ files << fn unless test ?f, fn
37
+ File.open(fn, 'w') {|fp| fp.puts files.sort}
38
+ end
39
+ end # namespace :manifest
40
+
41
+ desc 'Alias to manifest:check'
42
+ task :manifest => 'manifest:check'
43
+
44
+ # EOF
@@ -0,0 +1,18 @@
1
+ # $Id$
2
+
3
+ # This file does not define any rake tasks. It is used to load some project
4
+ # settings if they are not defined by the user.
5
+
6
+ unless PROJ.changes
7
+ PROJ.changes = paragraphs_of('History.txt', 0..1).join("\n\n")
8
+ end
9
+
10
+ unless PROJ.description
11
+ PROJ.description = paragraphs_of('README.txt', 'description').join("\n\n")
12
+ end
13
+
14
+ unless PROJ.summary
15
+ PROJ.summary = PROJ.description.split('.').first
16
+ end
17
+
18
+ # EOF
@@ -0,0 +1,57 @@
1
+ # $Id$
2
+
3
+ if PROJ.rubyforge_name && HAVE_RUBYFORGE
4
+
5
+ require 'rubyforge'
6
+ require 'rake/contrib/sshpublisher'
7
+
8
+ namespace :gem do
9
+ desc 'Package and upload to RubyForge'
10
+ task :release => [:clobber, :package] do |t|
11
+ v = ENV['VERSION'] or abort 'Must supply VERSION=x.y.z'
12
+ abort "Versions don't match #{v} vs #{PROJ.version}" if v != PROJ.version
13
+ pkg = "pkg/#{PROJ.spec.full_name}"
14
+
15
+ if $DEBUG then
16
+ puts "release_id = rf.add_release #{PROJ.rubyforge_name.inspect}, #{PROJ.name.inspect}, #{PROJ.version.inspect}, \"#{pkg}.tgz\""
17
+ puts "rf.add_file #{PROJ.rubyforge_name.inspect}, #{PROJ.name.inspect}, release_id, \"#{pkg}.gem\""
18
+ end
19
+
20
+ rf = RubyForge.new
21
+ puts 'Logging in'
22
+ rf.login
23
+
24
+ c = rf.userconfig
25
+ c['release_notes'] = PROJ.description if PROJ.description
26
+ c['release_changes'] = PROJ.changes if PROJ.changes
27
+ c['preformatted'] = true
28
+
29
+ files = [(PROJ.need_tar ? "#{pkg}.tgz" : nil),
30
+ (PROJ.need_zip ? "#{pkg}.zip" : nil),
31
+ "#{pkg}.gem"].compact
32
+
33
+ puts "Releasing #{PROJ.name} v. #{PROJ.version}"
34
+ rf.add_release PROJ.rubyforge_name, PROJ.name, PROJ.version, *files
35
+ end
36
+ end # namespace :gem
37
+
38
+
39
+ namespace :doc do
40
+ desc "Publish RDoc to RubyForge"
41
+ task :release => %w(doc:clobber_rdoc doc:rdoc) do
42
+ config = YAML.load(
43
+ File.read(File.expand_path('~/.rubyforge/user-config.yml'))
44
+ )
45
+
46
+ host = "#{config['username']}@rubyforge.org"
47
+ remote_dir = "/var/www/gforge-projects/#{PROJ.rubyforge_name}/"
48
+ remote_dir << PROJ.rdoc_remote_dir if PROJ.rdoc_remote_dir
49
+ local_dir = PROJ.rdoc_dir
50
+
51
+ Rake::SshDirPublisher.new(host, remote_dir, local_dir).upload
52
+ end
53
+ end # namespace :doc
54
+
55
+ end # if HAVE_RUBYFORGE
56
+
57
+ # EOF
data/tasks/setup.rb ADDED
@@ -0,0 +1,189 @@
1
+ # $Id$
2
+
3
+ require 'rubygems'
4
+ require 'rake'
5
+ require 'fileutils'
6
+ require 'ostruct'
7
+
8
+ PROJ = OpenStruct.new
9
+
10
+ PROJ.name = nil
11
+ PROJ.summary = nil
12
+ PROJ.description = nil
13
+ PROJ.changes = nil
14
+ PROJ.authors = nil
15
+ PROJ.email = nil
16
+ PROJ.url = nil
17
+ PROJ.version = ENV['VERSION'] || '0.0.0'
18
+ PROJ.rubyforge_name = nil
19
+ PROJ.exclude = %w(tmp$ bak$ ~$ CVS .svn/ ^pkg/ ^doc/)
20
+
21
+ # Rspec
22
+ PROJ.specs = FileList['spec/**/*_spec.rb']
23
+ PROJ.spec_opts = []
24
+
25
+ # Test::Unit
26
+ PROJ.tests = FileList['test/**/test_*.rb']
27
+ PROJ.test_file = 'test/all.rb'
28
+ PROJ.test_opts = []
29
+
30
+ # Rcov
31
+ PROJ.rcov_opts = ['--sort', 'coverage', '-T']
32
+
33
+ # Rdoc
34
+ PROJ.rdoc_opts = []
35
+ PROJ.rdoc_include = %w(^lib/ ^bin/ ^ext/ .txt$)
36
+ PROJ.rdoc_exclude = %w(extconf.rb$ ^Manifest.txt$)
37
+ PROJ.rdoc_main = 'README.txt'
38
+ PROJ.rdoc_dir = 'doc'
39
+ PROJ.rdoc_remote_dir = nil
40
+
41
+ # Extensions
42
+ PROJ.extensions = FileList['ext/**/extconf.rb']
43
+ PROJ.ruby_opts = %w(-w)
44
+ PROJ.libs = []
45
+ %w(lib ext).each {|dir| PROJ.libs << dir if test ?d, dir}
46
+
47
+ # Gem Packaging
48
+ PROJ.files =
49
+ if test ?f, 'Manifest.txt'
50
+ files = File.readlines('Manifest.txt').map {|fn| fn.chomp.strip}
51
+ files.delete ''
52
+ files
53
+ else [] end
54
+ PROJ.executables = PROJ.files.find_all {|fn| fn =~ %r/^bin/}
55
+ PROJ.dependencies = []
56
+ PROJ.need_tar = true
57
+ PROJ.need_zip = false
58
+
59
+ # File Annotations
60
+ PROJ.annotation_exclude = []
61
+ PROJ.annotation_extensions = %w(.txt .rb .erb) << ''
62
+
63
+ # Subversion Repository
64
+ PROJ.svn = false
65
+ PROJ.svn_root = nil
66
+ PROJ.svn_trunk = 'trunk'
67
+ PROJ.svn_tags = 'tags'
68
+ PROJ.svn_branches = 'branches'
69
+
70
+ # Load the other rake files in the tasks folder
71
+ rakefiles = Dir.glob('tasks/*.rake').sort
72
+ rakefiles.unshift(rakefiles.delete('tasks/post_load.rake')).compact!
73
+ import(*rakefiles)
74
+
75
+ # Setup some constants
76
+ WIN32 = %r/win32/ =~ RUBY_PLATFORM unless defined? WIN32
77
+
78
+ DEV_NULL = WIN32 ? 'NUL:' : '/dev/null'
79
+
80
+ def quiet( &block )
81
+ io = [STDOUT.dup, STDERR.dup]
82
+ STDOUT.reopen DEV_NULL
83
+ STDERR.reopen DEV_NULL
84
+ block.call
85
+ ensure
86
+ STDOUT.reopen io.first
87
+ STDERR.reopen io.last
88
+ end
89
+
90
+ DIFF = if WIN32 then 'diff.exe'
91
+ else
92
+ if quiet {system "gdiff", __FILE__, __FILE__} then 'gdiff'
93
+ else 'diff' end
94
+ end unless defined? DIFF
95
+
96
+ SUDO = if WIN32 then ''
97
+ else
98
+ if quiet {system 'which sudo'} then 'sudo'
99
+ else '' end
100
+ end
101
+
102
+ RCOV = WIN32 ? 'rcov.cmd' : 'rcov'
103
+ GEM = WIN32 ? 'gem.cmd' : 'gem'
104
+
105
+ %w(rcov spec/rake/spectask rubyforge bones).each do |lib|
106
+ begin
107
+ require lib
108
+ Object.instance_eval {const_set "HAVE_#{lib.tr('/','_').upcase}", true}
109
+ rescue LoadError
110
+ Object.instance_eval {const_set "HAVE_#{lib.tr('/','_').upcase}", false}
111
+ end
112
+ end
113
+
114
+ # Reads a file at +path+ and spits out an array of the +paragraphs+
115
+ # specified.
116
+ #
117
+ # changes = paragraphs_of('History.txt', 0..1).join("\n\n")
118
+ # summary, *description = paragraphs_of('README.txt', 3, 3..8)
119
+ #
120
+ def paragraphs_of( path, *paragraphs )
121
+ title = String === paragraphs.first ? paragraphs.shift : nil
122
+ ary = File.read(path).delete("\r").split(/\n\n+/)
123
+
124
+ result = if title
125
+ tmp, matching = [], false
126
+ rgxp = %r/^=+\s*#{Regexp.escape(title)}/i
127
+ paragraphs << (0..-1) if paragraphs.empty?
128
+
129
+ ary.each do |val|
130
+ if val =~ rgxp
131
+ break if matching
132
+ matching = true
133
+ rgxp = %r/^=+/i
134
+ elsif matching
135
+ tmp << val
136
+ end
137
+ end
138
+ tmp
139
+ else ary end
140
+
141
+ result.values_at(*paragraphs)
142
+ end
143
+
144
+ # Adds the given gem _name_ to the current project's dependency list. An
145
+ # optional gem _version_ can be given. If omitted, the newest gem version
146
+ # will be used.
147
+ #
148
+ def depend_on( name, version = nil )
149
+ spec = Gem.source_index.find_name(name).last
150
+ version = spec.version.to_s if version.nil? and !spec.nil?
151
+
152
+ PROJ.dependencies << (version.nil? ? [name] : [name, ">= #{version}"])
153
+ end
154
+
155
+ # Adds the given arguments to the include path if they are not already there
156
+ #
157
+ def ensure_in_path( *args )
158
+ args.each do |path|
159
+ path = File.expand_path(path)
160
+ $:.unshift(path) if test(?d, path) and not $:.include?(path)
161
+ end
162
+ end
163
+
164
+ # Find a rake task using the task name and remove any description text. This
165
+ # will prevent the task from being displayed in the list of available tasks.
166
+ #
167
+ def remove_desc_for_task( names )
168
+ Array(names).each do |task_name|
169
+ task = Rake.application.tasks.find {|t| t.name == task_name}
170
+ next if task.nil?
171
+ task.instance_variable_set :@comment, nil
172
+ end
173
+ end
174
+
175
+ # Change working directories to _dir_, call the _block_ of code, and then
176
+ # change back to the original working directory (the current directory when
177
+ # this method was called).
178
+ #
179
+ def in_directory( dir, &block )
180
+ curdir = pwd
181
+ begin
182
+ cd dir
183
+ return block.call
184
+ ensure
185
+ cd curdir
186
+ end
187
+ end
188
+
189
+ # EOF
data/tasks/spec.rake ADDED
@@ -0,0 +1,43 @@
1
+ # $Id$
2
+
3
+ if HAVE_SPEC_RAKE_SPECTASK
4
+
5
+ namespace :spec do
6
+
7
+ desc 'Run all specs with basic output'
8
+ Spec::Rake::SpecTask.new(:run) do |t|
9
+ t.spec_opts = PROJ.spec_opts
10
+ t.spec_files = PROJ.specs
11
+ t.libs += PROJ.libs
12
+ end
13
+
14
+ desc 'Run all specs with text output'
15
+ Spec::Rake::SpecTask.new(:specdoc) do |t|
16
+ t.spec_opts = PROJ.spec_opts + ['--format', 'specdoc']
17
+ t.spec_files = PROJ.specs
18
+ t.libs += PROJ.libs
19
+ end
20
+
21
+ if HAVE_RCOV
22
+ desc 'Run all specs with RCov'
23
+ Spec::Rake::SpecTask.new(:rcov) do |t|
24
+ t.spec_opts = PROJ.spec_opts
25
+ t.spec_files = PROJ.specs
26
+ t.libs += PROJ.libs
27
+ t.rcov = true
28
+ t.rcov_opts = PROJ.rcov_opts + ['--exclude', 'spec']
29
+ end
30
+ end
31
+
32
+ end # namespace :spec
33
+
34
+ desc 'Alias to spec:run'
35
+ task :spec => 'spec:run'
36
+
37
+ task :clobber => 'spec:clobber_rcov' if HAVE_RCOV
38
+
39
+ remove_desc_for_task %w(spec:clobber_rcov)
40
+
41
+ end # if HAVE_SPEC_RAKE_SPECTASK
42
+
43
+ # EOF
data/tasks/svn.rake ADDED
@@ -0,0 +1,44 @@
1
+ # $Id$
2
+
3
+
4
+ if PROJ.svn and system("svn --version 2>&1 > #{DEV_NULL}")
5
+
6
+ unless PROJ.svn_root
7
+ info = %x/svn info ./
8
+ m = %r/^Repository Root:\s+(.*)$/.match(info)
9
+ PROJ.svn_root = (m.nil? ? '' : m[1])
10
+ end
11
+ PROJ.svn_root = File.join(PROJ.svn_root, PROJ.svn) if String === PROJ.svn
12
+
13
+ namespace :svn do
14
+
15
+ desc 'Show tags from the SVN repository'
16
+ task :show_tags do |t|
17
+ tags = %x/svn list #{File.join(PROJ.svn_root, PROJ.svn_tags)}/
18
+ tags.gsub!(%r/\/$/, '')
19
+ puts tags
20
+ end
21
+
22
+ desc 'Create a new tag in the SVN repository'
23
+ task :create_tag do |t|
24
+ v = ENV['VERSION'] or abort 'Must supply VERSION=x.y.z'
25
+ abort "Versions don't match #{v} vs #{PROJ.version}" if v != PROJ.version
26
+
27
+ trunk = File.join(PROJ.svn_root, PROJ.svn_trunk)
28
+ tag = "%s-%s" % [PROJ.name, PROJ.version]
29
+ tag = File.join(PROJ.svn_root, PROJ.svn_tags, tag)
30
+ msg = "Creating tag for #{PROJ.name} version #{PROJ.version}"
31
+
32
+ puts "Creating SVN tag '#{tag}'"
33
+ unless system "svn cp -m '#{msg}' #{trunk} #{tag}"
34
+ abort "Tag creation failed"
35
+ end
36
+ end
37
+
38
+ end # namespace :svn
39
+
40
+ task 'gem:release' => 'svn:create_tag'
41
+
42
+ end # if PROJ.svn
43
+
44
+ # EOF
data/tasks/test.rake ADDED
@@ -0,0 +1,40 @@
1
+ # $Id$
2
+
3
+ require 'rake/testtask'
4
+
5
+ namespace :test do
6
+
7
+ Rake::TestTask.new(:run) do |t|
8
+ t.libs = PROJ.libs
9
+ t.test_files = if test ?f, PROJ.test_file then [PROJ.test_file]
10
+ else PROJ.tests end
11
+ t.ruby_opts += PROJ.ruby_opts
12
+ t.ruby_opts += PROJ.test_opts
13
+ end
14
+
15
+ if HAVE_RCOV
16
+ desc 'Run rcov on the unit tests'
17
+ task :rcov => :clobber_rcov do
18
+ opts = PROJ.rcov_opts.join(' ')
19
+ files = if test ?f, PROJ.test_file then [PROJ.test_file]
20
+ else PROJ.tests end
21
+ files = files.join(' ')
22
+ sh "#{RCOV} #{files} #{opts}"
23
+ end
24
+
25
+ desc 'Remove rcov products'
26
+ task :clobber_rcov do
27
+ rm_r 'coverage' rescue nil
28
+ end
29
+ end
30
+
31
+ end # namespace :test
32
+
33
+ desc 'Alias to test:run'
34
+ task :test => 'test:run'
35
+
36
+ task :clobber => 'test:clobber_rcov' if HAVE_RCOV
37
+
38
+ remove_desc_for_task %w(test:clobber_rcov)
39
+
40
+ # EOF
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rmmseg
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - pluskid
@@ -9,18 +9,10 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-02-01 00:00:00 +08:00
12
+ date: 2008-02-05 00:00:00 -08:00
13
13
  default_executable:
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: hoe
17
- version_requirement:
18
- version_requirements: !ruby/object:Gem::Requirement
19
- requirements:
20
- - - ">="
21
- - !ruby/object:Gem::Version
22
- version: 1.5.0
23
- version:
14
+ dependencies: []
15
+
24
16
  description: "RMMSeg is an implementation of MMSEG Chinese word segmentation algorithm. It is based on two variants of maximum matching algorithms. Two algorithms are available for using: * simple algorithm that uses only forward maximum matching. * complex algorithm that uses three-word chunk maximum matching and 3 aditonal rules to solve ambiguities. For more information about the algorithm, please refer to the following essays: * http://technology.chtsai.org/mmseg/ * http://pluskid.lifegoo.com/?p=261"
25
17
  email: pluskid@gmail.com
26
18
  executables:
@@ -29,9 +21,9 @@ extensions: []
29
21
 
30
22
  extra_rdoc_files:
31
23
  - History.txt
32
- - Manifest.txt
33
24
  - README.txt
34
25
  - TODO.txt
26
+ - bin/rmmseg
35
27
  files:
36
28
  - History.txt
37
29
  - Manifest.txt
@@ -72,6 +64,17 @@ files:
72
64
  - spec/spec_helper.rb
73
65
  - spec/svwl_rule_spec.rb
74
66
  - spec/word_spec.rb
67
+ - tasks/annotations.rake
68
+ - tasks/doc.rake
69
+ - tasks/gem.rake
70
+ - tasks/homepage.rake
71
+ - tasks/manifest.rake
72
+ - tasks/post_load.rake
73
+ - tasks/rubyforge.rake
74
+ - tasks/setup.rb
75
+ - tasks/spec.rake
76
+ - tasks/svn.rake
77
+ - tasks/test.rake
75
78
  has_rdoc: true
76
79
  homepage: http://rmmseg.rubyforge.org
77
80
  post_install_message:
@@ -98,6 +101,6 @@ rubyforge_project: rmmseg
98
101
  rubygems_version: 1.0.1
99
102
  signing_key:
100
103
  specification_version: 2
101
- summary: RMMSeg is an implementation of MMSEG algorithm in Ruby. MMSEG is a Chinese segmentation algorithm based on two variants of maximum matching. RMMSeg can be used as a stand alone program or as an Analyzer of Ferret.
104
+ summary: RMMSeg is an implementation of MMSEG Chinese word segmentation algorithm
102
105
  test_files: []
103
106