azu / delete-tweets

Twitterのアーカイブから削除候補のTweetsを抽出する補助ツールと削除するツール。

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

delete-tweets

Twitterのアーカイブから削除候補のTweetsを抽出する補助ツールと削除するツール。

  • ⚠️ 削除候補の抽出は基本的に過剰にかかるようになっています。細かいところは辞書などで調整してください。
  • ⚠️ Tweetsの削除をすると復元はできないので、自己責任で削除してください。

Features

  • Twitterのデータアーカイブを使った削除の対応
  • 自然言語、感情極性値ベースのフィルターでの絞り込みの対応
  • 絞り込んだ結果のみをTwitterから削除
  • 削除済みの履歴を使った絞り込みのキャッシュ
    • Tweetsを削除して、辞書を更新して、また絞り込みと何度も繰り返し処理ができる

必要なもの

Install

Yarnを使ってインストールして、yarn bootstrapを実行してください。

yarn install
yarn bootstrap

Usage

次のステップでTweetsを削除します。

  1. Import Archive - TwitterのアーカイブからTweetsデータの作成
  2. Detect Tweets - Tweetsデータをフィルタリングして削除候補のTweetsデータを作成
  3. Delete Tweets - 削除対象のTweetsを削除

削除後は、data/deleted-twwets.txt に削除したTweetのIDが記録されます。 すでに削除済みの場合は、次から無視されるので、2 ~ 3 を繰り返し実行できるようにデザインしています。

Import Archive

  1. 全ツイート履歴をダウンロードする方法を参考にTwitterのアーカイブをリクエストします
  2. Twitterのアーカイブ(twitter-*.zip)をダウンロードして展開します
  3. 中に含まれる tweeet*.jstwitter-archives/ ディレクトリにコピーします
twitter-archives/
├── tweet.js
├── tweet-part1.js
└── tweet-part2.js
  1. 次のコマンドを実行して、tweet*.js をインポートして data/tweets.json を作成します

    yarn import-twitter-archives

Detect Tweets

yarn detect コマンドで、削除候補のTweetsデータを data/will-delete-tweets.json として作成できます。

# all tweets
yarn detect
# 2015-01-01 ~ Now
$ yarn detect --fromDate 2015-01-01
# 2015-01-01 ~ 2016-01-01
$ yarn detect --fromDate 2015-01-01 --toDate 2016-01-01

yarn detect--fromDate YYYY-MM-DD--toDate YYYY-MM-DD で対象のTweetsの日付範囲を指定できます。

削除候補を推定する実装アルゴリズムは次の通りです。

  • textlintでの放送禁止用語不適切表現のチェック
  • ネガティブ(感情極性値ベース)の推定
  • ユーザー定義の許可リスト、不許可リスト

config.jsでそれぞれの仕組みを利用するかの設定ができます。

📝 基本的にfalse positiveを含んだ過剰な削除候補を作成します。削除候補をチェックして実際に削除する候補のみを data/will-delete-tweets.json に残してください。

ユーザー定義の辞書で削除候補に追加、削除できます。 次のファイルに定義することで、自動的にyarn detectが処理します。

allow-id.yaml

削除しないTweetのidを指定できます。

たとえば、https://twitter.com/twitter/status/123456765432 を削除対象から外す場合は次のように定義できます。

- 123456765432

disallow.yaml

Tweetsに含まれていたら削除対象とする辞書を定義します。 不許可リストには、文字列またはRegExp-like Stringベースの正規表現の配列を指定できます。

マッチ対象は tweeet.text の値のみです。

- /[亜-熙ぁ-んァ-ヶ]w+(\s|$)/ # これはwww みたいなやつ
- /(?<!く)ださい/ # くださいは対象外
- /これだけ知って(おけ|れば)/
- 嘘つき
- ぼったくり

allow.yaml

disallow.yamlやtextlintでNGとなった場合にも、マッチした範囲がallow.yamlで許可されている場合は、削除対象から外せます。 許可リストには、文字列またはRegExp-like Stringベースの正規表現の配列を指定できます。

📝 allow.yamlで定義した辞書がtweet.text に含まれているから無条件にOKではなく、あくまでNGとなった範囲がが許可された範囲に含まれていれば、OKという実装になってる

