Twitter의 트렌드를 북돋우는 Bot 만들기

9586 단어 트위터파이썬
여러분은 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

실행하면 이런 느낌이 듭니다.


요약



이번에는 엉뚱한 간단한 것을 만들어 보았습니다.
만약, 반향이 있으면 어떻게 업데이트해 갔는지 쓰려고 합니다.

좋은 웹페이지 즐겨찾기