text_detector 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +12 -0
- data/.rspec +2 -0
- data/.travis.yml +3 -0
- data/Gemfile +4 -0
- data/README.md +41 -0
- data/Rakefile +7 -0
- data/bin/benchmark +125 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/lib/text_detector/detector/base.rb +21 -0
- data/lib/text_detector/detector/regexp.rb +18 -0
- data/lib/text_detector/detector/simple.rb +25 -0
- data/lib/text_detector/detector.rb +17 -0
- data/lib/text_detector/dictionary/base.rb +23 -0
- data/lib/text_detector/dictionary/file.rb +36 -0
- data/lib/text_detector/dictionary.rb +12 -0
- data/lib/text_detector/executor.rb +14 -0
- data/lib/text_detector/version.rb +3 -0
- data/lib/text_detector.rb +13 -0
- data/text_detector.gemspec +25 -0
- metadata +106 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 527080011ed97c18c7c900d0b9abdf52ff75f0f9
|
4
|
+
data.tar.gz: ef29428804f699210fac218d30dcb9ab8633820b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ddaaecd37594997719d38c5fdc6d96cac0efb7b9187ea9e5dedb16dda16bf8a4b5cad05988204d1c859186840feb9771eb5964a7713144764a0c1f43237c40e5
|
7
|
+
data.tar.gz: c6c3ebd4af514c0ae1f3d86a8625ba0dcdb4c25b69d3d20bf96e33157a03bfa8dff09f1607738534381694fc9feccb1285fe9e1384e5e3248409ab4fa5c2d6a8
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
[![Build Status](https://travis-ci.org/koshigoe/text_detector.svg)](https://travis-ci.org/koshigoe/text_detector)
|
2
|
+
|
3
|
+
# TextDetector
|
4
|
+
|
5
|
+
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/text_detector`. To experiment with that code, run `bin/console` for an interactive prompt.
|
6
|
+
|
7
|
+
TODO: Delete this and the text above, and describe your gem
|
8
|
+
|
9
|
+
## Installation
|
10
|
+
|
11
|
+
Add this line to your application's Gemfile:
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
gem 'text_detector'
|
15
|
+
```
|
16
|
+
|
17
|
+
And then execute:
|
18
|
+
|
19
|
+
$ bundle
|
20
|
+
|
21
|
+
Or install it yourself as:
|
22
|
+
|
23
|
+
$ gem install text_detector
|
24
|
+
|
25
|
+
## Usage
|
26
|
+
|
27
|
+
TODO: Write usage instructions here
|
28
|
+
|
29
|
+
## Development
|
30
|
+
|
31
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
|
32
|
+
|
33
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
34
|
+
|
35
|
+
## Contributing
|
36
|
+
|
37
|
+
1. Fork it ( https://github.com/[my-github-username]/text_detector/fork )
|
38
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
39
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
40
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
41
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
data/bin/benchmark
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
4
|
+
|
5
|
+
require 'benchmark'
|
6
|
+
require 'text_detector'
|
7
|
+
|
8
|
+
unless File.exists?('keywordlist_furigana.csv')
|
9
|
+
require 'open-uri'
|
10
|
+
puts 'Download hatena keyword list.'
|
11
|
+
open('http://d.hatena.ne.jp/images/keyword/keywordlist_furigana.csv', 'rb') do |input|
|
12
|
+
open('keywordlist_furigana.csv', 'w') do |output|
|
13
|
+
output.write input.read
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
unless File.exists?('dictionary.txt')
|
19
|
+
require 'nkf'
|
20
|
+
puts 'Create dictionary.txt'
|
21
|
+
open('keywordlist_furigana.csv', 'rb') do |input|
|
22
|
+
open('dictionary.txt', 'w') do |output|
|
23
|
+
input.each_line do |line|
|
24
|
+
output.puts NKF.nkf('-Ew', line.chomp.split("\t")[1])
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
unless File.exists?('mini-dictionary.txt')
|
31
|
+
require 'nkf'
|
32
|
+
puts 'Create mini-dictionary.txt'
|
33
|
+
open('keywordlist_furigana.csv', 'rb') do |input|
|
34
|
+
open('mini-dictionary.txt', 'w') do |output|
|
35
|
+
i = 0
|
36
|
+
input.each_line do |line|
|
37
|
+
break if (i+=1) > 10000
|
38
|
+
output.puts NKF.nkf('-Ew', line.chomp.split("\t")[1])
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
testdata = []
|
45
|
+
DATA.each_line do |line|
|
46
|
+
testdata << line.chomp
|
47
|
+
end
|
48
|
+
|
49
|
+
simple_detector = TextDetector.factory(:simple, open('dictionary.txt'))
|
50
|
+
regexp_detector = TextDetector.factory(:regexp, open('dictionary.txt'))
|
51
|
+
mini_simple_detector = TextDetector.factory(:simple, open('mini-dictionary.txt'))
|
52
|
+
mini_regexp_detector = TextDetector.factory(:regexp, open('mini-dictionary.txt'))
|
53
|
+
|
54
|
+
results = { simple: [], regexp: [] }
|
55
|
+
Benchmark.bm do |x|
|
56
|
+
x.report do
|
57
|
+
testdata.each do |text|
|
58
|
+
results[:simple] << simple_detector.detect(text)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
x.report do
|
63
|
+
testdata.each do |text|
|
64
|
+
results[:regexp] << regexp_detector.detect(text)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
x.report do
|
69
|
+
testdata.each do |text|
|
70
|
+
results[:simple] << mini_simple_detector.detect(text)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
x.report do
|
75
|
+
testdata.each do |text|
|
76
|
+
results[:regexp] << mini_regexp_detector.detect(text)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
if results[:simple] == results[:regexp]
|
82
|
+
puts 'ok'
|
83
|
+
else
|
84
|
+
puts 'ng'
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
__END__
|
89
|
+
吾輩《わがはい》は猫である。名前はまだ無い。
|
90
|
+
どこで生れたかとんと見当《けんとう》がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番|獰悪《どうあく》な種族であったそうだ。この書生というのは時々我々を捕《つかま》えて煮《に》て食うという話である。しかしその当時は何という考もなかったから別段恐しいとも思わなかった。ただ彼の掌《てのひら》に載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始《みはじめ》であろう。この時妙なものだと思った感じが今でも残っている。第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶《やかん》だ。その後《ご》猫にもだいぶ逢《あ》ったがこんな片輪《かたわ》には一度も出会《でく》わした事がない。のみならず顔の真中があまりに突起している。そうしてその穴の中から時々ぷうぷうと煙《けむり》を吹く。どうも咽《む》せぽくて実に弱った。これが人間の飲む煙草《たばこ》というものである事はようやくこの頃知った。
|
91
|
+
この書生の掌の裏《うち》でしばらくはよい心持に坐っておったが、しばらくすると非常な速力で運転し始めた。書生が動くのか自分だけが動くのか分らないが無暗《むやみ》に眼が廻る。胸が悪くなる。到底《とうてい》助からないと思っていると、どさりと音がして眼から火が出た。それまでは記憶しているがあとは何の事やらいくら考え出そうとしても分らない。
|
92
|
+
ふと気が付いて見ると書生はいない。たくさんおった兄弟が一|疋《ぴき》も見えぬ。肝心《かんじん》の母親さえ姿を隠してしまった。その上|今《いま》までの所とは違って無暗《むやみ》に明るい。眼を明いていられぬくらいだ。はてな何でも容子《ようす》がおかしいと、のそのそ這《は》い出して見ると非常に痛い。吾輩は藁《わら》の上から急に笹原の中へ棄てられたのである。
|
93
|
+
ようやくの思いで笹原を這い出すと向うに大きな池がある。吾輩は池の前に坐ってどうしたらよかろうと考えて見た。別にこれという分別《ふんべつ》も出ない。しばらくして泣いたら書生がまた迎に来てくれるかと考え付いた。ニャー、ニャーと試みにやって見たが誰も来ない。そのうち池の上をさらさらと風が渡って日が暮れかかる。腹が非常に減って来た。泣きたくても声が出ない。仕方がない、何でもよいから食物《くいもの》のある所まであるこうと決心をしてそろりそろりと池を左《ひだ》りに廻り始めた。どうも非常に苦しい。そこを我慢して無理やりに這《は》って行くとようやくの事で何となく人間臭い所へ出た。ここへ這入《はい》ったら、どうにかなると思って竹垣の崩《くず》れた穴から、とある邸内にもぐり込んだ。縁は不思議なもので、もしこの竹垣が破れていなかったなら、吾輩はついに路傍《ろぼう》に餓死《がし》したかも知れんのである。一樹の蔭とはよく云《い》ったものだ。この垣根の穴は今日《こんにち》に至るまで吾輩が隣家《となり》の三毛を訪問する時の通路になっている。さて邸《やしき》へは忍び込んだもののこれから先どうして善《い》いか分らない。そのうちに暗くなる、腹は減る、寒さは寒し、雨が降って来るという始末でもう一刻の猶予《ゆうよ》が出来なくなった。仕方がないからとにかく明るくて暖かそうな方へ方へとあるいて行く。今から考えるとその時はすでに家の内に這入っておったのだ。ここで吾輩は彼《か》の書生以外の人間を再び見るべき機会に遭遇《そうぐう》したのである。第一に逢ったのがおさんである。これは前の書生より一層乱暴な方で吾輩を見るや否やいきなり頸筋《くびすじ》をつかんで表へ抛《ほう》り出した。いやこれは駄目だと思ったから眼をねぶって運を天に任せていた。しかしひもじいのと寒いのにはどうしても我慢が出来ん。吾輩は再びおさんの隙《すき》を見て台所へ這《は》い上《あが》った。すると間もなくまた投げ出された。吾輩は投げ出されては這い上り、這い上っては投げ出され、何でも同じ事を四五遍繰り返したのを記憶している。その時におさんと云う者はつくづくいやになった。この間おさんの三馬《さんま》を偸《ぬす》んでこの返報をしてやってから、やっと胸の痞《つかえ》が下りた。吾輩が最後につまみ出されようとしたときに、この家《うち》の主人が騒々しい何だといいながら出て来た。下女は吾輩をぶら下げて主人の方へ向けてこの宿《やど》なしの小猫がいくら出しても出しても御台所《おだいどころ》へ上《あが》って来て困りますという。主人は鼻の下の黒い毛を撚《ひね》りながら吾輩の顔をしばらく眺《なが》めておったが、やがてそんなら内へ置いてやれといったまま奥へ這入《はい》ってしまった。主人はあまり口を聞かぬ人と見えた。下女は口惜《くや》しそうに吾輩を台所へ抛《ほう》り出した。かくして吾輩はついにこの家《うち》を自分の住家《すみか》と極《き》める事にしたのである。
|
94
|
+
吾輩の主人は滅多《めった》に吾輩と顔を合せる事がない。職業は教師だそうだ。学校から帰ると終日書斎に這入ったぎりほとんど出て来る事がない。家のものは大変な勉強家だと思っている。当人も勉強家であるかのごとく見せている。しかし実際はうちのものがいうような勤勉家ではない。吾輩は時々忍び足に彼の書斎を覗《のぞ》いて見るが、彼はよく昼寝《ひるね》をしている事がある。時々読みかけてある本の上に涎《よだれ》をたらしている。彼は胃弱で皮膚の色が淡黄色《たんこうしょく》を帯びて弾力のない不活溌《ふかっぱつ》な徴候をあらわしている。その癖に大飯を食う。大飯を食った後《あと》でタカジヤスターゼを飲む。飲んだ後で書物をひろげる。二三ページ読むと眠くなる。涎を本の上へ垂らす。これが彼の毎夜繰り返す日課である。吾輩は猫ながら時々考える事がある。教師というものは実に楽《らく》なものだ。人間と生れたら教師となるに限る。こんなに寝ていて勤まるものなら猫にでも出来ぬ事はないと。それでも主人に云わせると教師ほどつらいものはないそうで彼は友達が来る度《たび》に何とかかんとか不平を鳴らしている。
|
95
|
+
吾輩がこの家へ住み込んだ当時は、主人以外のものにははなはだ不人望であった。どこへ行っても跳《は》ね付けられて相手にしてくれ手がなかった。いかに珍重されなかったかは、今日《こんにち》に至るまで名前さえつけてくれないのでも分る。吾輩は仕方がないから、出来得る限り吾輩を入れてくれた主人の傍《そば》にいる事をつとめた。朝主人が新聞を読むときは必ず彼の膝《ひざ》の上に乗る。彼が昼寝をするときは必ずその背中《せなか》に乗る。これはあながち主人が好きという訳ではないが別に構い手がなかったからやむを得んのである。その後いろいろ経験の上、朝は飯櫃《めしびつ》の上、夜は炬燵《こたつ》の上、天気のよい昼は椽側《えんがわ》へ寝る事とした。しかし一番心持の好いのは夜《よ》に入《い》ってここのうちの小供の寝床へもぐり込んでいっしょにねる事である。この小供というのは五つと三つで夜になると二人が一つ床へ入《はい》って一間《ひとま》へ寝る。吾輩はいつでも彼等の中間に己《おの》れを容《い》るべき余地を見出《みいだ》してどうにか、こうにか割り込むのであるが、運悪く小供の一人が眼を醒《さ》ますが最後大変な事になる。小供は——ことに小さい方が質《たち》がわるい——猫が来た猫が来たといって夜中でも何でも大きな声で泣き出すのである。すると例の神経胃弱性の主人は必《かなら》ず眼をさまして次の部屋から飛び出してくる。現にせんだってなどは物指《ものさし》で尻ぺたをひどく叩《たた》かれた。
|
96
|
+
吾輩は人間と同居して彼等を観察すればするほど、彼等は我儘《わがまま》なものだと断言せざるを得ないようになった。ことに吾輩が時々|同衾《どうきん》する小供のごときに至っては言語同断《ごんごどうだん》である。自分の勝手な時は人を逆さにしたり、頭へ袋をかぶせたり、抛《ほう》り出したり、へっつい[#「へっつい」に傍点]の中へ押し込んだりする。しかも吾輩の方で少しでも手出しをしようものなら家内《かない》総がかりで追い廻して迫害を加える。この間もちょっと畳で爪を磨《と》いだら細君が非常に怒《おこ》ってそれから容易に座敷へ入《い》れない。台所の板の間で他《ひと》が顫《ふる》えていても一向《いっこう》平気なものである。吾輩の尊敬する筋向《すじむこう》の白君などは逢《あ》う度毎《たびごと》に人間ほど不人情なものはないと言っておらるる。白君は先日玉のような子猫を四疋|産《う》まれたのである。ところがそこの家《うち》の書生が三日目にそいつを裏の池へ持って行って四疋ながら棄てて来たそうだ。白君は涙を流してその一部始終を話した上、どうしても我等|猫族《ねこぞく》が親子の愛を完《まった》くして美しい家族的生活をするには人間と戦ってこれを剿滅《そうめつ》せねばならぬといわれた。一々もっともの議論と思う。また隣りの三毛《みけ》君などは人間が所有権という事を解していないといって大《おおい》に憤慨している。元来我々同族間では目刺《めざし》の頭でも鰡《ぼら》の臍《へそ》でも一番先に見付けたものがこれを食う権利があるものとなっている。もし相手がこの規約を守らなければ腕力に訴えて善《よ》いくらいのものだ。しかるに彼等人間は毫《ごう》もこの観念がないと見えて我等が見付けた御馳走は必ず彼等のために掠奪《りゃくだつ》せらるるのである。彼等はその強力を頼んで正当に吾人が食い得べきものを奪《うば》ってすましている。白君は軍人の家におり三毛君は代言の主人を持っている。吾輩は教師の家に住んでいるだけ、こんな事に関すると両君よりもむしろ楽天である。ただその日その日がどうにかこうにか送られればよい。いくら人間だって、そういつまでも栄える事もあるまい。まあ気を永く猫の時節を待つがよかろう。
|
97
|
+
我儘《わがまま》で思い出したからちょっと吾輩の家の主人がこの我儘で失敗した話をしよう。元来この主人は何といって人に勝《すぐ》れて出来る事もないが、何にでもよく手を出したがる。俳句をやってほととぎす[#「ほととぎす」に傍点]へ投書をしたり、新体詩を明星[#「明星」に傍点]へ出したり、間違いだらけの英文をかいたり、時によると弓に凝《こ》ったり、謡《うたい》を習ったり、またあるときはヴァイオリンなどをブーブー鳴らしたりするが、気の毒な事には、どれもこれも物になっておらん。その癖やり出すと胃弱の癖にいやに熱心だ。後架《こうか》の中で謡をうたって、近所で後架先生《こうかせんせい》と渾名《あだな》をつけられているにも関せず一向《いっこう》平気なもので、やはりこれは平《たいら》の宗盛《むねもり》にて候《そうろう》を繰返している。みんながそら宗盛だと吹き出すくらいである。この主人がどういう考になったものか吾輩の住み込んでから一月ばかり後《のち》のある月の月給日に、大きな包みを提《さ》げてあわただしく帰って来た。何を買って来たのかと思うと水彩絵具と毛筆とワットマンという紙で今日から謡や俳句をやめて絵をかく決心と見えた。果して翌日から当分の間というものは毎日毎日書斎で昼寝もしないで絵ばかりかいている。しかしそのかき上げたものを見ると何をかいたものやら誰にも鑑定がつかない。当人もあまり甘《うま》くないと思ったものか、ある日その友人で美学とかをやっている人が来た時に下《しも》のような話をしているのを聞いた。
|
98
|
+
「どうも甘《うま》くかけないものだね。人のを見ると何でもないようだが自《みずか》ら筆をとって見ると今更《いまさら》のようにむずかしく感ずる」これは主人の述懐《じゅっかい》である。なるほど詐《いつわ》りのない処だ。彼の友は金縁の眼鏡越《めがねごし》に主人の顔を見ながら、「そう初めから上手にはかけないさ、第一室内の想像ばかりで画《え》がかける訳のものではない。昔《むか》し以太利《イタリー》の大家アンドレア・デル・サルトが言った事がある。画をかくなら何でも自然その物を写せ。天に星辰《せいしん》あり。地に露華《ろか》あり。飛ぶに禽《とり》あり。走るに獣《けもの》あり。池に金魚あり。枯木《こぼく》に寒鴉《かんあ》あり。自然はこれ一幅の大活画《だいかつが》なりと。どうだ君も画らしい画をかこうと思うならちと写生をしたら」
|
99
|
+
「へえアンドレア・デル・サルトがそんな事をいった事があるかい。ちっとも知らなかった。なるほどこりゃもっともだ。実にその通りだ」と主人は無暗《むやみ》に感心している。金縁の裏には嘲《あざ》けるような笑《わらい》が見えた。
|
100
|
+
その翌日吾輩は例のごとく椽側《えんがわ》に出て心持善く昼寝《ひるね》をしていたら、主人が例になく書斎から出て来て吾輩の後《うし》ろで何かしきりにやっている。ふと眼が覚《さ》めて何をしているかと一分《いちぶ》ばかり細目に眼をあけて見ると、彼は余念もなくアンドレア・デル・サルトを極《き》め込んでいる。吾輩はこの有様を見て覚えず失笑するのを禁じ得なかった。彼は彼の友に揶揄《やゆ》せられたる結果としてまず手初めに吾輩を写生しつつあるのである。吾輩はすでに十分《じゅうぶん》寝た。欠伸《あくび》がしたくてたまらない。しかしせっかく主人が熱心に筆を執《と》っているのを動いては気の毒だと思って、じっと辛棒《しんぼう》しておった。彼は今吾輩の輪廓をかき上げて顔のあたりを色彩《いろど》っている。吾輩は自白する。吾輩は猫として決して上乗の出来ではない。背といい毛並といい顔の造作といいあえて他の猫に勝《まさ》るとは決して思っておらん。しかしいくら不器量の吾輩でも、今吾輩の主人に描《えが》き出されつつあるような妙な姿とは、どうしても思われない。第一色が違う。吾輩は波斯産《ペルシャさん》の猫のごとく黄を含める淡灰色に漆《うるし》のごとき斑入《ふい》りの皮膚を有している。これだけは誰が見ても疑うべからざる事実と思う。しかるに今主人の彩色を見ると、黄でもなければ黒でもない、灰色でもなければ褐色《とびいろ》でもない、さればとてこれらを交ぜた色でもない。ただ一種の色であるというよりほかに評し方のない色である。その上不思議な事は眼がない。もっともこれは寝ているところを写生したのだから無理もないが眼らしい所さえ見えないから盲猫《めくら》だか寝ている猫だか判然しないのである。吾輩は心中ひそかにいくらアンドレア・デル・サルトでもこれではしようがないと思った。しかしその熱心には感服せざるを得ない。なるべくなら動かずにおってやりたいと思ったが、さっきから小便が催うしている。身内《みうち》の筋肉はむずむずする。最早《もはや》一分も猶予《ゆうよ》が出来ぬ仕儀《しぎ》となったから、やむをえず失敬して両足を前へ存分のして、首を低く押し出してあーあと大《だい》なる欠伸をした。さてこうなって見ると、もうおとなしくしていても仕方がない。どうせ主人の予定は打《ぶ》ち壊《こ》わしたのだから、ついでに裏へ行って用を足《た》そうと思ってのそのそ這い出した。すると主人は失望と怒りを掻《か》き交ぜたような声をして、座敷の中から「この馬鹿野郎」と怒鳴《どな》った。この主人は人を罵《ののし》るときは必ず馬鹿野郎というのが癖である。ほかに悪口の言いようを知らないのだから仕方がないが、今まで辛棒した人の気も知らないで、無暗《むやみ》に馬鹿野郎|呼《よば》わりは失敬だと思う。それも平生吾輩が彼の背中《せなか》へ乗る時に少しは好い顔でもするならこの漫罵《まんば》も甘んじて受けるが、こっちの便利になる事は何一つ快くしてくれた事もないのに、小便に立ったのを馬鹿野郎とは酷《ひど》い。元来人間というものは自己の力量に慢じてみんな増長している。少し人間より強いものが出て来て窘《いじ》めてやらなくてはこの先どこまで増長するか分らない。
|
101
|
+
我儘《わがまま》もこのくらいなら我慢するが吾輩は人間の不徳についてこれよりも数倍悲しむべき報道を耳にした事がある。
|
102
|
+
吾輩の家の裏に十坪ばかりの茶園《ちゃえん》がある。広くはないが瀟洒《さっぱり》とした心持ち好く日の当《あた》る所だ。うちの小供があまり騒いで楽々昼寝の出来ない時や、あまり退屈で腹加減のよくない折などは、吾輩はいつでもここへ出て浩然《こうぜん》の気を養うのが例である。ある小春の穏かな日の二時頃であったが、吾輩は昼飯後《ちゅうはんご》快よく一睡した後《のち》、運動かたがたこの茶園へと歩《ほ》を運ばした。茶の木の根を一本一本嗅ぎながら、西側の杉垣のそばまでくると、枯菊を押し倒してその上に大きな猫が前後不覚に寝ている。彼は吾輩の近づくのも一向《いっこう》心付かざるごとく、また心付くも無頓着なるごとく、大きな鼾《いびき》をして長々と体を横《よこた》えて眠っている。他《ひと》の庭内に忍び入りたるものがかくまで平気に睡《ねむ》られるものかと、吾輩は窃《ひそ》かにその大胆なる度胸に驚かざるを得なかった。彼は純粋の黒猫である。わずかに午《ご》を過ぎたる太陽は、透明なる光線を彼の皮膚の上に抛《な》げかけて、きらきらする柔毛《にこげ》の間より眼に見えぬ炎でも燃《も》え出《い》ずるように思われた。彼は猫中の大王とも云うべきほどの偉大なる体格を有している。吾輩の倍はたしかにある。吾輩は嘆賞の念と、好奇の心に前後を忘れて彼の前に佇立《ちょりつ》して余念もなく眺《なが》めていると、静かなる小春の風が、杉垣の上から出たる梧桐《ごとう》の枝を軽《かろ》く誘ってばらばらと二三枚の葉が枯菊の茂みに落ちた。大王はかっとその真丸《まんまる》の眼を開いた。今でも記憶している。その眼は人間の珍重する琥珀《こはく》というものよりも遥《はる》かに美しく輝いていた。彼は身動きもしない。双眸《そうぼう》の奥から射るごとき光を吾輩の矮小《わいしょう》なる額《ひたい》の上にあつめて、御めえ[#「御めえ」に傍点]は一体何だと云った。大王にしては少々言葉が卑《いや》しいと思ったが何しろその声の底に犬をも挫《ひ》しぐべき力が籠《こも》っているので吾輩は少なからず恐れを抱《いだ》いた。しかし挨拶《あいさつ》をしないと険呑《けんのん》だと思ったから「吾輩は猫である。名前はまだない」となるべく平気を装《よそお》って冷然と答えた。しかしこの時吾輩の心臓はたしかに平時よりも烈しく鼓動しておった。彼は大《おおい》に軽蔑《けいべつ》せる調子で「何、猫だ? 猫が聞いてあきれらあ。全《ぜん》てえどこに住んでるんだ」随分|傍若無人《ぼうじゃくぶじん》である。「吾輩はここの教師の家《うち》にいるのだ」「どうせそんな事だろうと思った。いやに瘠《や》せてるじゃねえか」と大王だけに気焔《きえん》を吹きかける。言葉付から察するとどうも良家の猫とも思われない。しかしその膏切《あぶらぎ》って肥満しているところを見ると御馳走を食ってるらしい、豊かに暮しているらしい。吾輩は「そう云う君は一体誰だい」と聞かざるを得なかった。「己《お》れあ車屋の黒《くろ》よ」昂然《こうぜん》たるものだ。車屋の黒はこの近辺で知らぬ者なき乱暴猫である。しかし車屋だけに強いばかりでちっとも教育がないからあまり誰も交際しない。同盟敬遠主義の的《まと》になっている奴だ。吾輩は彼の名を聞いて少々尻こそばゆき感じを起すと同時に、一方では少々|軽侮《けいぶ》の念も生じたのである。吾輩はまず彼がどのくらい無学であるかを試《ため》してみようと思って左《さ》の問答をして見た。
|
103
|
+
「一体車屋と教師とはどっちがえらいだろう」
|
104
|
+
「車屋の方が強いに極《きま》っていらあな。御めえ[#「御めえ」に傍点]のうち[#「うち」に傍点]の主人を見ねえ、まるで骨と皮ばかりだぜ」
|
105
|
+
「君も車屋の猫だけに大分《だいぶ》強そうだ。車屋にいると御馳走《ごちそう》が食えると見えるね」
|
106
|
+
「何《なあ》におれ[#「おれ」に傍点]なんざ、どこの国へ行ったって食い物に不自由はしねえつもりだ。御めえ[#「御めえ」に傍点]なんかも茶畠《ちゃばたけ》ばかりぐるぐる廻っていねえで、ちっと己《おれ》の後《あと》へくっ付いて来て見ねえ。一と月とたたねえうちに見違えるように太れるぜ」
|
107
|
+
「追ってそう願う事にしよう。しかし家《うち》は教師の方が車屋より大きいのに住んでいるように思われる」
|
108
|
+
「箆棒《べらぼう》め、うちなんかいくら大きくたって腹の足《た》しになるもんか」
|
109
|
+
彼は大《おおい》に肝癪《かんしゃく》に障《さわ》った様子で、寒竹《かんちく》をそいだような耳をしきりとぴく付かせてあららかに立ち去った。吾輩が車屋の黒と知己《ちき》になったのはこれからである。
|
110
|
+
その後《ご》吾輩は度々《たびたび》黒と邂逅《かいこう》する。邂逅する毎《ごと》に彼は車屋相当の気焔《きえん》を吐く。先に吾輩が耳にしたという不徳事件も実は黒から聞いたのである。
|
111
|
+
或る日例のごとく吾輩と黒は暖かい茶畠《ちゃばたけ》の中で寝転《ねころ》びながらいろいろ雑談をしていると、彼はいつもの自慢話《じまんばな》しをさも新しそうに繰り返したあとで、吾輩に向って下《しも》のごとく質問した。「御めえ[#「御めえ」に傍点]は今までに鼠を何匹とった事がある」智識は黒よりも余程発達しているつもりだが腕力と勇気とに至っては到底《とうてい》黒の比較にはならないと覚悟はしていたものの、この問に接したる時は、さすがに極《きま》りが善《よ》くはなかった。けれども事実は事実で詐《いつわ》る訳には行かないから、吾輩は「実はとろうとろうと思ってまだ捕《と》らない」と答えた。黒は彼の鼻の先からぴんと突張《つっぱ》っている長い髭《ひげ》をびりびりと震《ふる》わせて非常に笑った。元来黒は自慢をする丈《だけ》にどこか足りないところがあって、彼の気焔《きえん》を感心したように咽喉《のど》をころころ鳴らして謹聴していればはなはだ御《ぎょ》しやすい猫である。吾輩は彼と近付になってから直《すぐ》にこの呼吸を飲み込んだからこの場合にもなまじい己《おの》れを弁護してますます形勢をわるくするのも愚《ぐ》である、いっその事彼に自分の手柄話をしゃべらして御茶を濁すに若《し》くはないと思案を定《さだ》めた。そこでおとなしく「君などは年が年であるから大分《だいぶん》とったろう」とそそのかして見た。果然彼は墻壁《しょうへき》の欠所《けっしょ》に吶喊《とっかん》して来た。「たんとでもねえが三四十はとったろう」とは得意気なる彼の答であった。彼はなお語をつづけて「鼠の百や二百は一人でいつでも引き受けるがいたち[#「いたち」に傍点]ってえ奴は手に合わねえ。一度いたち[#「いたち」に傍点]に向って酷《ひど》い目に逢《あ》った」「へえなるほど」と相槌《あいづち》を打つ。黒は大きな眼をぱちつかせて云う。「去年の大掃除の時だ。うちの亭主が石灰《いしばい》の袋を持って椽《えん》の下へ這《は》い込んだら御めえ[#「御めえ」に傍点]大きないたち[#「いたち」に傍点]の野郎が面喰《めんくら》って飛び出したと思いねえ」「ふん」と感心して見せる。「いたち[#「いたち」に傍点]ってけども何鼠の少し大きいぐれえのものだ。こん畜生《ちきしょう》って気で追っかけてとうとう泥溝《どぶ》の中へ追い込んだと思いねえ」「うまくやったね」と喝采《かっさい》してやる。「ところが御めえ[#「御めえ」に傍点]いざってえ段になると奴め最後《さいご》っ屁《ぺ》をこきゃがった。臭《くせ》えの臭くねえのってそれからってえものはいたち[#「いたち」に傍点]を見ると胸が悪くならあ」彼はここに至ってあたかも去年の臭気を今《いま》なお感ずるごとく前足を揚げて鼻の頭を二三遍なで廻わした。吾輩も少々気の毒な感じがする。ちっと景気を付けてやろうと思って「しかし鼠なら君に睨《にら》まれては百年目だろう。君はあまり鼠を捕《と》るのが名人で鼠ばかり食うものだからそんなに肥って色つやが善いのだろう」黒の御機嫌をとるためのこの質問は不思議にも反対の結果を呈出《ていしゅつ》した。彼は喟然《きぜん》として大息《たいそく》していう。「考《かん》げえるとつまらねえ。いくら稼いで鼠をとったって——一てえ人間ほどふてえ奴は世の中にいねえぜ。人のとった鼠をみんな取り上げやがって交番へ持って行きゃあがる。交番じゃ誰が捕《と》ったか分らねえからそのたんび[#「たんび」に傍点]に五銭ずつくれるじゃねえか。うちの亭主なんか己《おれ》の御蔭でもう壱円五十銭くらい儲《もう》けていやがる癖に、碌《ろく》なものを食わせた事もありゃしねえ。おい人間てものあ体《てい》の善《い》い泥棒だぜ」さすが無学の黒もこのくらいの理窟《りくつ》はわかると見えてすこぶる怒《おこ》った容子《ようす》で背中の毛を逆立《さかだ》てている。吾輩は少々気味が悪くなったから善い加減にその場を胡魔化《ごまか》して家《うち》へ帰った。この時から吾輩は決して鼠をとるまいと決心した。しかし黒の子分になって鼠以外の御馳走を猟《あさ》ってあるく事もしなかった。御馳走を食うよりも寝ていた方が気楽でいい。教師の家《うち》にいると猫も教師のような性質になると見える。要心しないと今に胃弱になるかも知れない。
|
112
|
+
教師といえば吾輩の主人も近頃に至っては到底《とうてい》水彩画において望《のぞみ》のない事を悟ったものと見えて十二月一日の日記にこんな事をかきつけた。
|
113
|
+
[#ここから2字下げ]
|
114
|
+
○○と云う人に今日の会で始めて出逢《であ》った。あの人は大分《だいぶ》放蕩《ほうとう》をした人だと云うがなるほど通人《つうじん》らしい風采《ふうさい》をしている。こう云う質《たち》の人は女に好かれるものだから○○が放蕩をしたと云うよりも放蕩をするべく余儀なくせられたと云うのが適当であろう。あの人の妻君は芸者だそうだ、羨《うらや》ましい事である。元来放蕩家を悪くいう人の大部分は放蕩をする資格のないものが多い。また放蕩家をもって自任する連中のうちにも、放蕩する資格のないものが多い。これらは余儀なくされないのに無理に進んでやるのである。あたかも吾輩の水彩画に於けるがごときもので到底卒業する気づかいはない。しかるにも関せず、自分だけは通人だと思って済《すま》している。料理屋の酒を飲んだり待合へ這入《はい》るから通人となり得るという論が立つなら、吾輩も一廉《ひとかど》の水彩画家になり得る理窟《りくつ》だ。吾輩の水彩画のごときはかかない方がましであると同じように、愚昧《ぐまい》なる通人よりも山出しの大野暮《おおやぼ》の方が遥《はる》かに上等だ。
|
115
|
+
[#ここで字下げ終わり]
|
116
|
+
通人論《つうじんろん》はちょっと首肯《しゅこう》しかねる。また芸者の妻君を羨しいなどというところは教師としては口にすべからざる愚劣の考であるが、自己の水彩画における批評眼だけはたしかなものだ。主人はかくのごとく自知《じち》の明《めい》あるにも関せずその自惚心《うぬぼれしん》はなかなか抜けない。中二日《なかふつか》置いて十二月四日の日記にこんな事を書いている。
|
117
|
+
[#ここから2字下げ]
|
118
|
+
昨夜《ゆうべ》は僕が水彩画をかいて到底物にならんと思って、そこらに抛《ほう》って置いたのを誰かが立派な額にして欄間《らんま》に懸《か》けてくれた夢を見た。さて額になったところを見ると我ながら急に上手になった。非常に嬉しい。これなら立派なものだと独《ひと》りで眺め暮らしていると、夜が明けて眼が覚《さ》めてやはり元の通り下手である事が朝日と共に明瞭になってしまった。
|
119
|
+
[#ここで字下げ終わり]
|
120
|
+
主人は夢の裡《うち》まで水彩画の未練を背負《しょ》ってあるいていると見える。これでは水彩画家は無論|夫子《ふうし》の所謂《いわゆる》通人にもなれない質《たち》だ。
|
121
|
+
主人が水彩画を夢に見た翌日例の金縁|眼鏡《めがね》の美学者が久し振りで主人を訪問した。彼は座につくと劈頭《へきとう》第一に「画《え》はどうかね」と口を切った。主人は平気な顔をして「君の忠告に従って写生を力《つと》めているが、なるほど写生をすると今まで気のつかなかった物の形や、色の精細な変化などがよく分るようだ。西洋では昔《むか》しから写生を主張した結果|今日《こんにち》のように発達したものと思われる。さすがアンドレア・デル・サルトだ」と日記の事はおくび[#「おくび」に傍点]にも出さないで、またアンドレア・デル・サルトに感心する。美学者は笑いながら「実は君、あれは出鱈目《でたらめ》だよ」と頭を掻《か》く。「何が」と主人はまだ※[#「言+墟のつくり」、第4水準2-88-74]《いつ》わられた事に気がつかない。「何がって君のしきりに感服しているアンドレア・デル・サルトさ。あれは僕のちょっと捏造《ねつぞう》した話だ。君がそんなに真面目《まじめ》に信じようとは思わなかったハハハハ」と大喜悦の体《てい》である。吾輩は椽側でこの対話を聞いて彼の今日の日記にはいかなる事が記《しる》さるるであろうかと予《あらかじ》め想像せざるを得なかった。この美学者はこんな好《いい》加減な事を吹き散らして人を担《かつ》ぐのを唯一の楽《たのしみ》にしている男である。彼はアンドレア・デル・サルト事件が主人の情線《じょうせん》にいかなる響を伝えたかを毫《ごう》も顧慮せざるもののごとく得意になって下《しも》のような事を饒舌《しゃべ》った。「いや時々|冗談《じょうだん》を言うと人が真《ま》に受けるので大《おおい》に滑稽的《こっけいてき》美感を挑撥《ちょうはつ》するのは面白い。せんだってある学生にニコラス・ニックルベーがギボンに忠告して彼の一世の大著述なる仏国革命史を仏語で書くのをやめにして英文で出版させたと言ったら、その学生がまた馬鹿に記憶の善い男で、日本文学会の演説会で真面目に僕の話した通りを繰り返したのは滑稽であった。ところがその時の傍聴者は約百名ばかりであったが、皆熱心にそれを傾聴しておった。それからまだ面白い話がある。せんだって或る文学者のいる席でハリソンの歴史小説セオファーノの話《はな》しが出たから僕はあれは歴史小説の中《うち》で白眉《はくび》である。ことに女主人公が死ぬところは鬼気《きき》人を襲うようだと評したら、僕の向うに坐っている知らんと云った事のない先生が、そうそうあすこは実に名文だといった。それで僕はこの男もやはり僕同様この小説を読んでおらないという事を知った」神経胃弱性の主人は眼を丸くして問いかけた。「そんな出鱈目《でたらめ》をいってもし相手が読んでいたらどうするつもりだ」あたかも人を欺《あざむ》くのは差支《さしつかえ》ない、ただ化《ばけ》の皮《かわ》があらわれた時は困るじゃないかと感じたもののごとくである。美学者は少しも動じない。「なにその時《とき》ゃ別の本と間違えたとか何とか云うばかりさ」と云ってけらけら笑っている。この美学者は金縁の眼鏡は掛けているがその性質が車屋の黒に似たところがある。主人は黙って日の出を輪に吹いて吾輩にはそんな勇気はないと云わんばかりの顔をしている。美学者はそれだから画《え》をかいても駄目だという目付で「しかし冗談《じょうだん》は冗談だが画というものは実際むずかしいものだよ、レオナルド・ダ・ヴィンチは門下生に寺院の壁のしみ[#「しみ」に傍点]を写せと教えた事があるそうだ。なるほど雪隠《せついん》などに這入《はい》って雨の漏る壁を余念なく眺めていると、なかなかうまい模様画が自然に出来ているぜ。君注意して写生して見給えきっと面白いものが出来るから」「また欺《だま》すのだろう」「いえこれだけはたしかだよ。実際奇警な語じゃないか、ダ・ヴィンチでもいいそうな事だあね」「なるほど奇警には相違ないな」と主人は半分降参をした。しかし彼はまだ雪隠で写生はせぬようだ。
|
122
|
+
車屋の黒はその後《ご》跛《びっこ》になった。彼の光沢ある毛は漸々《だんだん》色が褪《さ》めて抜けて来る。吾輩が琥珀《こはく》よりも美しいと評した彼の眼には眼脂《めやに》が一杯たまっている。ことに著るしく吾輩の注意を惹《ひ》いたのは彼の元気の消沈とその体格の悪くなった事である。吾輩が例の茶園《ちゃえん》で彼に逢った最後の日、どうだと云って尋ねたら「いたち[#「いたち」に傍点]の最後屁《さいごっぺ》と肴屋《さかなや》の天秤棒《てんびんぼう》には懲々《こりごり》だ」といった。
|
123
|
+
赤松の間に二三段の紅《こう》を綴った紅葉《こうよう》は昔《むか》しの夢のごとく散ってつくばい[#「つくばい」に傍点]に近く代る代る花弁《はなびら》をこぼした紅白《こうはく》の山茶花《さざんか》も残りなく落ち尽した。三間半の南向の椽側に冬の日脚が早く傾いて木枯《こがらし》の吹かない日はほとんど稀《まれ》になってから吾輩の昼寝の時間も狭《せば》められたような気がする。
|
124
|
+
主人は毎日学校へ行く。帰ると書斎へ立て籠《こも》る。人が来ると、教師が厭《いや》だ厭だという。水彩画も滅多にかかない。タカジヤスターゼも功能がないといってやめてしまった。小供は感心に休まないで幼稚園へかよう。帰ると唱歌を歌って、毬《まり》をついて、時々吾輩を尻尾《しっぽ》でぶら下げる。
|
125
|
+
吾輩は御馳走《ごちそう》も食わないから別段|肥《ふと》りもしないが、まずまず健康で跛《びっこ》にもならずにその日その日を暮している。鼠は決して取らない。おさんは未《いま》だに嫌《きら》いである。名前はまだつけてくれないが、欲をいっても際限がないから生涯《しょうがい》この教師の家《うち》で無名の猫で終るつもりだ。
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "text_detector"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/bin/setup
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
module TextDetector
|
2
|
+
module Detector
|
3
|
+
class Base
|
4
|
+
attr_reader :dictionary
|
5
|
+
|
6
|
+
def initialize(dictionary)
|
7
|
+
@dictionary = dictionary
|
8
|
+
setup
|
9
|
+
end
|
10
|
+
|
11
|
+
def detect(text)
|
12
|
+
raise NotImplementedError
|
13
|
+
end
|
14
|
+
|
15
|
+
protected
|
16
|
+
|
17
|
+
def setup
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module TextDetector
|
4
|
+
module Detector
|
5
|
+
class Regexp < Base
|
6
|
+
def detect(text)
|
7
|
+
detected = @re.match(text)
|
8
|
+
detected ? detected.to_s : nil
|
9
|
+
end
|
10
|
+
|
11
|
+
protected
|
12
|
+
|
13
|
+
def setup
|
14
|
+
@re = ::Regexp.union(dictionary.members)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module TextDetector
|
4
|
+
module Detector
|
5
|
+
# BM法っぽく(トライ木を調べてる時に見かけた実装を参考に)
|
6
|
+
class Simple < Base
|
7
|
+
def detect(text)
|
8
|
+
# 0文字目から末尾の一つ前まで一文字ずつ始点を移動していく
|
9
|
+
0.upto(text.size - 1) do |start|
|
10
|
+
# 語の長さ配列から切り出し文字数を取り出していく
|
11
|
+
dictionary.depth.each do |size|
|
12
|
+
target = text[start, size]
|
13
|
+
# 切り出した文字列の長さが、切り出し分より短ければ次のターン
|
14
|
+
break if size > target.size
|
15
|
+
|
16
|
+
# 切り出した文字列が辞書に含まれていれば探索終了
|
17
|
+
return target if dictionary.lookup(target)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
nil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require_relative 'detector/simple'
|
2
|
+
require_relative 'detector/regexp'
|
3
|
+
|
4
|
+
module TextDetector
|
5
|
+
module Detector
|
6
|
+
def self.factory(type, dictionary)
|
7
|
+
case type
|
8
|
+
when :simple
|
9
|
+
TextDetector::Detector::Simple.new(dictionary)
|
10
|
+
when :regexp
|
11
|
+
TextDetector::Detector::Regexp.new(dictionary)
|
12
|
+
else
|
13
|
+
raise NameError
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module TextDetector
|
2
|
+
module Dictionary
|
3
|
+
class Base
|
4
|
+
def initialize(dictionary)
|
5
|
+
setup(dictionary)
|
6
|
+
end
|
7
|
+
|
8
|
+
def lookup(member)
|
9
|
+
raise NotImplementedError
|
10
|
+
end
|
11
|
+
|
12
|
+
def members
|
13
|
+
raise NotImplementedError
|
14
|
+
end
|
15
|
+
|
16
|
+
protected
|
17
|
+
|
18
|
+
def setup(dictionary)
|
19
|
+
raise NotImplementedError
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'set'
|
2
|
+
require_relative 'base'
|
3
|
+
|
4
|
+
module TextDetector
|
5
|
+
module Dictionary
|
6
|
+
class File < Base
|
7
|
+
attr_reader :depth
|
8
|
+
|
9
|
+
def lookup(member)
|
10
|
+
@dictionary.include? member
|
11
|
+
end
|
12
|
+
|
13
|
+
def members
|
14
|
+
@dictionary.to_a
|
15
|
+
end
|
16
|
+
|
17
|
+
protected
|
18
|
+
|
19
|
+
def setup(dictionary)
|
20
|
+
@dictionary = Set.new
|
21
|
+
@depth = []
|
22
|
+
|
23
|
+
open(dictionary) do |input|
|
24
|
+
input.each_line do |line|
|
25
|
+
text = TextDetector.normalize(line.chomp)
|
26
|
+
next if text.size == 0
|
27
|
+
|
28
|
+
@dictionary << text
|
29
|
+
@depth << text.size
|
30
|
+
end
|
31
|
+
end
|
32
|
+
@depth = @depth.sort.uniq
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require_relative 'detector'
|
2
|
+
require_relative 'dictionary'
|
3
|
+
|
4
|
+
module TextDetector
|
5
|
+
class Executor
|
6
|
+
def initialize(type, dictionary)
|
7
|
+
@detector = Detector.factory(type, Dictionary.factory(dictionary))
|
8
|
+
end
|
9
|
+
|
10
|
+
def detect(text)
|
11
|
+
@detector.detect(TextDetector.normalize(text))
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'nkf'
|
2
|
+
require 'text_detector/version'
|
3
|
+
require 'text_detector/executor'
|
4
|
+
|
5
|
+
module TextDetector
|
6
|
+
def self.factory(type, dictionary)
|
7
|
+
Executor.new type, dictionary
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.normalize(text)
|
11
|
+
NKF.nkf('--katakana -w', text).unicode_normalize(:nfc)
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'text_detector/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "text_detector"
|
8
|
+
spec.version = TextDetector::VERSION
|
9
|
+
spec.authors = ["koshigoe"]
|
10
|
+
spec.email = ["koshigoeb@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{Text detector.}
|
13
|
+
spec.description = %q{Text detector}
|
14
|
+
spec.homepage = "https://github.com/koshigoe/text_detector"
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
+
spec.bindir = "exe"
|
19
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.8"
|
23
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
24
|
+
spec.add_development_dependency "rspec"
|
25
|
+
end
|
metadata
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: text_detector
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- koshigoe
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-03-26 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.8'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.8'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: Text detector
|
56
|
+
email:
|
57
|
+
- koshigoeb@gmail.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- ".gitignore"
|
63
|
+
- ".rspec"
|
64
|
+
- ".travis.yml"
|
65
|
+
- Gemfile
|
66
|
+
- README.md
|
67
|
+
- Rakefile
|
68
|
+
- bin/benchmark
|
69
|
+
- bin/console
|
70
|
+
- bin/setup
|
71
|
+
- lib/text_detector.rb
|
72
|
+
- lib/text_detector/detector.rb
|
73
|
+
- lib/text_detector/detector/base.rb
|
74
|
+
- lib/text_detector/detector/regexp.rb
|
75
|
+
- lib/text_detector/detector/simple.rb
|
76
|
+
- lib/text_detector/dictionary.rb
|
77
|
+
- lib/text_detector/dictionary/base.rb
|
78
|
+
- lib/text_detector/dictionary/file.rb
|
79
|
+
- lib/text_detector/executor.rb
|
80
|
+
- lib/text_detector/version.rb
|
81
|
+
- text_detector.gemspec
|
82
|
+
homepage: https://github.com/koshigoe/text_detector
|
83
|
+
licenses:
|
84
|
+
- MIT
|
85
|
+
metadata: {}
|
86
|
+
post_install_message:
|
87
|
+
rdoc_options: []
|
88
|
+
require_paths:
|
89
|
+
- lib
|
90
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
requirements: []
|
101
|
+
rubyforge_project:
|
102
|
+
rubygems_version: 2.4.5
|
103
|
+
signing_key:
|
104
|
+
specification_version: 4
|
105
|
+
summary: Text detector.
|
106
|
+
test_files: []
|