Twitterのアーカイブから削除候補のTweetsを抽出する補助ツールと削除するツール。
⚠️ 削除候補の抽出は基本的に過剰にかかるようになっています。細かいところは辞書などで調整してください。⚠️ Tweetsの削除をすると復元はできないので、自己責任で削除してください。
- Twitterのデータアーカイブを使った削除の対応
- 自然言語、感情極性値ベースのフィルターでの絞り込みの対応
- 絞り込んだ結果のみをTwitterから削除
- 削除済みの履歴を使った絞り込みのキャッシュ
- Tweetsを削除して、辞書を更新して、また絞り込みと何度も繰り返し処理ができる
- Node.js 14+
- 全ツイート履歴をダウンロードしたzipファイル
- Twitter V2 APIのクライアントのAPIキー
Yarnを使ってインストールして、yarn bootstrap
を実行してください。
yarn install
yarn bootstrap
次のステップでTweetsを削除します。
- Import Archive - TwitterのアーカイブからTweetsデータの作成
- Detect Tweets - Tweetsデータをフィルタリングして削除候補のTweetsデータを作成
- Delete Tweets - 削除対象のTweetsを削除
削除後は、data/deleted-twwets.txt
に削除したTweetのIDが記録されます。
すでに削除済みの場合は、次から無視されるので、2 ~ 3 を繰り返し実行できるようにデザインしています。
- 全ツイート履歴をダウンロードする方法を参考にTwitterのアーカイブをリクエストします
- Twitterのアーカイブ(
twitter-*.zip
)をダウンロードして展開します - 中に含まれる
tweeet*.js
をtwitter-archives/
ディレクトリにコピーします
twitter-archives/
├── tweet.js
├── tweet-part1.js
└── tweet-part2.js
- 次のコマンドを実行して、
tweet*.js
をインポートしてdata/tweets.json
を作成します
yarn import-twitter-archives
yarn detect
コマンドで、削除候補のTweetsデータを data/will-delete-tweets.json
として作成できます。
# 全ての期間を対象にする
$ 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の日付範囲を指定できます。
削除候補を推定する実装アルゴリズムは次の通りです。
config.jsでそれぞれの仕組みを利用するかの設定ができます。
📝 基本的にfalse positiveを含んだ過剰な削除候補を作成します。削除候補をチェックして実際に削除する候補のみを data/will-delete-tweets.json
に残してください。
ユーザー定義の辞書で削除候補に追加、削除できます。
次のファイルに定義することで、自動的にyarn detect
が処理します。
削除しないTweetのid
を指定できます。
たとえば、https://twitter.com/twitter/status/123456765432
を削除対象から外す場合は次のように定義できます。
- 123456765432
Tweetsに含まれていたら削除対象とする辞書を定義します。 不許可リストには、文字列またはRegExp-like Stringベースの正規表現の配列を指定できます。
マッチ対象は tweeet.text
の値のみです。
- /[亜-熙ぁ-んァ-ヶ]w+(\s|$)/ # これはwww みたいなやつ
- /(?<!く)ださい/ # くださいは対象外
- /これだけ知って(おけ|れば)/
- 嘘つき
- ぼったくり
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があっても例外として無視する。
|0|1|2|3|4|5|6|7|8|9|
------------------ 対象のTweetのtext
|ダ|ー|ク|ソ|ウ|ル|は|ゲ|ー|ム|
------------------ disallow.yamlの定義
|ク|ソ|
------------------ allow.yamlの定義
|ダ|ー|ク|ソ|ウ|ル|
Steps:
allow-id.yaml
checktewet.id
disallow.yaml
checktweet.text
allow.yaml
check the disallowed word
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
data/will-delete-tweets.json
には削除したい対象だけを残してください。
TwitterのAPIを大量に叩く可能性があるので、自己責任で実行してください。
📝 削除したTweetsはdata/deleted-twwets.txt
にIDが記録されます。
途中で削除を停止した場合も続きから実行できます。Rate Limitにかかった場合は自動で停止するつもりですが、そうじゃなかったらIssueを作ってください。
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: 不適切表現「いやらしい」が含まれています。' ]
See Releases page.
Install devDependencies and Run npm test
:
npm test
Pull requests and stars are always welcome.
For bugs and feature requests, please create an issue.
- Fork it!
- Create your feature branch:
git checkout -b my-new-feature
- Commit your changes:
git commit -am 'Add some feature'
- Push to the branch:
git push origin my-new-feature
- Submit a pull request :D
MIT © azu