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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

363閲覧

mecab解析の後, 欲しい品詞のみの抽出

rrrrrrrry

総合スコア20

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/10/26 03:05

前提・実現したいこと

N-gram解析をすることには成功したのですが, その中からさらに自立語のみを抽出したいと考え, コードを書いたところ以下のようなエラーが出ました. wordsをどのように定義したらいいのでしょうか?

もしくは, これよりも効率の良い方法はありますでしょうか?

発生している問題・エラーメッセージ

Traceback (most recent call last): File "ngram.py", line 72, in <module> main() File "ngram.py", line 61, in main bow = text2bow(argvs[2],mod="file") File "ngram.py", line 26, in text2bow words = words.replace('\n', '') UnboundLocalError: local variable 'words' referenced before assignment

該当のソースコード

python

1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3#Qiita: Pythonで単語N-gramを生成するモジュール <https://qiita.com/takumi_TKHS/items/942492b72aaf7b6a6213> 4 5import sys 6import subprocess as cmd 7 8# テキスト -> 単語(形態素)集合 9def text2bow(obj,mod): 10 11 # input: ファイルの場合はmod="file", input: 文字列の場合はmod="str" 12 if mod == "file": 13 morp = cmd.getstatusoutput("cat " + obj + " | mecab -Owakati") 14 elif mod == "str": 15 morp = cmd.getstatusoutput("echo " + obj.encode('utf-8') + " | mecab -Owakati") 16 else: 17 print("error!!") 18 sys.exit(0) 19 20 morp = list(morp) 21 22 key = ('名詞', '動詞', '形容詞', '形容動詞') 23 global words 24 25 if morp[1] in key: 26 words = morp[0] 27 28 words = words.replace('\n', '') 29 30 bow = words.split(' ') 31 32 return bow 33 34# N-gramの生成 35def gen_Ngram(words,N): 36 37 ngram = [] 38 39 for i in range(len(words)): 40 cw = "" 41 42 if i >= N-1: 43 for j in reversed(list(range(N))): 44 cw += words[i-j] 45 else: 46 continue 47 48 ngram.append(cw) 49 50 return ngram 51 52# 出力 53def output_Ngram(ngram): 54 55 for i in range(len(ngram)): 56 print(ngram[i]) 57 58def main(): 59 60 argvs = sys.argv 61 62 # input: ファイルの場合 63 bow = text2bow(argvs[2],mod="file") 64 65 # input: 文字列の場合 66 #bow = text2bow(obj=u"これはN-gramを生成するプログラムです.",mod="str") 67 68 ngram = gen_Ngram(bow,int(argvs[1])) 69 70 output_Ngram(ngram) 71 72if __name__ == "__main__": 73 74 main()

試したこと

global words
というように定義しているところは, それを入れないとlocal扱いされてしまうエラーが出たからです.

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

-Owakatiオプションは分かち書きのフォーマットで出力するというオプションなので、そもそも品詞を扱えません。

参考にしているqiitaのプログラムをそのまま適用するのは無理ですし、やるとしたら書き直しに近いことが必要になるので、どのみち書き直した方が良いです。

公式のpythonバインディングをインストールして使うのがおすすめです。解説記事は幾らでも転がっていると思います。

投稿2018/10/26 03:27

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rrrrrrrry

2018/10/26 03:43

``` def text2bow(obj,mod): # input: ファイルの場合はmod="file", input: 文字列の場合はmod="str" if mod == "file": morp = cmd.getstatusoutput("cat " + obj + " | mecab -chosen") elif mod == "str": morp = cmd.getstatusoutput("echo " + obj.encode('utf-8') + " | mecab -Ochosen") else: print("error!!") sys.exit(0) morp = list(morp) key = ('名詞', '動詞', '形容詞', '形容動詞') if morp[3] in key: words = morp[0] words = words.replace('\n', '') bow = words.split(' ') return bow ``` のようにmecabの方法を変えたのですが, 以下のようなエラー文が出てしまいます. これはなぜでしょうか? Traceback (most recent call last): File "ngram.py", line 73, in <module> main() File "ngram.py", line 62, in main bow = text2bow(argvs[2],mod="file") File "ngram.py", line 24, in text2bow if morp[3] in key: IndexError: list index out of range
hayataka2049

2018/10/26 03:45

morpにどんなデータが入っているかわかりますか? わからなければprintして確認してください
rrrrrrrry

2018/10/26 03:54

一部ですが... 確認いたしました. (0, "['\t名詞,サ変接続,*,*,*,*,*\n2010\t名詞,数,*,*,*,*,*\n年\t名詞,接尾,助数詞,*,*,*,年,ネン,ネン\n11\t名詞,数,*,*,*,*,*\n月\t名詞,一般,*,*,*,*,月,ツキ,ツキ\n
rrrrrrrry

2018/10/26 03:58 編集

more[1] in keyと修正をしました. UnboundLocalError: local variable 'words' referenced before assignment このエラーはどのように対処したら良いんでしょうか? global wordsを試したのですが全く意味がありませんでした.
hayataka2049

2018/10/26 04:00

out of rangeになるようなものがmorpに入るようなケースがあるのでしょう。どういうケースでそうなるのかはわからないので実際に確認してみてください
hayataka2049

2018/10/26 04:01

コメントが編集されたので訂正。もともと、more[1] in keyがTrueにならなければwordsに何も入らないコードですよね。なのでelse節でその場合の処理を何かしら書いてあげてください
hayataka2049

2018/10/26 04:04

あと、私の回答は最初から「公式バインディングでも使って書き直した方が良い」です。コメントが来たのでなんとなく返信しましたが、あくまでも元のコードを大事に修正していきたいというのであればこの先はご自身でどうぞ。私はフォローできません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問