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

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

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

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

Q&A

解決済

1回答

3687閲覧

形態素解析→NGワード指定の手法について

katoyu

総合スコア15

Python 3.x

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

0グッド

0クリップ

投稿2019/06/22 09:15

ツイートを取得して形態素解析したのち、名詞を抽出してランキング化するアプリケーションを作成しています。

NGワードをランキングから除外したいため、NGワードをまとめたtxtファイルを作り、pythonで読み込もうとしましたがうまく行きませんでした。

そのまま読み込むとIndexError: list index out of rangeが表示されるので、リスト以外の何かの形式を用いるべきかと考えております。

ngwordではそれぞれのワードごとにカンマがないことに起因するのかな?とは思いましたが解決策が見当たらずにいます。

python

1import sys 2import json 3import config 4import MeCab 5from requests_oauthlib import OAuth1Session 6import re 7from collections import Counter 8from urllib import request 9import psycopg2 10from datetime import datetime 11 12date = datetime.now().strftime('%Y-%m-%d %H:%M:%S UTC') 13 14''' 15#これで失敗しました 16f = open("NGword.txt") 17data1 = f.read() 18f.close() 19print(data1) 20ngword = data1.split('\n') 21''' 22 23#DBとの接続、developmentなので下二つは未設定 24path = "localhost" 25port = "5432" 26dbname = "twitrend_development" 27#user = "" 28#password ="" 29 30# OAuth認証部分 31CK = config.CONSUMER_KEY 32CS = config.CONSUMER_SECRET 33AT = config.ACCESS_TOKEN 34ATS = config.ACCESS_TOKEN_SECRET 35sess = OAuth1Session(CK, CS, AT, ATS) 36 37# Twitter Endpoint(ホームタイムラインを取得する) 38url = "https://api.twitter.com/1.1/statuses/home_timeline.json" 39 40params = {"count":200, #ツイートを最新から何件取得するか(最大200件) 41 "include_entities" : False , #エンティティ(画像のURL等)をツイートに含めるか 42 "exclude_replies" : 0, #リプライを含めるか 43 } 44 45req = sess.get(url, params=params) 46timeline = json.loads(req.text) 47 48data = '' 49for tweet in timeline: 50 #print(tweet["text"]) 51 data += tweet["text"].replace('\n', '') #全てを一つのデータにまとめる 52 53print(data) #まとめたものを表示 54 55# MeCab 56#req = MeCab.Tagger('-Owakati') 57# パース 58mecab = MeCab.Tagger() 59parse = mecab.parse(data) 60lines = parse.split('\n') 61items = (re.split('[\t,]', line) for line in lines) 62 63count = 30 #表示単語数 64 65# 名詞をリストに格納 66#直書きすればそのまま判定が行われる 67words = [item[0] 68 for item in items 69 if (item[0] not in ('EOS', '', 't', 'ー', 'http', 'https', 'co', 'RT','the', 'a', 'T','人', '月') and 70 item[1] == '名詞' and item[2] == '一般')] 71''' 72#ngwordを放り込むとIndexError 73words = [item[0] 74 for item in items 75 if (item[0] not in (ngword) and 76 item[1] == '名詞' and item[2] == '一般')] 77''' 78 79#DBへの接続準備 80conText = "host={} port={} dbname={}" 81conText = conText.format(path,port,dbname) 82connection = psycopg2.connect(conText) 83cur = connection.cursor() 84 85# 頻度順に出力 86print("名詞") 87counter = Counter(words) 88for word, count in counter.most_common(count): 89 print(f"{word}: {count}") 90 91 created_at = date 92 updated_at = date 93 sql = 'insert into items(word, count, created_at, updated_at) values(%s, %s, %s, %s)' 94 cur.execute(sql, (word, int(count), created_at, updated_at)) 95 connection.commit() 96

NGワードについては一部抜粋としました。

NGword.txt

1アイヌ系 2合いの子 3青姦 4アカ 5明盲 6足切り 7足を洗う 8当て馬 9アメ公 10あらめん 11按摩 12家柄 1314伊勢乞食 15イタ公

バージョン

  • Python 3.6.3

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

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

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

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

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

guest

回答1

0

ベストアンサー

原因は字句解析後のitemの要素数がEOSなどで1個になりitem[1]において範囲外エラーになっているためです。
以下のようにlen(item) >= 3という条件を加えて要素数をチェックすればエラー回避できます。

Python

1words = [item[0] 2 for item in items 3 if len(item) >= 3 and (item[0] not in (ngword) and 4 item[1] == '名詞' and item[2] == '一般')]

投稿2019/06/22 10:00

can110

総合スコア38256

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

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

katoyu

2019/06/22 10:46

形態素解析後のitemの構成についてあまり理解できていませんでした... 想定通りの動作になりました、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問