皆さんはTwitterのトレンドを盛り上げたい時ってありませんか?
そんな時に特定のタグから文章を生成して、自動ツイートするBotをPythonで作ってみましょう。
今回はTwitterから文を取ってきて文を作るところは省略します。
また、3回ほどアップデートしてますが、
一番最初のやつが簡単なのでそちらの解説をしてみようと思います。
構文解析をする
まず、日本語から名詞を取り出す必要があります。今回はjanome
という構文解析ライブラリを使います。
janome
は日本語を構文に分解してくれるツールで
from janome.tokenizer import Tokenizer
tokenizer = Tokenizer()
sentence = '本日のゲストは和田さんでした。'
for token in tokenizer.tokenize(sentence):
print(token)
# 本日 名詞,副詞可能,*,*,*,*,本日,ホンジツ,ホンジツ
# の 助詞,連体化,*,*,*,*,の,ノ,ノ
# ゲスト 名詞,一般,*,*,*,*,ゲスト,ゲスト,ゲスト
# は 助詞,係助詞,*,*,*,*,は,ハ,ワ
# 和田 名詞,固有名詞,人名,姓,*,*,和田,ワダ,ワダ
# さん 名詞,接尾,人名,*,*,*,さん,サン,サン
# でし 助動詞,*,*,*,特殊・デス,連用形,です,デシ,デシ
# た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
# 。 記号,句点,*,*,*,*,。,。,。
のように日本語を分解します。
重複チェックをする
これで1ツイートを分解してもいいのですが、これだとノイズが混じる可能性があります。
なので、複数ツイートに同じ名詞が存在した場合にのみ文章を作るようにします。
まず、重複抽出用のクラスです。
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
まとめ
今回は無茶苦茶簡単なものを作ってみました。
もし、反響があったらどうアップデートしていったのか書こうと思います。