前提・実現したいこと
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扱いされてしまうエラーが出たからです.
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/26 03:43
2018/10/26 03:45
2018/10/26 03:54
2018/10/26 03:58 編集
2018/10/26 04:00
2018/10/26 04:01
2018/10/26 04:04