たつをの ChangeLog

35 件 見つかりました。

1 2 3 4 5 6 7 [ 次へ ]

形態素解析器 MeCab の WebAPI である MECAPI
その MECAPI を Linux や macOS などのターミナルから使うためのコマンドを用意しました。
Perl で書いた超簡単なやつです。


使い方は API に準拠 (ref. http://maapi.net/apis/mecapi)。
response, filter, format, dic はオプションで指定。
sentense (解析対象文) は標準入力で。

実行例:
% echo 'ここは六本木ヒルズです' | mecapi.pl -format json -dic neologd | jq .
[
  {
    "feature": "名詞,代名詞,一般,*,*,*,ここ,ココ,ココ",
    "surface": "ここ"
  },
  {
    "feature": "助詞,係助詞,*,*,*,*,は,ハ,ワ",
    "surface": "は"
  },
  {
    "feature": "名詞,固有名詞,一般,*,*,*,六本木ヒルズ,ロッポンギヒルズ,ロッポンギヒルズ",
    "surface": "六本木ヒルズ"
  },
  {
    "feature": "助動詞,*,*,*,特殊・デス,基本形,です,デス,デス",
    "surface": "です"
  }
]
(JSON を扱うには jq がすごく便利!)

エラーが出る場合、中で使っている Perl モジュール "LWP::Simple" で https へのアクセスができないことが原因かも。
そのときは、 "LWP::Protocol::https" を入れて見てください。
"perl lwp::simple https" などでネット検索!

それができない、とか、それでもダメといった場合は代わりに mecapi-curl.pl をご利用ください。
こちらは最小構成の perl と curl が入っていれば動きます。
単なる curl のラッパーです。

以上です。
ぜひ、MECAPI をお楽しみください!

追記191212: 一文ずつ渡すだけならば普通に curl だけOKです!
curl https://maapi.net/apis/mecapi -s --data format=json --data-urlencode sentence=六本木ヒルズです

関連記事


MECAPI という形態素解析 API を運営しているのですが、ここしばらくはレンタルサーバの負荷がきついので実質まったく動いていない状態でした(というか停止していた)。

「これじゃいけない!」ということで、AWS 上で MECAPI を運用していくことにしました。
クラウドな MECAPI です。

URLも新しくなりました。
説明ページ(トップページ)も作りました。
どうぞご利用ください。

mecapi 仮ロゴ
  • 形態素解析API「MECAPI」
    MECAPIとは、 日本語形態素解析器 MeCab の Web Service (API) です。
    API を無償で提供しております。
    後述の注意点をお読みいただいた上で、ご自由にお使いください。

1週間くらい前から真面目にAWSをいじり始めたのですが、かなり良いですね(今更)。
練習でウェブサーバを立ち上げたりしてましたが、手順は多いけど難しくはないです。
なんだかんだで最後までできてしまいます。
やはり時代はクラウドだなあ。

MECAPI での形態素解析処理(MeCab とその Perl Module)は当面はインスタンス1つだけでまかなうつもり。
ロードバランサーの設定もしたので、負荷がきつくなったらインスタンスを追加すれば大丈夫なはず(今はLBにインスタンスが一つだけぶらさがっている状態)。
そこらへんは追々に。

AWS の料金ですが、私が運営しているKindleセール情報サイト「キンセリ」の収入の一部を使っていくつもりです。
まずは、月10万円くらい($1,000)が上限(アラート設定済み)。
どれくらいかかるかはやってみなくちゃわからないけど。
運用状況については今後定期的に報告していく所存です。

過去記事

この記事に言及しているこのブログ内の記事

今さらなメモ。
"%uXXXX" 形式の文字列を Perl でデコードする方法。

s/%u([A-Fa-f0-9]{4})/chr(hex($1))/eg

perl -le '$a = "%u3044%u3061%u3054";
$a =~ s/%u([A-Fa-f0-9]{4})/chr(hex($1))/eg;
print $a'
→
いちご

URI::Escape::JavaScript の unescape でもいけるみたい。

作業メモ的な話。
ヒートマップに使いたいので、ターミナルエミュレータで出せる色について調べて、簡単なプログラム書いて確認した。
Macのターミナルでも、Windowsのteratermでも出るやつ。

terminal%20color%20sample

ソース (perl)
#!/usr/bin/env perl
# -*- coding: utf-8 -*-
use strict;
use warnings;

sub rgb2code {
    my ($r, $g, $b) = @_;
    my $v = $r * 36 + $g * 6 + $b + 16;
    return $v;
}

##########
print "基本色:暗め、明るめ\n";
##########

for (my $i = 0; $i <= 7; $i++) {
    my $v = $i;
    printf("\033[48;5;%dm %02X,%3d \033[0m", $v, $v, $v);
}
print "\n";
for (my $i = 8; $i <= 15; $i++) {
    my $v = $i;
    printf("\033[48;5;%dm %02X,%3d \033[0m", $v, $v, $v);
}
print "\n";
print "\n";

##########
print "グレースケール\n";
##########

for (my $i = 232; $i <= 255; $i++) {
    my $v = $i;
    printf("\033[48;5;%dm %02X \033[0m", $v, $v);
}
print "\n";
print "\n";

##########
print "数値順 (Hex,Dec,RGB)\n";
##########

for (my $r = 0; $r <= 5; $r++) {
    for (my $g = 0; $g <= 5; $g++) {
        for (my $b = 0; $b <= 5; $b++) {
            my $v = rgb2code($r, $g, $b);
            printf("\033[48;5;%dm %02X,%3d,%s \033[0m", $v, $v, $v, $r.$g.$b);
        }
        print "\n";
    }
}
print "\n";

##########
print "色相環の配列:赤から紫へ\n";
##########

my ($r, $g, $b) = (5, 0, 0);
for ($g = 0; $g <= 5; $g++) {
    my $v = rgb2code($r, $g, $b);
    printf("\033[48;5;%dm %02X,%3d,%s \033[0m\n", $v, $v, $v, $r.$g.$b);
}
$g = 5;
for ($r = 4; $r >= 0; $r--) {
    my $v = rgb2code($r, $g, $b);
    printf("\033[48;5;%dm %02X,%3d,%s \033[0m\n", $v, $v, $v, $r.$g.$b);
}
$r = 0;
for ($b = 1; $b <= 5; $b++) {
    my $v = rgb2code($r, $g, $b);
    printf("\033[48;5;%dm %02X,%3d,%s \033[0m\n", $v, $v, $v, $r.$g.$b);
}
$b = 5;
for ($g = 4; $g >= 0; $g--) {
    my $v = rgb2code($r, $g, $b);
    printf("\033[48;5;%dm %02X,%3d,%s \033[0m\n", $v, $v, $v, $r.$g.$b);
}
print "\n";

##########
print "プラス値のみのヒートマップ用の配色案\n";
##########

($r, $g, $b) = (5, 0, 0);
for ($g = 0; $g <= 5; $g++) {
    my $v = rgb2code($r, $g, $b);
    printf("\033[48;5;%dm %02X,%3d,%s \033[0m\n", $v, $v, $v, $r.$g.$b);
}
$g = 5;
for ($b = 1; $b <= 4; $b++) {
    my $v = rgb2code($r, $g, $b);
    printf("\033[48;5;%dm %02X,%3d,%s \033[0m\n", $v, $v, $v, $r.$g.$b);
}
print "\n";


参考文献


素の cut (-c) と fold コマンドは UTF-8 の文字列に対して途中で切っちゃうこともあって文字化けして困る。cut と fold のUTF8対応版が欲しい。

流石にネットのどこかにあるだろうと思って探してみたんだけど、探し方が悪かったのかすぐには見つからず。3分くらいがんばって調べてみたけど、こりゃ作った方が早いな、ということで車輪の再発明。

ざっくりと perl で書いています。

cut8 - UTF8対応cut

"-c" オプションのみ。
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
use open ':utf8';
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";

my $cps_str = ""; # character positions
GetOptions("c=s" => \$cps_str);

my @cps = sort {_toint($a) <=> _toint($b)} split(/,/, $cps_str);
sub _toint {$_[0] =~ /^(\d+)/; $1}

while (<>) {
    chomp;
    my @c = split(//, $_);
    foreach my $cp (@cps) {
	if ($cp =~ /^(\d+)-(\d+)$/) {
	    print map {defined $_ ? $_ : ""} @c[($1-1)..($2-1)];
	} else {
	    print $c[$cp-1]||"";
	}
    }
    print "\n";
}
echo "あいうえおかきくけこ" | cut8 -c 1-3,7-9
あいうきくけ

fold8 - UTF8対応fold

"-w" オプションのみ。
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
use open ':utf8';
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";

my $width = 80;
GetOptions("width=s" => \$width);

while (<>) {
    chomp;
    my $line = $_;
    if (length($line)) {
        while ($line =~ s/^(.{$width})//) {
            print "$1\n";
        }
        next if not length($line);
    }
    print "$line\n";
}
echo "あいうえおかきくけこ" | fold8 -w 4
あいうえ
おかきく
けこ

(追記190325: fold8 の空行が出ないバグを修正)

1 2 3 4 5 6 7 [ 次へ ]

たつをの ChangeLog
Powered by chalow