ラベル MeCab の投稿を表示しています。 すべての投稿を表示
ラベル MeCab の投稿を表示しています。 すべての投稿を表示

2010年11月14日日曜日

読みを取り出す

追記: portで入れた辞書の利用にはdylibを/opt/local/lib/libmecab.dylibにして, 'mecab_new2("-d /opt/local/lib/mecab/dic/ipadic-utf8/");'と引数を与える.



動機
Mecabに関する前回の結果から読みを取り出せないか?ということで挑戦.


やってみた
0.どうもappleの辞書では読みが取り出せない(おいらのやり方がわるいためだろうか).
1.portでmecabのutf-8の辞書を入れてみる.('sudo port install mecab-ipadic-utf8')
2.mecabの分析を以下のように変更
- (NSArray *)mecabResultWithString:(NSString *)input
{
NSMutableArray *ret= [NSMutableArray array];
if (input==nil || [input length]==0)
return ret;
const char *buf= [input cStringUsingEncoding:NSUTF8StringEncoding];
NSUInteger l= [input lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
const mecab_node_t *node = mecab_sparse_tonode2(mecab, buf, l);
if (node == NULL) {
return ret;
}
node = node->next;
for (; node->next != NULL; node = node->next) {
NSString *f = [NSString stringWithCString:node->feature encoding:NSUTF8StringEncoding];
NSString *yomi= [[f componentsSeparatedByString:@","] objectAtIndex:7];
[ret addObject:yomi];

}
return ret;
}

3.読みをローマ字にしてみた.
  int i, ic= [mecabResult count];
NSMutableString *str= [NSMutableString string];
for(i= 0;i<ic;i++) {
[str appendFormat:@"%@ ", [mecabResult objectAtIndex:i]];
}
CFStringTransform(str, NULL, kCFStringTransformHiraganaKatakana, YES); //カタカナ→ひらがな
CFStringTransform(str, NULL, kCFStringTransformLatinHiragana, YES); //ひらがな→ローマ字(?)
NSLog(@"%@", str);

4.発声してみるならこういうコードらしい
 NSSpeechSynthesizer *synth = [[NSSpeechSynthesizer alloc] init];
[synth startSpeakingString:str];
[synth autorelease];


結果
入力: 微かなオレンジの香りが残っていた
出力: kasuka na orenji no kaori ga noko~tsu te i ta

2010年11月11日木曜日

MacOS X 10.6にデフォルトで入っているlibmecab.dylib ( MeCab )を使ってみた

追記(2011/2/4): FYI 'Google groups / cocoa-dev-japan / 日本語文字列を文節に分解するには?'

追記2(2010/11/12): lengthOfBytesUsingEncodingで文字列の長さを出してmecab_sparse_tonode2を用いることで解決.参考サイトの通りに作ればちゃんと動く.

追記(2010/11/12): 半角が入ると止まる.mecabさんの設定になにかする必要があるのかしら…。CFStringTransformで「全角から半角」の逆変換をかけてUTF16LEへ変換して,mecabへ入れてみたが,あまりうまくいってない.



動機
なんとなく.


やってみた
0.Cocoaプロジェクトを作る('Untitled').
1./usr/libをFinderで開き(コンソールで'open /usr/lib'とかする),libmecab.dylibをDnDにてプロジェクトに追加.(コピーはしない)
2.コードを書く
UntitledAppDelegate.h
#import <Cocoa/Cocoa.h>
#include "mecab.h"

@interface UntitledAppDelegate : NSObject <NSApplicationDelegate> {
NSWindow *window;

mecab_t *mecab;
NSString *_inputString;
NSArray *_mecabResult;
}
@property (assign) IBOutlet NSWindow *window;
@end

UntitledAppDelegate.m
#import "UntitledAppDelegate.h"
@implementation UntitledAppDelegate
@synthesize window;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
mecab = mecab_new2("-d /usr/lib/mecab/dic/apple/ja/LE");
if (mecab == NULL) {
fprintf(stderr, "error in mecab_new2: %s\n", mecab_strerror(NULL));
}
}
- (void)dealloc
{
mecab_destroy(mecab);
[super dealloc];
}
- (NSString *)inputString
{
return [[_inputString retain] autorelease];
}
- (void)setInputString:(NSString *)inputString
{
[_inputString release];
_inputString= [inputString retain];
[self setMecabResult:[self mecabResultWithString:_inputString]];
}
- (NSArray *)mecabResult
{
return [[_mecabResult retain] autorelease];
}
- (void)setMecabResult:(NSArray *)mecabResult
{
[_mecabResult release];
_mecabResult= [mecabResult retain];
}
- (NSArray *)mecabResultWithString:(NSString *)input
{
NSMutableArray *ret= [NSMutableArray array];
if (input==nil || [input length]==0)
return ret;
const char *buf= [input cStringUsingEncoding:NSUTF16LittleEndianStringEncoding];
const mecab_node_t *node = mecab_sparse_tonode(mecab, buf);
NSUInteger l= [input lengthOfBytesUsingEncoding:NSUTF16LittleEndianStringEncoding];
const mecab_node_t *node = mecab_sparse_tonode2(mecab, buf, l);
if (node == NULL) {
return ret;
}

node = node->next;
for (; node->next != NULL; node = node->next) {
NSString *w = [[NSString alloc] initWithBytes:node->surface
length:node->length
encoding:NSUTF16LittleEndianStringEncoding];
[ret addObject:w];
[w release];
}
return ret;
}
@end

