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

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

ただいまの
回答率

88.59%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 998

katoyu

score 15

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

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

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

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

import sys
import json
import config
import MeCab
from requests_oauthlib import OAuth1Session
import re
from collections import Counter
from urllib import request
import psycopg2
from datetime import datetime

date = datetime.now().strftime('%Y-%m-%d %H:%M:%S UTC')

'''
#これで失敗しました
f = open("NGword.txt")
data1 = f.read()
f.close()
print(data1)
ngword = data1.split('\n')
'''

#DBとの接続、developmentなので下二つは未設定
path = "localhost"
port = "5432"
dbname = "twitrend_development"
#user = ""
#password =""

# OAuth認証部分
CK      = config.CONSUMER_KEY
CS      = config.CONSUMER_SECRET
AT      = config.ACCESS_TOKEN
ATS     = config.ACCESS_TOKEN_SECRET
sess = OAuth1Session(CK, CS, AT, ATS)

# Twitter Endpoint(ホームタイムラインを取得する)
url = "https://api.twitter.com/1.1/statuses/home_timeline.json"

params = {"count":200, #ツイートを最新から何件取得するか(最大200件)
          "include_entities" : False , #エンティティ(画像のURL等)をツイートに含めるか
          "exclude_replies" : 0, #リプライを含めるか
          }

req = sess.get(url, params=params)
timeline = json.loads(req.text)

data = ''
for tweet in timeline:
    #print(tweet["text"])
    data += tweet["text"].replace('\n', '') #全てを一つのデータにまとめる

print(data) #まとめたものを表示

# MeCab
#req = MeCab.Tagger('-Owakati')
# パース
mecab = MeCab.Tagger()
parse = mecab.parse(data)
lines = parse.split('\n')
items = (re.split('[\t,]', line) for line in lines)

count = 30 #表示単語数

# 名詞をリストに格納
#直書きすればそのまま判定が行われる
words = [item[0]
         for item in items
            if (item[0] not in ('EOS', '', 't', 'ー', 'http', 'https', 'co', 'RT','the', 'a', 'T','人', '月') and
             item[1] == '名詞' and item[2] == '一般')]
'''
#ngwordを放り込むとIndexError
words = [item[0]
         for item in items
            if (item[0] not in (ngword) and
             item[1] == '名詞' and item[2] == '一般')]
'''

#DBへの接続準備
conText = "host={} port={} dbname={}"
conText = conText.format(path,port,dbname)
connection = psycopg2.connect(conText)
cur = connection.cursor()

# 頻度順に出力
print("名詞")
counter = Counter(words)
for word, count in counter.most_common(count):
    print(f"{word}: {count}")

    created_at = date
    updated_at = date
    sql = 'insert into items(word, count, created_at, updated_at) values(%s, %s, %s, %s)'
    cur.execute(sql, (word, int(count), created_at, updated_at))
    connection.commit()

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

アイヌ系
合いの子
青姦
アカ
明盲
足切り
足を洗う
当て馬
アメ公
あらめん
按摩
家柄
躄
伊勢乞食
イタ公

バージョン

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/22 19:46

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

    キャンセル

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

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る