classify 과정 중에 트윗을 형태소로 쪼개고, 쪼갠 형태소가 지역명이면 그 지역명을 저장하고, 자연재해 키워드에 포함되는 것이면 그 자연재해의 대표단어를 저장하는 방식으로 분류 해놓은 상태다.
# classify.py
queries_xxx = ["xxx", ... ]
region = ["서울", "경기", ... ]
def txt2wak(txt):
m = Mecab(dicpath='C:/mecab/mecab-ko-dic')
region_tag = "None"
disaster_tag = "None"
for w in m.pos(txt):
if w[0] in region:
region_tag = w[0]
for w in m.pos(txt):
if w[0] in queries_typhoon:
disaster_tag = "태풍"
break
elif w[0] in queries_downpour:
disaster_tag = "폭우"
break
elif w[0] in queries_snow:
disaster_tag = "폭설"
break
elif w[0] in queries_forestfire:
disaster_tag = "산불"
break
elif w[0] in queries_earthquake:
disaster_tag = "지진"
break
elif w[0] in queries_coldwave:
disaster_tag = "한파"
break
elif w[0] in queries_heatwave:
disaster_tag = "폭염"
break
elif w[0] in queries_dust:
disaster_tag = "미세먼지"
break
return disaster_tag, region_tag
# models.py
class DisasterTag(models.Model):
name=models.CharField(max_length=5)
def __str__(self):
return self.name
class Tweet(BaseModel):
twid = models.TextField()
time = models.TextField()
text = models.TextField()
user = models.TextField()
disaster_tag = models.ForeignKey(DisasterTag, on_delete=models.CASCADE)
location = models.ForeignKey(Mark, on_delete=models.CASCADE, null=True, blank=True)
def __str__(self):
return str(self.disaster_tag) + " - " + str(self.text)
트윗은 Tweet 모델에 저장하는데, twid, time, text, user는 받아온 값 그대로 넣어주면 되고 자연재해태그와 지역은 ForeignKey를 사용했다. disaster_tag는 DisasterTag라는 모델을 만들어서 DisasterTag에 각 자연재해를 등록해놓으면 하나씩 가져다 끌어쓰는 방식으로 했다. (location은 나중에)
classify가 끝나면 다음 코드가 실행된다.
# main.py
for twid, time, text, user, disaster, region in zip(twids, times, texts, users, disasters, regions):
if disaster != "None":
tag_d = DisasterTag.objects.get(name=disaster)
mark = Mark.objects.get(pk=7)
tweet = Tweet(
twid=twid,
time=time,
text=text,
user=user,
disaster_tag=tag_d,
location=mark
)
tweet.save()
else: # 잘못 들어온 트윗은 저장X
pass
DisasterTag에서 해당 자연재해 태그에 맞는 모델을 불러와서 (mark는 아직 안했지만 원리는 마찬가지) tweet 모델을 만든 후에 disaster_tag 필드에 넣어주고 tweet.save()
를 통해 디비에 저장한다.
지금까지 만든 파이썬 모듈을 실행하는 viewset을 만들어 url에 연결하고
# views.py
from .main import tweet_main
class TweetView(APIView):
def get(self, request):
tweet_main()
# urls.py
from .views import TweetView
urlpatterns = [
path('tweet/', TweetView.as_view())
]
disasterTag를 등록해주고 (location도 임시로 등록해주기)
http://127.0.0.1:8000/api/tweet/
로 접속하면 이렇게 트윗이 DB에 쌓인다. (location은 고정)
트윗을 디비에 저장하는데 장고의 모델을 쓰면서 파이썬 모듈만 단독실행하는게 불가능해졌다. 그래서 장고에 url 연결을 해서 실행했는데 그랬더니 import 파일 경로들이 다 꼬여서 새로 써줬는데 뭐 대단한 차이인지는 모르겠다.
❗❗❗ 트윗을 스트리밍하는 main 모듈이 무한루프이기 때문에
http://127.0.0.1:8000/api/tweet/
에 한번만 접속해도 스트리밍은 멈추지 않는다. 그래서 여기에 계속 접속하면 접속량을 초과했다는 에러창이 뜨니까 주의해야한다. 스트리밍을 끊을 때는 Ctrl+C로 강제종료하고 다시 runserver를 돌린다. ❗❗❗