2017-11-25

Python Janomeでlist index out of rangeというエラーが出たときの対処法

Python Janomeでlist index out of rangeというエラーが出たときの対処法。

Traceback (most recent call last):
  File "coappear.py", line 70, in <module>
    top_words = list(a.analyze(filterdText))[:20]
  File "/usr/local/lib/python3.5/dist-packages/janome/analyzer.py", line 105, in analyze
    tokens = tfilter.filter(tokens)
  File "/usr/local/lib/python3.5/dist-packages/janome/tokenfilter.py", line 29, in filter
    return self.apply(tokens)
  File "/usr/local/lib/python3.5/dist-packages/janome/tokenfilter.py", line 179, in apply
    for token in tokens:
  File "/usr/local/lib/python3.5/dist-packages/janome/tokenfilter.py", line 99, in apply
    for token in tokens:
  File "/usr/local/lib/python3.5/dist-packages/janome/tokenizer.py", line 201, in __tokenize_stream
    tokens, pos = self.__tokenize_partial(text[processed:], wakati, baseform_unk)
  File "/usr/local/lib/python3.5/dist-packages/janome/tokenizer.py", line 253, in __tokenize_partial
    lattice.add(Node(dummy_dict_entry, NodeType.UNKNOWN))
  File "/usr/local/lib/python3.5/dist-packages/janome/lattice.py", line 144, in add
    self.enodes[self.p + node_len].append(node)
IndexError: list index out of range```

list index out of range


というエラーは、リスト(配列)に対して存在しないインデックを指定している」という意味。


原因は複数あるけど、janomeにほかの言語が入り込んでしまうことが原因らしく、以下のコードにフィルターしたいテキストを引数に入れると、きれいになおしてくれるらしい。

def filterText(text):
   """
   :param text: str
   :rtype : str
   """
   # アルファベットと半角英数と記号と改行とタブを排除
   text = re.sub(r'[a-zA-Z0-9¥"¥.¥,¥@]+', '', text)
   text = re.sub(r'[!"“#$%&()\*\+\-\.,\/:;<=>?@\[\\\]^_`{|}~]', '', text)
   text = re.sub(r'[\n|\r|\t]', '', text)
   # 日本語以外の文字を排除(韓国語とか中国語とかヘブライ語とか)
   jp_chartype_tokenizer = nltk.RegexpTokenizer(u'([ぁ-んー]+|[ァ-ンー]+|[\u4e00-\u9FFF]+|[ぁ-んァ-ンー\u4e00-\u9FFF]+)')
   text = "".join(jp_chartype_tokenizer.tokenize(text))
   return text



参考)

「日本語以外の文字と記号を排除し日本語の平文コーパスを作成する呪文」 https://qiita.com/haminiku/items/5907cb81325083cb36c7


注目の投稿

めちゃくちゃ久しぶりにこのブログ書いたw 更新3年ぶりw > 多様性というゲームは尊厳と自由を勝ち取るゲームなのかもしれないな。  もともとツイッターでツイートした内容なんだけど、ちょっと深ぼる。 ----- 自分は男 x 30代x 二児の父 x 経営者 x 都心(共働き世...