3.IBにてNSTextFiledとNSTokenFieldを配置.
4.IBにて上記それぞれのインスペクタ/Bindingsタブにてvalue属性についてUntitledAppDelegateに対してModel Key PathをinputString, mecabResultと設定する.
5.実行

実行

参考サイト
感謝!
きまぐれ日記: Mac OS X Leopard に「標準で」インストールされている MeCabを使ってみる

2008年10月28日火曜日

結局MeCabをportsでいれた.

あいも変わらず頭の悪い文章ですみません.


前回いろいろ書いたがあきらめてportsでinstallをしてみた.
> sudo port install mecab
で入る.
Text-Mecab-0.20007
> perl Makefile.PL
Path to mecab config? /opt/local/bin/mecab-config
…あれこれ…
Encoding of your mecab dictionary? (shift_jis, euc-jp, utf-8) [utf-8]
…あれこれ…
Writing Makefile for Text::MeCab
> make
> sudo make install
で入った(っぽい).あっさり…(うがーあの無駄な努力はぁー).

で,テスト.こちらを参考に(バックスラッシュに注意)させていただきました.感謝.
とりあえずMacだからUTF-8だよねぇText-Mecabもそれで入れた(上記クォート内でデフォルト値:utf-8をそのまま通した.)しということでそれで作成(ファイルの文字コードや改行の扱い(LFだよ)に注意.また出力もターミナルなどでutf-8にしておいた).
しかし,ぶっぶー.文字化けです.

???.ということで調べると辞書がeuc-jpだから基本euc-jpらしい.
MeCab: Yet Another Part-of-Speech and Morphological Analyze/高度な使い方/文字コード変更
(euc-jpでサンプルを作成し,euc-jpのターミナルで実行すると化けないことも確認.)

そこで上記サイトに書いてある通り辞書のコードを修正してみた.
> cp /opt/local/var/macports/distfiles/mecab/mecab-ipadic-2.7.0-20070610.tar.gz ~/Desktop
> cd ~/Desktop
> tar xvzf mecab-ipadic-2.7.0-20070610.tar.gz
> cd mecab-ipadic-2.7.0-20070610
> ./configure --with-charset=utf8
> make
> sudo make install

ということで変更終了
再度テストで成功.
こう見える.
> perl test.pl
も 助詞,係助詞,*,*,*,*,も,モ,モ 2988
し 動詞,自立,*,*,サ変・スル,未然形,する,シ,シ 8930
ない 助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ 2424
と 助詞,接続助詞,*,*,*,*,と,ト,ト 3476
ね 助詞,終助詞,*,*,*,*,ね,ネ,ネ 8929
BOS/EOS,*,*,*,*,*,*,*,* 7034
...あれ?最初のワードは?
ということで何が異なるかいまいち理解できていないが(Text-MeCabのversionも異なるし)修正修正.
use Text::MeCab;
my $m = Text::MeCab->new();
my $str = "今日もしないとね";
my $n = $m->parse($str);
until ($n==undef) {
printf("%s\t%s\t%d\n",
$n->surface, # 表層
$n->feature, # 現在の品詞
$n->cost # その形態素までのコスト
);
$n = $n->next;
}
で,再実行.
> perl test.pl
今日 名詞,副詞可能,*,*,*,*,今日,コンニチ,コンニチ 1611
も 助詞,係助詞,*,*,*,*,も,モ,モ 2988
し 動詞,自立,*,*,サ変・スル,未然形,する,シ,シ 8930
ない 助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ 2424
と 助詞,接続助詞,*,*,*,*,と,ト,ト 3476
ね 助詞,終助詞,*,*,*,*,ね,ネ,ネ 8929
BOS/EOS,*,*,*,*,*,*,*,* 7034
よさげ♪

