textblob
- 객체지향 NLP 라이브러리¶textblob
은 NLTK
를 기반으로 하여 텍스트 처리를 수월하게 할 수 있도록 다양한 기능을 많이 포함하고 있다.
textblob 웹사이틀 통해서 소개에 나와 있듯이 "Simplified Text Processing"을 모토로 TextBlob 객체를 생성시키면 주요 메쏘드를 통해서 텍스트 처리 작업이 단순해 진다.
참고문헌
textblob
라이브러리를 사용하려면 우선 라이브러리를 먼저 설치하고, TextBlob에서 사용되는 NLTK 말뭉치(corpora)도 설치해야 된다.
conda
를 사용해서 다음 명령어로 textblob
라이브러리를 설치할 수 있다.
$ conda install -c conda-forge textblob
NLTK 말뭉치(corpora)도 다음 명령어를 사용해서 설치한다.
$ ipython -m textblob.download_corpora
$ ipython -m textblob.download_corpora [nltk_data] Downloading package brown to [nltk_data] Package brown is already up-to-date! [nltk_data] Downloading package punkt to [nltk_data] Package punkt is already up-to-date! [nltk_data] Downloading package wordnet to [nltk_data] Package wordnet is already up-to-date! [nltk_data] Downloading package averaged_perceptron_tagger to [nltk_data] Unzipping taggers\averaged_perceptron_tagger.zip. [nltk_data] Downloading package conll2000 to [nltk_data] Package conll2000 is already up-to-date! [nltk_data] Downloading package movie_reviews to [nltk_data] Package movie_reviews is already up-to-date! Finished.
from textblob import TextBlob
import pandas as pd
text = '''
The titular threat of The Blob has always struck me as the ultimate movie
monster: an insatiably hungry, amoeba-like mass able to penetrate
virtually any safeguard, capable of--as a doomed doctor chillingly
describes it--"assimilating flesh on contact.
Snide comparisons to gelatin be damned, it's a concept with the most
devastating of potential consequences, not unlike the grey goo scenario
proposed by technological theorists fearful of
artificial intelligence run rampant.
'''
blob = TextBlob(text)
for sentence in blob.sentences:
print(f"- 감성점수 {sentence.sentiment.polarity} : {sentence}")
blob.words
blob.tags[:5]
# [('The', 'DT'),
# ('titular', 'JJ'),
# ('threat', 'NN'),
# ('of', 'IN'),
# ('The', 'DT')]
text_df = pd.DataFrame(blob.tags, columns=['word', 'pos'])
text_df.groupby('pos').count()
blob.noun_phrases
from textblob import Word
from textblob.wordnet import VERB
word = Word("boy")
word.definitions
word.synsets
synonyms = set()
for synset in word.synsets:
for lemma in synset.lemmas():
synonyms.add(lemma.name())
print(synonyms)
lemmas = word.synsets[0].lemmas()
lemmas
lemmas[0].antonyms()
텍스트를 입력값으로 넣게 되면 어떤 언어인지를 파악하는 것이 후속 자연어 처리 작업에서 매우 중요한 역할을 수행하게 된다. 이를 위해서 먼저 확인된 언어가 어느 나라 언어인지 결과값이 구글 AdWords API 언어 코드에 정리되어 있다.
LanguageName | LanguageCode | CriteriaId |
---|---|---|
Arabic | ar | 1019 |
Bulgarian | bg | 1020 |
Catalan | ca | 1038 |
Chinese (simplified ) | zh_CN | 1017 |
Chinese (traditional) | zh_TW | 1018 |
Croatian | hr | 1039 |
Czech | cs | 1021 |
Danish | da | 1009 |
Dutch | nl | 1010 |
English | en | 1000 |
Korean | ko | 1012 |
구글을 통해 비즈니스통번역(영어) 3급 예제로 나온 한 문장을 받아 모범 번역과 얼마나 차이가 나는지 확인해보자. 이를 위해서 먼저 텍스트가 어떤 언어인지 확인하는 과정과 번역하는 과정을 거쳐보자.
I am writing to thank you for your hospitality in my unexpected visit to your house.
[모범번역] 통보 없이 방문했음에도 호의를 보여 주신 것에 감사 드리고자 글을 씁니다.
korean_text = "통보 없이 방문했음에도 호의를 보여 주신 것에 감사 드리고자 글을 씁니다."
ko_blob = TextBlob(korean_text)
ko_blob.detect_language()
ko_blob.translate(to='en')
뉴스기사에도 최근에는 오탈자가 눈에 띄기 시작했다. 여러가지 이유가 있기는 하겠지만, 뉴스기사 절대량이 많아지는 것이 가장 큰 이유가 될 듯 싶다. 이유가 무엇이든간에 자연어 처리로 들어가기 전에 맞춤법 검사를 통해서 텍스트에 대한 품질을 높이는 작업이 필요한데 TextBlob
에 포함된 기능을 사용해보자.
from textblob import Word
typo_sentences = '''
Analytics Vidhya is a gret platfrm to learn data scence. \n
When I grow up, I want to be a technincian! \n
If you think about it, it is orignal. \n
Take one capsule by mouth nightly 3 hours before ded. \n
Violators will be towed and find $50.
'''
for line in typo_sentences.splitlines():
print(TextBlob(line).correct())
문장의 각 단어별로 오탈자에 대한 수정단어를 확률값과 결합하여 튜플형태로 제시하여 준다.
sample_sentence = typo_sentences.splitlines()[1]
# Analytics Vidhya is a gret platfrm to learn data scence.
sample_words = sample_sentence.split()
for word in sample_words:
word_prob = Word(word).spellcheck()
print(word_prob)
텍스트 요약(Text Summarization)하는 단순한 기법 중 하나는 텍스트에서 명사를 추출하는 것이다.
import random
blob = TextBlob('Analytics Vidhya is a thriving community for data driven industry. This platform allows \
people to know more about analytics from its articles, Q&A forum, and learning paths. Also, we help \
professionals & amateurs to sharpen their skillsets by providing a platform to participate in Hackathons.')
nouns = list()
for word, tag in blob.tags:
if tag == 'NN':
nouns.append(word.lemmatize())
print ("This text is about...")
for item in random.sample(nouns, 5):
word = Word(item)
print (word.pluralize())
training = [
('Tom Holland is a terrible spiderman.','pos'),
('a terrible Javert (Russell Crowe) ruined Les Miserables for me...','pos'),
('The Dark Knight Rises is the greatest superhero movie ever!','neg'),
('Fantastic Four should have never been made.','pos'),
('Wes Anderson is my favorite director!','neg'),
('Captain America 2 is pretty awesome.','neg'),
('Let\s pretend "Batman and Robin" never happened..','pos'),
]
testing = [
('Superman was never an interesting character.','pos'),
('Fantastic Mr Fox is an awesome film!','neg'),
('Dragonball Evolution is simply terrible!!','pos')
]
from textblob import classifiers
classifier = classifiers.NaiveBayesClassifier(training)
print (f'예측모형 성능: {classifier.accuracy(testing):.2f}')
classifier.show_informative_features(3)
blob = TextBlob('the weather is terrible!', classifier=classifier)
print (blob.classify())