- エディター # 特定の単語はOK
- /ECMAScript \d+/ # 正規表現
- /.*example\.com.*/ # example.com を含むならOK

例) 次のようにdisallow.yamlクソ という単語をNGとしてしまうと、ダークソウルもNGとなってしまう。 この場合は、allow.yamlダークソウル を定義することで、ダークソウルは許可される。

disallow.yaml:

- クソ

allow.yaml:

- ダークソウル

実装の詳細:

disallow.yamlによって、2から3までの範囲がNGとして報告される。 allow.yamlによって、0から5までの範囲はたとえNGがあっても例外として無視する。

|||||||||||
------------------ 対象のTweetのtext
|||||||||||
------------------ disallow.yamlの定義
    |||
------------------ allow.yamlの定義
|||||||

Steps:

  1. allow-id.yaml check tewet.id
  2. disallow.yaml check tweet.text
  3. allow.yaml check the disallowed word

Delete tweets

yarn detectで作成した data/will-delete-tweets.json にかかれているTweetsを実際に削除します。

.env ファイルを作成し、Twitter V2 APIのクライアントを作成して、そのクライアントのAPI KeyとAccess Tokenを入れて下さい。

TWITTER_APP_KEY="x"
TWITTER_APP_SECRET="x"
TWITTER_ACCESS_TOKEN="x"
TWITTER_ACCESS_SECRET="x"

yarn delete-tweets を実行すると、 data/will-delete-tweets.json に書かれたTweetsを0.5秒間隔で削除していきます。

yarn delete-tweets # It delete tweets actually

⚠️ Tweetsを削除すると復元はできません。 data/will-delete-tweets.json には削除したい対象だけを残してください。 TwitterのAPIを大量に叩く可能性があるので、自己責任で実行してください。

📝 削除したTweetsはdata/deleted-twwets.txtにIDが記録されます。 途中で削除を停止した場合も続きから実行できます。Rate Limitにかかった場合は自動で停止するつもりですが、そうじゃなかったらIssueを作ってください。

Debug

jq support JSONLD.

cat data/will-delete-tweets.json | jq -s ".[].text"

Count will delete tweets:

cat data/will-delete-tweets.json | wc -l

Group by error's reason:

cat data/will-delete-tweets.json | jq -s "group_by(.reason)[] |  {(.[0].reason): [.[] | .]}"

Group by error's reason and count it

cat data/will-delete-tweets.json | jq -s "[group_by(.reason)[] | {reason: .[0].reason, count: length }] | sort_by(.count) | reverse"

Show specific reason

cat data/will-delete-tweets.json | jq -s 'group_by(.reason)[] | select(.[0].reason | contains("理由")) | .[].text'

Show favorited sort

cat data/will-delete-tweets.json | jq -s "[group_by(.reason)[] | {favorite_count: .[0].favorite_count, tweet: .[0].text, count: length, reason: .[0].reason  }] | sort_by(.favorite_count) | reverse" | less

Remove specific errors

cat data/will-delete-tweets.json | jq -s -c 'group_by(.reason)[] | select(.[0].reason | contains("感情極性値") | not) | .[]' > data/will-delete-tweets.updated.json 

Test a text from stdin

echo "いやらしい文章" | yarn test-detect
# 感情極性値が0.3未満
# [ 'textlint-rule-ja-no-inappropriate-words: 不適切表現「いやらしい」が含まれています。' ]

Related

Changelog

See Releases page.

Running tests

Install devDependencies and Run npm test:

npm test

Contributing

Pull requests and stars are always welcome.

For bugs and feature requests, please create an issue.

  1. Fork it!
  2. Create your feature branch: git checkout -b my-new-feature
  3. Commit your changes: git commit -am 'Add some feature'
  4. Push to the branch: git push origin my-new-feature
  5. Submit a pull request :D

Author

License

MIT © azu

About

Twitterのアーカイブから削除候補のTweetsを抽出する補助ツールと削除するツール。

License:MIT License


Languages

Language:TypeScript 80.7%Language:JavaScript 18.9%Language:Shell 0.4%