ということで間違い等ありましたらご指摘いただけると幸いです.

2008年10月23日木曜日

MeCabで遊ぼうと思ったんだけどね.

追記(2008/10/28):
結局エントリーにした



いつものように頭の悪い文章です.すみません.


MacにMeCabがフツーに入っていると聞いたので遊んでみたいなぁと思ったらそのままのエントリーにヒット.
Mac OS X Leopard に「標準で」インストールされている MeCabを使ってみる
http://chasen.org/~taku/blog/archives/2008/07/mac_os_x_leropa.html
感謝.

こいつはすんなりできました.
で,あれこれ作ってみたいなぁって思ったのですが試すならスクリプト言語が良いなぁ…という発想でperlで使う方法ない?
と調べ始めたんです.みつけたのがText::MeCab(http://search.cpan.org/dist/Text-MeCab/).

ところがこの子.perl Makefile.PLとかやろうとすると
Path to mecab config?
って聞いてくるんです…
なにそれ?ということで調べるとどうも通常インストールするとmecab-configっていうのが入るらしいんですねぇ.でそのパスを教えてねっことらしい.

Leopardにはっているのかな?ということで調べた(find /usr -name "mecab-config" -print).…ないみたい.
そこで考えた.mecab-config作ったら?って.
#! /usr/bin/env perl
print "1.0" if ($ARGV[0] =~ /--version/);
print "-L/usr/lib -lmecab -lstdc++" if ($ARGV[0] =~ /--libs/);
print "-I/usr/include -Wmissing-prototypes" if ($ARGV[0] =~ /--cflags/);
print "/usr/include" if ($ARGV[0] =~ /--inc-dir/);

で,なんとかだませたみたいなんだ.色々言われるけど結局

Writing Makefile for Text::MeCab
>

makeも通った(ように見える).
では使ってみようということでサンプルらしきものを参考に.
test.pl
#!/opt/local/bin/perl
use lib "./Text-MeCab-0.20007/blib/lib";
use Text::MeCab;
my $m = Text::MeCab->new();
my $str = "微かなオレンジの香りが残っていた.";
my $n = $m->parse($str);
while ($n = $n->next) {
printf("%s\t%s\t%d\n",$n->surface, $n->feature, $n->cost);
}

> ./test.pl 
Can't find 'boot_Text__MeCab' symbol in /usr/lib/libMeCab.dylib
at /opt/local/lib/perl5/5.8.8/darwin-2level/DynaLoader.pm line 26
BEGIN failed--compilation aborted at Text-MeCab-0.20007/blib/lib/Text/MeCab.pm line 26.
Compilation failed in require at ./test.pl line 3.
BEGIN failed--compilation aborted at ./test.pl line 3.
>
…orz.
ということでやっぱりだめなものはだめ.みたいな感じ.まったくもってばかばかしい方針なのでここで退散.

…素直にportのmecabを入れろということですかね.
> port list |grep mecab
p5-mecab @0.96 perl/p5-mecab
py-mecab @0.96 python/py-mecab
py25-mecab @0.96 python/py25-mecab
rb-mecab @0.96 ruby/rb-mecab
mecab @0.96 textproc/mecab
mecab-ipadic-eucjp @2.7.0-20070610 textproc/mecab-ipadic-eucjp
mecab-ipadic-sjis @2.7.0-20070610 textproc/mecab-ipadic-sjis
mecab-ipadic-utf8 @2.7.0-20070610 textproc/mecab-ipadic-utf8
mecab-jumandic-eucjp @5.1-20070304 textproc/mecab-jumandic-eucjp
mecab-jumandic-sjis @5.1-20070304 textproc/mecab-jumandic-sjis
mecab-jumandic-utf8 @5.1-20070304 textproc/mecab-jumandic-utf8
>


私のやり方がダメって話だからね.念のため.

追記
いま書きながらもう一度みていたらmakeで以下の行がでていた.
lib/Text/MeCab/Dict.pm:166: Unknown command paragraph "=encoding UTF-8"
まぁ本文のだめっぷりとは直接は関係ないだろうけど,あれこれだめっぽいやぁね.