Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
    Tomoko Uchida
    @mocobeta
    テスト
    Tomoko Uchida
    @mocobeta
    Gitter 立ててみた。質問,要望,お気軽にどうぞ〜
    Greninja0212
    @Greninja0212

    はじめまして.
    NEologd辞書をjanomeに導入したいのですが,うまく導入できません.
    環境はwindows10 です.
    bash on windows や cygwin などで試してみていますが,以下のようなエラーが出て止まってしまいます.
    また,bash on windowsでは pythonコマンドが使えないため,build.shpythonコマンド部をpython3に書き換えて実行しています.

    解決方法を教えていただけると幸いです.

    $ ./build.sh \
    > ../../mecab-ipadic-neologd/build/mecab-ipadic-2.7.0-20070801-neologd-20181126/ \
    > utf8
    Traceback (most recent call last):
      File "build.py", line 231, in <module>
        collect(dicdir, enc, outdir, workdir)
      File "build.py", line 50, in collect
        for line in f:
      File "C:\Users\USERNAME\AppData\Local\Programs\Python\Python36-32\lib\codecs.py", line 321, in decode
        (result, consumed) = self._buffer_decode(data, self.errors, final)
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa4 in position 0: invalid start byte
    INFO:root:worker processes: 2
    INFO:root:elapsed=0sec
    Traceback (most recent call last):
      File "build.py", line 236, in <module>
        build_unknown_dict(dicdir, enc, outdir)
      File "build.py", line 142, in build_unknown_dict
        for line in f:
      File "C:\Users\USERNAME\AppData\Local\Programs\Python\Python36-32\lib\codecs.py", line 321, in decode
        (result, consumed) = self._buffer_decode(data, self.errors, final)
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa1 in position 1752: invalid start byte
      adding: sysdic/ (436 bytes security) (stored 0%)
      adding: sysdic/connections1.py (276 bytes security) (deflated 78%)
      adding: sysdic/connections2.py (276 bytes security) (deflated 80%)
      adding: sysdic/__init__.py (276 bytes security) (deflated 78%)
    Build done.
    Tomoko Uchida
    @mocobeta
    こんにちは。
    windows 環境でビルドできるか確認したことがなく(というよりは,windows環境で動作することを考慮したビルドスクリプトになっていません),対応は難しいかもしれません。
    辞書が最新ではないですが,ビルド済みのパッケージをインストールできないでしょうか?
    https://drive.google.com/drive/u/1/folders/0BynvpNc_r0kSd2NOLU01TG5MWnc
    sld-cap
    @sld-cap
    初めまして。janomeによるneologdビルド方法を公開して下さり有難うございます!
    試しにビルドして、実行例をそのまま試して見たのですが、上手く分かち書きされませんでした。
    渋谷 名詞,固有名詞,地域,一般,,,渋谷,シブヤ,シブヤ
    ヒカリエ 名詞,一般,,,,,ヒカリエ,,
    は 助詞,係助詞,,,,,は,ハ,ワ
    、 記号,読点,,,,,、,、,、
    東京 名詞,固有名詞,地域,一般,,,東京,トウキョウ,トーキョー
    都 名詞,接尾,地域,,,,都,ト,ト
    渋谷 名詞,固有名詞,地域,一般,
    ,,渋谷,シブヤ,シブヤ
    区 名詞,接尾,地域,
    ,,,区,ク,ク
    の 助詞,連体化,,,,,の,ノ,ノ
    上記のような感じです。掲載された手順の中で、唯一実行していない
    neologdのバージョンを修正してsetup.pyを実行するという手順を行なっていないのですがそれが原因でしょうか?
    Tomoko Uchida
    @mocobeta
    @sld-cap
    すみません。通知がなく気づくのが遅くなりました。
    github のリポジトリに同梱している ipadic 辞書を使ってビルドされてしまっているように見えます。ビルドした janome のサイズが,小さくないでしょうか?(neologd を内包すると 200MB くらいになるはずです)
    MATSUDA, Kouichi
    @KouichiMatsuda
    初めまして。token filterで遊んでいるのですが、これって結果はyieldしないといけないものなのでしょうか?
    すいません。Enterしちゃいましたorz。def apply(self, tokens)でtokensが渡ってくるので、まとめて処理したものを次のフィルタに渡せないかと思ったのが発端です。
    Tomoko Uchida
    @mocobeta
    @KouichiMatsuda
    こんにちは。
    まとめて処理,というのがいまいちわかっていないのですが,generator で 1 token ずつ返すのではなく最後にリストを返す,ということでしょうか?
    (こんなふうに呼び出したい,というのがあればコードのイメージを書いていただけるといいかもしれません。)
    MATSUDA, Kouichi
    @KouichiMatsuda
    ありがとうございます。言葉たりなくってすいません。そうです。1つずつ返すのではなく、処理して、最後にリストで返すということです。
    Tomoko Uchida
    @mocobeta
    tokenfilter が yield して generator を返すようにしているのは,大きな入力文字列が与えられた時に,メモリリークを避けるためです(リストにするためには,最後に結果を返すまで処理済みの全 token をメモリ上に載せておかないといけない)。
    もし後続のフィルタで,次のトークンを使いたい場合は,後続のフィルターの apply() の中で for ループを回すことで対応できると思いますが,その方向で実装できないでしょうか?
    たとえば組み込みの TokenCountFilter がそういう実装になっているのでご参考になれば
    https://github.com/mocobeta/janome/blob/master/janome/tokenfilter.py#L181
    MATSUDA, Kouichi
    @KouichiMatsuda
    ありがとうございます。TokenCountFilterまで読んでから質問すればよかったですね。すいません m(__)m
    Tomoko Uchida
    @mocobeta
    いえいえ,質問はお気軽にどうぞ!
    onishik
    @onishik88
    READMEの件、ありがとうございました。(逆にお手間をかけさせてしまって、すみませんでした)
    お仕事でjanomeを使わせていただいてまして、自前で実装したCharFilter/TokenFilterを試しにjanome側に実装・テストしようとしたときに、躓きましたのでPRをお送りした次第です。
    Tomoko Uchida
    @mocobeta
    こちらこそ,気づいていなかったのでありがとうございました!
    onishik
    @onishik88
    ちなみに、setで指定したストップワードを弾くTokenFilterなどを実装してました。
    dejideji99
    @dejideji99_twitter
    初めまして、松戸市在住のでじといいます。janomeを使わせてもらっています、ありがとうございます。 やってくる  動詞、自立
    やっ     動詞、自立
    て      助詞、接続助詞
    みる     動詞、非自立
    「やってくる」も「やってみる」と同じになるといいのですが。
    Tomoko Uchida
    @mocobeta
    @dejideji99_twitter
    こんにちは,なるほどそうなるんですね。
    分割ポイントは,janome の内部で持っている辞書(mecab-ipadic)に依存していて,janome 側で対応するのは難しそうです。(MeCab でも同じ結果になりました。)
    どうしても必要な場合,ちょっと無理矢理ですが,ユーザー辞書で対応できるかなと思います。
    dejideji99
    @dejideji99_twitter
    さっそくご回答ありがとうありがとうございます。私もユーザー辞書で解決しました。今、文節分かち書きプログラムを作っています。ありがとうございました。
    HIROTA Nozomu
    @HIROTA-Nozomu

    はじめまして。
    POSKeepFilterのdocstringを読むと、引数の「pos_list」は「 keep part-of-speech tags list.」とあります。
    でも名詞だけならPOSKeepFilter('名詞')とやっても出力が変わらなかったり。これは意図的な仕様ですか?janome/analyzer.pyのdocstringには、こちらのリスト型を使わない書き方が示されています。

    POSKeepFilter(['名詞'])と、リスト型に統一するべきか気になりまして。def apply以下の「if any(token.part_of_speech.startswith(pos) for pos in self.pos_list)」を見ると、リスト型を想定しているのかな、と感じました。

    Tomoko Uchida
    @mocobeta
    ご指摘ありがとうございます。analyzer.py のドキュメントが誤っていますね。修正しておきます。
    Tomoko Uchida
    @mocobeta
    AkiraNishino
    @AkiraNishino
    はじめまして。金沢在住のにしのと申します。
    AkiraNishino
    @AkiraNishino

    あけましておめでとうございます。
    janomeのNEologd辞書版を使用させて頂いています。ありがとうございます。
    ローカル環境でそれなりに動作を確認できたのでcentos8のサーバで稼働させてみたところ、
    Tokenaizerをインスタンス化する度に約200MBメモリを消費し最終的にout of memmoryになってしまって困っています。
    使い方がおかしいのか、何か回避方法があるのか知りたくてお送りした次第です。

    実行環境は、
    OS:centos8
    メモリ:7.5GB
    サーバ:apache(wsgi連携)
    python:3.8.1
    フレームワーク:Flask
    janome:Janome-0.3.9.neologd20190523(NEologd辞書同梱で公開されていたもの)

    利用方法としては、
    「Tokenizer(udic=dicfile, mmap=True)」
    でdicfileにリクエストパラメータで渡したファイルを設定して実行するような実装を行っています。

    初回の実行で2GB程持っていかれた後、200MBずつ消費していくので、
    おそらく辞書ファイル関係ではないかと当たりはつけているのですが、
    何か見当がついたりしないでしょうか。

    (実装内容)

    ■ keitaiso.py
    from flask import current_app as _app
    from app.service import keitaiso

    # 形態素解析を実行
    def keitaiso_analyze(form, dic_update):
    t = keitaiso.get_tokenizer(dicid, dic_update)
    for token in t.tokenize(form.sentence.data, stream=True):
    worddic = {}
    _app.logger.debug(token.surface)

    ■ service.py
    from janome.tokenizer import Tokenizer
    from flask import current_app as _app
    import os

    def get_tokenizer(dicid, dic_update):
    if len(dicid) > 0:
    dir = _app.config["UPLOAD_CSV_DIR"]
    dicfile = os.path.join(dir, "{}.csv".format(dicid))
    return Tokenizer(udic=dicfile, mmap=True)
    else:
    return Tokenizer(mmap=True)

    AkiraNishino
    @AkiraNishino
    apacheの設定でWSGIProcessGroupを設定していなかったことが原因だったようです。
    解決しました。
    ありがとうございました。
    Tomoko Uchida
    @mocobeta
    @AkiraNishino 確認遅くなってすみません。解決されたということで良かったです。
    neologd 同梱版の Janome はリソースをかなり消費するので,サーバサイドで継続的に運用していく場合は mecab + neologd への変更もご検討ください。
    AkiraNishino
    @AkiraNishino
    @mocobeta ご返信ありがとうございます。了解しました。動作させてメモリの消費具合を検討したいと思います。あと、ソースを眺めていてふと思ったのですが、janome/sysdic/init.py内のメソッド(entries、mmap_entries、all_fstdata)にlru_cacheをつけると2回目以降の実行で辞書データをロードする必要がなくなるので、実行速度が上がるのではないかなと思いました。実際にソースに修正を入れて試したわけではないので、何も変わらないか、よくわからない誤動作が起こるのかもしてません。
    Tokuhiro Matsuno
    @tokuhirom
    janome の出力が、何度か実行していると違う結果が出てくる場合があると思うのですが、この結果を常にどちらかに一定にさせる方法はありますでしょうか?
    echo '内浜小学校' | janome のような場合
    内浜 名詞,固有名詞,地域,一般,*,*,内浜,ウチバマ,ウチバマ が出る場合と 内浜 名詞,固有名詞,地域,一般,*,*,内浜,ウチハマ,ウチハマ がランダムに出力されるようです。
    (知りたいのは、コマンドラインではなく、janome.tokenizer.Tokenizer での結果を常に同じにする方法です
    Tomoko Uchida
    @mocobeta
    @tokuhirom 返信遅くなりすみません。
    おそらく,ランダムに出力されているわけではなく,周辺のコンテキストに応じて出力される形態素(単語)が変わっているかと思います。
    「内浜(ウチバマ)」と「内浜(ウチハマ)」のいずれかに決めたいだけであれば,ユーザー辞書を作るという手段がありますが,すべての単語について一定させるというのは難しい(そもそも形態素解析のスコアリングや,言語モデルに関わる)と思います。
    というので回答になっているでしょうか??
    Tomoko Uchida
    @mocobeta
    ああ,そういうことではないですね...。確かに揺れますね...。
    $ echo 内浜小学校 | janome
    内浜    名詞,固有名詞,地域,一般,*,*,内浜,ウチバマ,ウチバマ
    小学校    名詞,一般,*,*,*,*,小学校,ショウガッコウ,ショーガッコー
    
    $ echo 内浜小学校 | janome 
    内浜    名詞,固有名詞,地域,一般,*,*,内浜,ウチハマ,ウチハマ
    小学校    名詞,一般,*,*,*,*,小学校,ショウガッコウ,ショーガッコー
    原因は,内浜(ウチハマ)と内浜(ウチバマ)がまったく同じ表層系と品詞と出現確率をもっているので,選ぶ時に不定になってしまっているようです。
    同じ文字列を与えて結果が揺れるのはあまりよろしくないと思いますので,スコアが同じだった場合,形態素IDが小さいほうに決め打ちするように修正しようかなと思います。
    Tomoko Uchida
    @mocobeta
    FYI issue を上げました。mocobeta/janome#89
    Tokuhiro Matsuno
    @tokuhirom
    ありがとうございます!
    Shunsuke Kando
    @gifdog97
    はじめまして。Janome 使わせていただいております。些細な質問ではあるのですが、tokenize 結果の読み(カタカナ)をローマ字読みに変換する機能はデフォルトで実装されていますか?なければ別ライブラリ(pykakasi など)使えば良い話なのですが、もしあれば使いたいなと思いました。よろしくお願いします
    Tomoko Uchida
    @mocobeta
    @gifdog97 すみません,遅くなりました。ローマ字変換は実装されていません。別途ライブラリが必要になります。
    Shunsuke Kando
    @gifdog97
    @mocobeta ありがとうございます!
    tamane
    @Salt-Onion

    初めまして、早速質問させていただきます。janomeで形態素解析を試しているんですが、https://mocobeta.github.io/janome/ こちらのサンプルコードの辞書のみ改変した、

    >>> from janome.tokenizer import Tokenizer
    >>> t = Tokenizer("haishin.csv", udic_enc="utf8")
    >>> for token in t.tokenize(u'東京スカイツリーへのお越しは、東武スカイツリーライン「とうきょうスカイツリー駅」が便利です。'):
    ...   print(token)

    を実行すると、

    Traceback (most recent call last):
      File "janome_sample.py", line 2, in <module>
        t = Tokenizer("haishin.csv", udic_enc="utf8")
      File "/usr/local/lib/python3.8/dist-packages/janome/tokenizer.py", line 185, in __init__
        self.user_dic = UserDictionary(udic, udic_enc, udic_type, connections)
      File "/usr/local/lib/python3.8/dist-packages/janome/dic.py", line 412, in __init__
        compiledFST, entries = self.build_dic(user_dict, enc, progress_handler, line_to_entry)
      File "/usr/local/lib/python3.8/dist-packages/janome/dic.py", line 448, in build_dic
        entry = line_to_entry(line)
      File "/usr/local/lib/python3.8/dist-packages/janome/dic.py", line 422, in line_to_entry_ipadic
        return (surface, int(left_id), int(right_id), int(cost),
    ValueError: invalid literal for int() with base 10: ''

    のようなエラーを吐いてしまうんですが、なぜなのかわかりません。わかる方いらっしゃったらご指導いただければ嬉しいです。

    tamane
    @Salt-Onion

    ちなみに、haishin.csvの中身は

    ググる,,,,動詞,自立,,,動詞・ラ段,終止形,ググる,ググル,ググル
    ググら,,,,動詞,自立,,,動詞・ラ段,未然形,ググる,ググル,ググル
    ググろ,,,,動詞,自立,,,動詞・ラ段,未然形,ググる,ググル,ググル
    ググり,,,,動詞,自立,,,動詞・ラ段,連用形,ググる,ググル,ググル
    ググっ,,,,動詞,自立,,,動詞・ラ段,連用形,ググる,ググル,ググル
    ググる,,,,動詞,自立,,,動詞・ラ段,連体形,ググる,ググル,ググル
    ググれ,,,,動詞,自立,,,動詞・ラ段,仮定形,ググる,ググル,ググル
    ググれ,,,,動詞,自立,,,動詞・ラ段,命令形,ググる,ググル,ググル

    このような感じです。

    Tomoko Uchida
    @mocobeta
    MeCab IPADIC フォーマットのユーザー辞書の場合,左・右文脈IDと,コストは必須です。それらが省略されているためエラーになっています。
    よくわからない場合は,文脈IDやコストを記述しない簡略辞書フォーマットで書いてみてください。
    https://mocobeta.github.io/janome/#v0-2-7
    tamane
    @Salt-Onion
    ありがとうございます!