LoginSignup
3
1

More than 3 years have passed since last update.

Twitterのトレンドを盛り上げるBotを作る

Posted at

皆さんはTwitterのトレンドを盛り上げたい時ってありませんか?

そんな時に特定のタグから文章を生成して、自動ツイートするBotをPythonで作ってみましょう。

今回はTwitterから文を取ってきて文を作るところは省略します。
また、3回ほどアップデートしてますが、
一番最初のやつが簡単なのでそちらの解説をしてみようと思います。

構文解析をする

まず、日本語から名詞を取り出す必要があります。今回はjanome という構文解析ライブラリを使います。

janomeは日本語を構文に分解してくれるツールで

from janome.tokenizer import Tokenizer

tokenizer = Tokenizer()

sentence = '本日のゲストは和田さんでした。'

for token in tokenizer.tokenize(sentence):
    print(token)

# 本日    名詞,副詞可能,*,*,*,*,本日,ホンジツ,ホンジツ
# の   助詞,連体化,*,*,*,*,の,ノ,ノ
# ゲスト 名詞,一般,*,*,*,*,ゲスト,ゲスト,ゲスト
# は   助詞,係助詞,*,*,*,*,は,ハ,ワ
# 和田    名詞,固有名詞,人名,姓,*,*,和田,ワダ,ワダ
# さん    名詞,接尾,人名,*,*,*,さん,サン,サン
# でし    助動詞,*,*,*,特殊・デス,連用形,です,デシ,デシ
# た   助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
# 。   記号,句点,*,*,*,*,。,。,。

のように日本語を分解します。

重複チェックをする

これで1ツイートを分解してもいいのですが、これだとノイズが混じる可能性があります。

なので、複数ツイートに同じ名詞が存在した場合にのみ文章を作るようにします。

こういう人もいます。
スクリーンショット.png

まず、重複抽出用のクラスです。

class DuplicateChecker:

    def __init__(self, tokenier: Tokenizer):
        self.twitt_nouns = []
        self.tokenier = tokenier

    def extract_duplications(self) -> [str]:
        return [x for x in set(self.twitt_nouns) if self.twitt_nouns.count(x) > 1]

    def input_twitt(self, twitt: str):
        tokens = self.tokenier.tokenize(twitt)

        nouns = []
        buffer = None
        for token in tokens:
            if token.part_of_speech.count("名詞"):
                if buffer is None: 
                    buffer = ""
                buffer += token.surface
            else:
                if buffer is not None:
                    nouns.append(buffer)
                buffer = None


        self.twitt_nouns.extend(nouns)

これで、重複をチェックすると以下のようになります。

tokenier = Tokenizer()
duplicateChecker = DuplicateChecker(tokenier)

duplicateChecker.input_twitt("縞模様に可能性を感じました")
duplicateChecker.input_twitt('もう可能性しか感じない')
duplicateChecker.input_twitt('可能性感じる')

nouns = duplicateChecker.extract_duplications()
nouns # ["可能性"]

(本番はさらにユーザーでもチェックをかけていました。)

文生成

最後に抜き出した名詞から、文を作ります。(今回は適当です。)

class SentenceGenerator:

    def __init__(self, nouns:[str]):
        self.nouns = nouns
        self.senence_base = ["{}は草", "{}大切", "{}", "{}ね", "{}だね", "{}!"]

    def generate(self) -> str:
        index:int = int(random.uniform(0, 200)) % len(self.senence_base)
        sentence = self.senence_base[index].format(self.nouns[0])
        return sentence

実行するとこんな感じになります。
スクリーンショット 2.png

まとめ

今回は無茶苦茶簡単なものを作ってみました。
もし、反響があったらどうアップデートしていったのか書こうと思います。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1