質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
Nim

Nimは、静的型付けプログラミング言語。Pythonの生産性でありながら、C言語のような高いパフォーマンスも持ち併せます。さらに自由度の高い言語で拡張性も重視されています。

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

受付中

【nim】nimでMeCabを使いたい

nnahito
nnahito

総合スコア1980

Nim

Nimは、静的型付けプログラミング言語。Pythonの生産性でありながら、C言語のような高いパフォーマンスも持ち併せます。さらに自由度の高い言語で拡張性も重視されています。

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

1回答

0リアクション

0クリップ

335閲覧

投稿2019/05/16 11:47

やりたいこと

Nim言語でMeCabを呼び出し、形態素解析を行いたい。

環境

  • Windows10 Home 64bit
  • nim 0.19.6

※nimはscoopを使ってインストールしました。

詳細

Nim で mecab を使ってみた(C++バージョン)という記事を見かけ、
NimでもMeCabが使えるということで早速Windowsマシンで実行を試みました。

上記記事はMac用だったので、コードを以下のように少し変更しました。


parser.nim

nim

{.link: "./MeCab/bin/libmecab.dll".} {.link: "./MeCab/bin/libmecab.lib".} {.emit: """ using namespace MeCab; """.} const header = "<MeCab.h>" type MeCabModelObj {.final, header: header, importcpp: "MeCab::Model".} = object type MeCabModel = ptr MeCabModelObj type MeCabTaggerObj {.final, header: header, importcpp: "MeCab::Tagger".} = object type MeCabTagger = ptr MeCabTaggerObj type MeCabLatticeObj {.final, header: header, importcpp: "MeCab::Lattice".} = object type MeCabLattice = ptr MeCabLatticeObj type ccstring {.importc:"const char*".} = object proc createModel(argv: cstring): MeCabModel {.header: header, importcpp: "createModel(@)".} proc createTagger(this: MeCabModel): MeCabTagger {.header: header, importcpp: "#.createTagger()".} proc createLattice(this: MeCabModel): MeCabLattice {.header: header, importcpp: "#.createLattice()".} proc setSentence(this: MeCabLattice, sentence: cstring): void {.header: header, importcpp: "#.set_sentence(@)".} proc parse(this: MeCabTagger, lattice: MeCabLattice): bool {.header: header, importcpp: "#.parse(@)".} proc toString(this: MeCabLattice): ccstring {.header: header, importcpp: "#.toString()".} type ParserObj = object tagger: MeCabTagger lattice: MeCabLattice type Parser* = ref ParserObj proc createParser*(): Parser = const option: cstring = "" let model = createModel(option) let tagger = createTagger(model) let lattice = createLattice(model) return Parser(tagger: tagger, lattice: lattice) proc parse*(parser: Parser, sentence: string): string = parser.lattice.setSentence(sentence) let ret = parser.tagger.parse(parser.lattice) if not ret: raise newException(ValueError, "failed to parse.") let str = cast[cstring](parser.lattice.toString()) return $str

test.nim

nim

import os import parser proc main() = let arguments = commandLineParams() if arguments.len() < 1: echo "何か文を入力してください。" return let sentence = arguments[0] let parser = createParser() let str = parser.parse(sentence) echo str when isMainModule: main()

そしてプロジェクトフォルダにMeCabのインストールデータをフォルダごと移動します。

イメージ説明


sdkフォルダの中身、「mecab.h」をnimのlibフォルダ(\nim\0.19.6\lib)に入れます


この状態で、

bash

nim cpp -r test.nim

を叩くと、以下のエラーが出ます。

C:\Users\username\nimcache\test_d\parser.cpp.o:parser.cpp:(.text+0x126): undefined reference to `__imp__ZN5MeCab11createModelEPKc' collect2.exe: error: ld returned 1 exit status Error: execution of an external program failed: 'g++.exe -o C:\project\nim\mecab\test.exe C:\project\nim\mecab./MeCab/bin/libmecab.lib C:\project\nim\mecab./MeCab/bin/libmecab.dll C:\Users\username\nimcache\test_d\test.cpp.o C:\Users\username\nimcache\test_d\stdlib_system.cpp.o C:\Users\username\nimcache\test_d\stdlib_os.cpp.o C:\Users\username\nimcache\test_d\stdlib_strutils.cpp.o C:\Users\username\nimcache\test_d\stdlib_parseutils.cpp.o C:\Users\username\nimcache\test_d\stdlib_math.cpp.o C:\Users\username\nimcache\test_d\stdlib_bitops.cpp.o C:\Users\username\nimcache\test_d\stdlib_algorithm.cpp.o C:\Users\username\nimcache\test_d\stdlib_unicode.cpp.o C:\Users\username\nimcache\test_d\stdlib_times.cpp.o C:\Users\username\nimcache\test_d\stdlib_options.cpp.o C:\Users\username\nimcache\test_d\stdlib_typetraits.cpp.o C:\Users\username\nimcache\test_d\stdlib_strformat.cpp.o C:\Users\username\nimcache\test_d\stdlib_macros.cpp.o C:\Users\username\nimcache\test_d\stdlib_winlean.cpp.o C:\Users\username\nimcache\test_d\stdlib_dynlib.cpp.o C:\Users\username\nimcache\test_d\stdlib_ospaths.cpp.o C:\Users\username\nimcache\test_d\parser.cpp.o

当方、C++を書いたことがないのでエラーがあまり良く認識できません。
また、冒頭に書いたQiitaのコードをMacで動かすと、正常に動作しております。

この原因と解決方法を御存知の方がいらっしゃいましたら、ご教示いただけますと幸いです。
よろしくお願いいたします。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Nim

Nimは、静的型付けプログラミング言語。Pythonの生産性でありながら、C言語のような高いパフォーマンスも持ち併せます。さらに自由度の高い言語で拡張性も重視されています。

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。