νμ: λ³κ°μ, κΉμ§ν, λ¨κ²½ν, μ΄λν, μ΄μ±λ―Ό, μ΅λ―Όμ¬
νλ
Έμ
νμ΄μ§: Notion
- About
- Main Fuctions
- Architecture
- Setting
- Engine
- General_Summarization
- Keysentence_Extraction
- Question_Answering
- Code_Architecture
π‘μ£Όμ : μΈκ³΅μ§λ₯ νμ© μκΈ°μκ°μ μμ½ νμ΄μ§
#NLP
#Text_Summarization
#Question_Answering
#Flask
-
- 맀 μ±μ©μ μ§μμλ λμΌν μ§λ¬Έμ μ νλ κΈμ μ λ΄μμ λ΅λ³μ νκ³ μλ€.
- μ μ
μ¬μ μ±μ©μ μ΄λ ₯μλ³΄λ€ μκΈ°μκ°μλ₯Ό μ€μνκ² νκ°
- κ²½λ ₯μ΄ μλ μ μ μ¬μμ μ 무 μνλ₯λ ₯μ λΉμ·νκΈ° λλ¬Έμ μ§μμμ μ μ¬λ ₯μ νμ νκΈ° μν λκ΅¬λ‘ μκΈ°μκ°μκ° ν° λΉμ€μ μ°¨μ§νλ€.
ββμμμ μμ½λ¨βμ κΈ°μ μμμ§μ λμμΌλ‘ μκΈ°μκ°μμ λ΄μ©μ μμ½νμ¬ ν¨κ³Όμ μΌλ‘ μ¬μ©μμκ² μ λ¬νκ³ , μνΈμμ©ν μ μλ μΈκ³΅μ§λ₯ κΈ°λ°μ μκΈ°μκ° μμ½ νμ΄μ§λ₯Ό μ 곡νλ€.
- λλ© νμ΄μ§
- μμ° μμ
default.mp4
- General Summarization: μμ°μ΄ μ²λ¦¬ λͺ¨λΈμ νμ©ν μκΈ°μκ°μ μμ½
- Keysentence Extraction: ν€μλ μ€μ¬μ λ¬Έμ₯ μΆμΆ
- Question Answering: μ§λ¬Έμ λν λ΅λ³ μ 곡
- Frontend: HTML, CSS, JS
- Engine : Pytorch
- Kobart, Textrankr, Bert
- Backend: Flask
- Install modules
pip install -r requirements.txt
- Execute
flask run
https://github.com/SKT-AI/KoBART
- BART(Bidirectional and Auto-Regressive Transformers)λ μ
λ ₯ ν
μ€νΈ μΌλΆμ λ
Έμ΄μ¦λ₯Ό μΆκ°νμ¬ μ΄λ₯Ό λ€μ μλ¬ΈμΌλ‘ 볡ꡬνλ autoencoderμ ννλ‘ νμ΅μ΄ λ©λλ€.
- Bartλ Transformerμ κΈ°λ³Έ μν€ν μ²μΈ Encoder-Decoderꡬ쑰λ₯Ό κ°κ³ μλ€.
- λ°λΌμ μ½λλ Encoderμ Decoderλ₯Ό μ°¨λ‘λ‘ ν΅κ³Όνλ€.
- Input dataλ Encoder_inputκ³Ό Decoder_inputμ λ°λ‘ μ€λΉν΄μΌνλ€.
- μ΄λ»κ² inputμ λ£μ΄μ£Όλμ λ°λΌ Taskλ§λ€ νμ΅/μΆλ‘ λ°©λ²μ΄ κ°λ¦°λ€.
-
νκ΅μ΄ BARTλ λ Όλ¬Έμμ μ¬μ©λ Text Infilling λ Έμ΄μ¦ ν¨μλ₯Ό μ¬μ©νμ¬ 40GB μ΄μμ νκ΅μ΄ ν μ€νΈμ λν΄μ νμ΅ν νκ΅μ΄ encoder-decoder μΈμ΄ λͺ¨λΈμ λλ€.
μ΄λ₯Ό ν΅ν΄ λμΆλ KoBART-baseλ₯Ό λ°°ν¬ν©λλ€. νκ΅μ΄ μν€ λ°±κ³Ό μ΄μΈ, λ΄μ€, μ± , λͺ¨λμ λ§λμΉ v1.0(λν, λ΄μ€, ...), μ²μλ κ΅λ―Όμ²μ λ±μ λ€μν λ°μ΄ν°κ° λͺ¨λΈ νμ΅μ μ¬μ©λμμ΅λλ€. -
KoBARTλ νμ΄μ€λΆμμ 곡κ°ν BARTλͺ¨λΈμ SKTμμ 40GBμ΄μμ νκ΅μ΄ ν μ€νΈλ‘ μ¬μ νμ΅μν¨ λͺ¨λΈμ΄λ€.
BARTλ seq2seq λͺ¨λΈμ μ¬μ νμ΅νκΈ° μν denoising autoencoder(DAE, μ‘μμ κ±° μ€ν μΈμ½λ)λ‘, μμμ noising functionμΌλ‘ ν μ€νΈλ₯Ό μμμν¨ ν λͺ¨λΈμ΄ μλ³Έ ν μ€νΈλ₯Ό μ¬κ΅¬μΆνλ λ°©μμΌλ‘ νμ΅μ΄ μ§νλλ€.
BARTλ κΈ°μ‘΄ BERTλͺ¨λΈκ³Ό GPTλ₯Ό ν©μΉ ꡬ쑰λ₯Ό κ°μ§κ³ μλλ°, μ΄λ‘ μΈν΄ BERTμ Bidirectional νΉμ§κ³Ό GPTμ Auto-Regressiveν νΉμ§μ λͺ¨λ κ°μ§λ€. λλΆμ BARTλ κΈ°μ‘΄ MLMλͺ¨λΈλ€μ λΉν΄ λ€μν λΆμΌμμ λμ νμ©μ±μ λνλΈλ€.
Fig.1 Bartꡬ쑰 -
BARTλ μμλ Textλ₯Ό μ λ ₯μΌλ‘ λ°μ Bidirectional λͺ¨λΈλ‘ encodingνκ³ μ λ΅ Textμ λν likelihoodλ₯Ό autoregressive λͺ¨λΈλ‘ decodingνμ¬ κ³μ°νλ€. BARTμμλ λ€μκ³Ό κ°μ 5κ°μ§ noising κΈ°λ²μ΄ μ‘΄μ¬νλ©°, μ΄λ₯Ό ν΅ν΄ μμλ Textλ₯Ό μ»λλ€.
Fig.2 NoisingκΈ°λ² -
BARTλ μκΈ°νκ· λμ½λλ₯Ό κ°κΈ° λλ¬Έμ, abstractive QAμ summarizationκ³Ό κ°μ μνμ€ μΌλ°ν(Sequence Generation) νμ€ν¬μ μ§μ μ μΌλ‘ νμΈνλ λ μ μλ€. μ΄λ² νλ‘μ νΈμμλ μ΄λ ₯μ μμ½ κΈ°λ₯μ μννκΈ° μν΄ KoBARTλͺ¨λΈμ μ±μ©λ©΄μ λ°μ΄ν°λ‘ νμΈνλμ μ§ννμλ€.(λ°μ΄ν°μ : https://www.aihub.or.kr/aihubdata/data/view.do?currMenu=&topMenu=&aihubDataSe=realm&dataSetSn=71592)
μ°Έκ³ λ¬Έν
[1] Mike LewisμΈ(2019), "BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension", ACL[2] μλ€λ₯΄μ° λΌλΉμ°¬λλ(2021), "κ΅¬κΈ BERTμ μ μ", νλΉλ―Έλμ΄
- TextRank μκ³ λ¦¬μ¦μ 2004λ
ꡬκΈμμ λ°νν PageRank μκ³ λ¦¬μ¦μ κΈ°λ°μΌλ‘ ν μκ³ λ¦¬μ¦μ΄λ€[1].
PageRank μκ³ λ¦¬μ¦μ μμ§λ μΈν°λ· λ¬Έμ κ°κ°μ κ·Έλνμ λ Έλ, λ¬Έμ λ΄λΆμ λ§ν¬ μ 보λ₯Ό κ°μ μΌλ‘ κ°μ νμ¬ λ°©ν₯μ±μ΄ μλ κ·Έλνλ₯Ό λ§λ€μ΄ λ¬Έμμ μ€μλλ₯Ό κ³μ°νλ€[2]. μ‘°κΈ λ μ½κ² λ§νμλ©΄ PageRankλ κ° μΉνμ΄μ§λ§λ€ νμ΄νΌλ§ν¬κ° μμ λ μΌλ§λ λ§ν¬λ₯Ό λ°λλμ λ°λΌ μμλ₯Ό 맀기λ μκ³ λ¦¬μ¦μ λ§νλ€. μ¦, ν΄λΉ λ§ν¬λ₯Ό ν΄λ¦ν νλ₯ λ‘ κ·Έ μμλ₯Ό 맀기λ κ²μ΄λ€. - TextRank μκ³ λ¦¬μ¦μ PageRankμ κ°λ
μ μμ°μ΄ μ²λ¦¬μ μμ©ν κ²μΌλ‘ λ¬Έμ₯, λ¨μ΄μ κ°μ νΉμ λ¨μλ€ κ°μ μ€μλλ₯Ό κ³μ°νλ μκ³ λ¦¬μ¦μ΄λ€. λ¬Έμ λ΄μ κ° λ¬Έμ₯μ κ·Έλνμ μ μ (vertex)μΌλ‘ κ°μ νλ κ²½μ° μ€μν λ¬Έμ₯λ€μ μ λ³ν μ μμΌλ©°, μ΄λ₯Ό ν΅ν΄ λ¬Έμ μμ½μ΄ κ°λ₯νλ€. κ²°κ΅, TextRankλ μμ PageRankμμμ νμ΄μ§ κ°λ
μ λ¨μ΄μ κ°λ
μΌλ‘ λ°κΎΌ μκ³ λ¦¬μ¦μ΄λ€. ν
μ€νΈλ‘ μ΄λ£¨μ΄μ§ κΈμμ νΉμ λ¨μ΄κ° λ€λ₯Έ λ¬Έμ₯κ³Ό μΌλ§λ§νΌμ κ΄κ³λ₯Ό λ§Ίκ³ μλμ§λ₯Ό κ³μ°νλ€.
- μ μ΄λ―Έμ§λ μ£Όμ΄μ§ κΈμ λν΄ ν
μ€νΈ κ° κ΄κ³λ₯Ό λνλΈ κ·Έλνλ‘ κ·Έλ¦° μν μ΄λ―Έμ§μ΄λ€. κ° λ¬Έμ₯μμ λ¨μ΄ κ°μ κ΄κ³λ₯Ό μ μΌλ‘ μ°κ²°ν κ²μ΄λ€.
κ·Έλ λ€λ©΄ ν΅μ¬ λ¬Έμ₯μ μΆμΆνκΈ° μν΄μλ μ΄λ»κ² ν΄μΌ ν κΉ? μλμ κ·Έλ¦Όμ²λΌ λ¬Έμ₯ κ·Έλνλ₯Ό λ§λ€μ΄μΌ νλ€. κ° λ¬Έμ₯μ΄ λ§λκ° λλ κ²μ΄λ€.
μ μμ μΈ(2017) "TextRank μκ³ λ¦¬μ¦κ³Ό μ£Όμ μ§μ€ μν μ κ²½λ§μ μ΄μ©ν νμ΄λΈλ¦¬λ λ¬Έμ μμ½" λ Όλ¬Έμμλ TextRank μκ³ λ¦¬μ¦μ κ° λ¬Έμ₯μ μ€μλλ₯Ό ꡬν λ, λ¬Έμ₯ κ° μκ΄νλ ¬μ μ΄μ©νμ¬ κ΅¬νμλ€.
- μ
λ ₯ λ¬Έμμ κ° λ¬Έμ₯λ€μ λν΄ ννμ λΆμμ μννκ³ , 체μΈλ₯μ μ©μΈλ₯μ TF-IDFλ₯Ό κ³μ°νμ¬ λ¬Έμ₯-λ¨μ΄ νλ ¬μ μμ±νλ€. κ·Έ λ€ μμ±λ λ¬Έμ₯-λ¨μ΄ νλ ¬μ μ μΉ νλ ¬μ ꡬνμ¬ μλ‘ κ³±ν΄μ£Όλ©΄ λ¬Έμ₯ κ°μ μκ΄κ΄κ³(correlation)μ λνλ΄λ νλ ¬μ μ»μ μ μλ€. μ΄λ κ² κ΅¬ν λ¬Έμ₯ κ° μκ΄νλ ¬μ λ¬Έμ₯ κ°μ κ°μ€μΉ κ·Έλνλ‘ λνλΌ μ μκ³ , TextRank μκ³ λ¦¬μ¦μ ν΅ν΄ κ° λ¬Έμ₯μ μ€μλλ₯Ό ꡬν μ μλ€. μ΄λ κ² κ΅¬ν μ€μλ μμΌλ‘ λ¬Έμ₯λ€μ μ λ ¬ν λ€ μμ nκ°μ λ¬Έμ₯λ€μ μ¬λ°°μΉνλ©΄ μμ½ κ²°κ³Όλ₯Ό μ»μ μ μλ€[3].
μ°Έκ³ λ¬Έν
[1] μ΄μμ μΈ(2023), "TextRank μκ³ λ¦¬μ¦ λ° μΈκ³΅μ§λ₯μ νμ©ν λΈλ μΈμ€ν λ°", JPEE : Journal of practical engineering education = μ€μ²κ³΅νκ΅μ‘λ Όλ¬Έμ§, v.15 no.2, pp.509 - 517[2] λ°°μμκ³Ό μ°¨μ μ(2010), "TextRank μκ³ λ¦¬μ¦μ μ΄μ©ν λ¬Έμ λ²μ£Όν", μ 보과ννλ Όλ¬Έμ§. Journal of KIISE. μ»΄ν¨ν μ μ€μ λ° λ ν°, v.16 no.1, pp.110-114
[3] μ μμ μΈ(2017), "TextRank μκ³ λ¦¬μ¦κ³Ό μ£Όμμ§μ€ μν μ κ²½λ§μ μ΄μ©ν νμ΄λΈλ¦¬λ λ¬Έμ μμ½", νκ΅μ΄μ 보νν 2017λ λ μ 29ν νκΈλ°νκ΅μ΄μ 보μ²λ¦¬νμ λν, pp.47 - 50
-
Question Answering modelμ μ¬μ©μλ‘λΆν° λ°μ νΉμ ν μ§μμ κ΄λ ¨λ μ λ΅μ μμ°μ΄λ‘ μλμΌλ‘ μΆλ ₯νλ μμ€ν μ΄λ€. [1]
-
QA μμ μ μ£Όμ΄μ§ μ§λ¬Έκ³Ό λ¬Έλ§₯μ μ΄ν΄νμ¬ λ΅λ³μ μ μνλ κ²μ΄ λͺ©νμΈλ°, λ΅λ³μ μ°Ύλ λ°©μμ λ°λΌ μΆμΆν(extractive), μΆμν(abstractive) μΌλ‘ λλλ€. λ¬Έμ₯ λ΄μμ μ§λ¬Έμ ν΄λΉνλ λ΅λ³μ μ°Ύμλ΄λμ§ / μ£Όμ΄μ§ μ§λ¬Έμ λν λ΅λ³μ μ§μ μμ±νλ λ°©μμ μ°¨μ΄μ΄λ€. QA μμ μ μ§ννκΈ° μν΄, ꡬκΈμμ κ°λ°ν NLP μ²λ¦¬ λͺ¨λΈμΈ BERT λͺ¨λΈμ νμ©νμλ€.
-
BERT λͺ¨λΈμ μ¬μ νλ ¨ μΈμ΄ λͺ¨λΈλ‘μ, νΉμ λΆμΌμ κ΅νλ κΈ°μ μ΄ μλλΌ λͺ¨λ μμ°μ΄ μ²λ¦¬ λΆμΌμμ μ’μ μ±λ₯μ λ΄λ λ²μ© Language Modelμ΄λ€. Transformer architertureμμ encoderλ§ μ¬μ©νλ€λ νΉμ§μ΄ μλ€.ꡬ쑰λ λ€μκ³Ό κ°λ€.
- Inputμ Token Embedding + Segment Embedding + Position Embedding 3κ°μ§ μλ² λ©μ κ²°ν©ν λ°©μμΌλ‘ μ§ννλ€. -Token Embedding : Word Piece μλ² λ© λ°©μμ μ¬μ©νλ€. Char λ¨μλ‘ μλ² λ© ν λ±μ₯ λΉλμ λ°λΌ sub-word λ‘ κ΅¬λΆνλ€. -Segment Embedding : Sentence EmbeddingμΌλ‘, ν ν° μν¨ λ¨μ΄λ€μ λ€μ νλμ λ¬Έμ₯μΌλ‘ λ§λλ μμ μ΄λ€. ꡬλΆμ [SEP] λ₯Ό ν΅ν΄ λ¬Έμ₯μ ꡬλΆνκ³ λ λ¬Έμ₯μ νλμ Segment λ‘ μ§μ νλ€. -Position Embedding : μ λ ₯ ν ν°μ μμΉ μ 보λ₯Ό κ³ λ €νμ§ μκ³ , ν ν° μμλλ‘ μΈμ½λ©νλ€.
-
MLM(masked Language Model) : μ λ ₯ λ¬Έμ₯μμ μμλ‘ ν ν°μ λ²λ¦¬κ³ (Mask) κ·Έ ν ν°μ λ§μΆλ λ°©μμΌλ‘ νμ΅μ μ§ννλ€.
-
NSP(Next Sentence Prediction) : λ λ¬Έμ₯μ΄ μ£Όμ΄μ‘μ λ, λ λ¬Έμ₯μ μμλ₯Ό μμΈ‘νλ λ°©μμ΄λ€. λ λ¬Έμ₯ κ° κ΄λ ¨μ΄ κ³ λ €λμΌ νλ NLIμ QAμ νμΈ νλμ μν΄ λ λ¬Έμ₯μ μ°κ΄μ λ§μΆλ νμ΅μ μ§ννλ€.
-
Bertλ fine-tuning λ¨κ³μμ pre-training κ³Ό κ±°μ λμΌν νμ΄νΌνλΌλ―Έν°λ₯Ό μ¬μ©νλ€. κ° NLP taskλ§λ€ fine-tuning ν Bert λͺ¨λΈμ transfer learningμμΌ μ±λ₯μ νμΈνλ€.
-
BERT κΈ°λ° QA λͺ¨λΈμ ν¬κ² λ κ°μ§ μ κ·Ό λ°©μμ μ¬μ©νλ€.
- μ§λ¬Έκ³Ό λ¬Έλ§₯μ ν¨κ» μ λ ₯μΌλ‘ λ°μ λ΅λ³μ μμΈ‘νλ λ°©μ
- μ§λ¬Έκ³Ό λ¬Έλ§₯μ κ°κ° λ°λ‘ μ λ ₯μΌλ‘ λ°μ κ°κ°μ λν μλ² λ©μ μμ±νκ³ , μ΄λ₯Ό λ€μν λ°©μμΌλ‘ κ²°ν©νμ¬ λ΅λ³μ μμΈ‘νλ λ°©μ λ³Έ νλ‘μ νΈμμλ questionκ³Ό referenceλ₯Ό λμμ input μΌλ‘ μ¬μ©νμ¬ extractive question answering λͺ¨λΈμ ꡬμ±νμλ€.
μ°Έκ³ λ¬Έν
[1] κΆμΈλ¦°, et al. "μλ£ κ΄λ ¨ μ§μμλ΅μ μν BERT κΈ°λ° νκ΅μ΄ QA λͺ¨λΈ." Proceedings of KIIT Conference. 2022.[2] Devlin, Jacob, et al. "Bert: Pre-training of deep bidirectional transformers for language understanding." arXiv preprint arXiv:1810.04805 (2018).
[3] μ‘λ€μ°, μ‘°μν, and κΆνμ² . "νκ΅μ΄ λ¬Έλ² QA μμ€ν μ μν BERT κΈ°λ° μνμ€ λΆλ₯λͺ¨λΈ." νκ΅μ 보과νν νμ λ°νλ Όλ¬Έμ§ (2021): 754-756.
βοΈ app.py
app.py
μμλ μμ§μ μ΄κΈ° μΈν νκ³ , flask μλ² μ€μ μ ν΅ν΄ νλ‘ νΈμ ν΅μ μ ν μ μλλ‘ νλ€. μμ§μμ κ°μ₯ μ€μ μΌλ‘ μ€νλλ μ½λ νμΌμ΄λ©°, λ°±μλμμ μμ²μ΄ λ€μ΄μ¬ κ²½μ°, κ·Έμ λ§λ μμ μ μννμ¬ μ²λ¦¬νλ€.- flask_corsλ₯Ό νμ©νμ¬ CORS μ΄μλ₯Ό ν΄κ²°νλ€.
from flask import Flask,render_template,request, jsonify
from flask_cors import CORS
import torch
from sum_model import summarize_model
from ext import textrank_summarize
from qa_model import get_qa_model
app = Flask(__name__)
cors = CORS(app)
- flask μ±μ μμ±νκ³ λ€μ κ²½λ‘μ λν λΌμ°ν
μ μ€μ νλ€.
'/'
: ν νμ΄μ§λ₯Ό λ λλ§'/sum'
: μμ½ νμ΄μ§λ₯Ό λ λλ§'/sum/gsummarize'
: μΌλ°μ μΈ μμ½μ μν'/sum/key'
: ν€μλ μ€μ¬μ λ¬Έμ₯ μΆμΆμ μν'/sum/qa'
: μ§λ¬Έμ λν λ΅λ³μ μ 곡
#home
@app.route('/')
def home():
return render_template('home.html')
#summary page
@app.route('/sum')
def index():
return render_template('index.html')
#general summarization
@app.route('/sum/gsummarize', methods=['POST'])
def gsummarize():
try:
data = request.get_json(force=True)
context = data['context']
gsum = summarize_model(context)
response = jsonify({'gsum': gsum})
except Exception as e:
response = jsonify({'error': str(e)})
return response
# keysentence extraction
@app.route('/sum/key',methods=['POST'])
def key():
try:
data = request.get_json(force=True)
context = data['context']
keytext = textrank_summarize(context,1) #λ¬Έμ₯ μ μ‘°μ νμ
response = jsonify({'keytext': keytext})
except Exception as e:
response = jsonify({'error': str(e)})
return response
#qa
@app.route('/sum/qa', methods=['POST'])
def qa_endpoint():
try:
data = request.get_json(force=True)
context = data['context']
question = data['question']
if question == "":
response = jsonify({'error': 'μ§λ¬Έμ μ
λ ₯ν΄μ£ΌμΈμ.'})
return response
to_predict = [{"context": context, "qas": [{"question": question, "id": "0"}]}]
result = qa_model.predict(to_predict)
answer = result[0][0]['answer'][0]
answer = "μ μ ν λ΅λ³μ μ°Ύμ μ μμ΅λλ€." if answer == '' else answer
response = jsonify({'answer': answer})
except Exception as e:
response = jsonify({'error': str(e)})
return response
- μ§μ λ λͺ¨λΈμ κ²½λ‘λ‘λΆν° CUDAλ₯Ό μ¬μ©νμ§ μκ³ λͺ¨λΈμ λ‘λνλ©°, ν΄λΉ λͺ¨λΈμ
'qa_model'
λ³μμ μ μ₯λλ€. λ§μ§λ§μΌλ‘, ν¬νΈ '5000'μμ flask μ ν리μΌμ΄μ μ μ€νμν¨λ€.
if __name__ == '__main__':
model_path = 'model/checkpoint-1119-epoch-1'
qa_model = get_qa_model(model_path, use_cuda=False)
app.run(host='127.0.0.1',port=5000,debug=True)
βοΈ ext.py
- ν€μλ μ€μ¬μΌλ‘ μ€μλ¬Έμ₯μ μΆμΆνλλ λͺ¨λμ΄λ€.
- μ¬μ©λ λΌμ΄λΈλ¬λ¦¬:
konlpy
: νκ΅μ΄ μμ°μ΄ μ²λ¦¬λ₯Ό μν λΌμ΄λΈλ¬λ¦¬
textrankr
: TextRank μκ³ λ¦¬μ¦μ νμ©ν ν μ€νΈ μμ½μ μ 곡νλ λΌμ΄λΈλ¬λ¦¬
from typing import List
from konlpy.tag import Okt
from textrankr import TextRank
class OktTokenizer:
okt: Okt = Okt()
def __call__(self, text: str) -> List[str]:
tokens: List[str] = self.okt.phrases(text)
return tokens
def textrank_summarize(text: str, num_sentences: int, verbose: bool = True) -> str:
mytokenizer: OktTokenizer = OktTokenizer()
textrank: TextRank = TextRank(mytokenizer)
summarized: str = textrank.summarize(text, num_sentences, verbose)
return summarized
βοΈ qa_model.py
- μ§λ¬Έμ λν λ΅λ³μ μ 곡νλ λͺ¨λμ΄λ€.
- μ¬μ©λ λΌμ΄λΈλ¬λ¦¬:
simpletransformers
: κ°νΈν μ¬μ©μ μν νΈλμ€ν¬λ¨Έ λͺ¨λΈ λν λΌμ΄λΈλ¬λ¦¬
import simpletransformers
from simpletransformers.question_answering import QuestionAnsweringModel, QuestionAnsweringArgs
def get_qa_model(model_path, use_cuda=False):
print('Loading model from', model_path)
qa_model = QuestionAnsweringModel('bert', model_path, use_cuda=use_cuda)
return qa_model
βοΈ sum_model.py
- μκΈ°μκ°μλ₯Ό ν¬κ΄μ μΌλ‘ μμ±μμ½νλ λͺ¨λμ΄λ€.
- μ¬μ©λ λΌμ΄λΈλ¬λ¦¬:
transformers
: Hugging Faceμ νΈλμ€ν¬λ¨Έ λͺ¨λΈ λΌμ΄λΈλ¬λ¦¬
from transformers import PreTrainedTokenizerFast, BartForConditionalGeneration
def summarize_model(text: str, verbose: bool = True) -> str:
tokenizer = PreTrainedTokenizerFast.from_pretrained('digit82/kobart-summarization')
model = BartForConditionalGeneration.from_pretrained('digit82/kobart-summarization')
input_ids = tokenizer.encode(text, return_tensors="pt")
summary_text_ids = model.generate(
input_ids=input_ids,
bos_token_id=model.config.bos_token_id,
eos_token_id=model.config.eos_token_id,
length_penalty=2.0,
max_length=102,
min_length=20,
num_beams=4,
)
summarized_text = tokenizer.decode(summary_text_ids[0], skip_special_tokens=True)
return summarized_text