import gensim import os import nltk from Sastrawi.Stemmer.StemmerFactory import StemmerFactory import swifter from textblob import TextBlob from nltk.stem import WordNetLemmatizer from gensim.models import LdaModel nltk.download('wordnet') def lemmatize_stemming(text): factory = StemmerFactory() stemmer = factory.create_stemmer() return stemmer.stem(WordNetLemmatizer().lemmatize(text, pos='v')) def preprocess(text): result=[] for token in gensim.utils.simple_preprocess(text) : if token not in gensim.parsing.preprocessing.STOPWORDS and len(token) > 3: result.append(lemmatize_stemming(token)) return result def get_topik(data): dictionary = gensim.corpora.Dictionary(data) dictionary.filter_extremes(no_below=5, no_above=0.5) bow_corpus = [dictionary.doc2bow(text) for text in data] num_topics = 1 ldamodel = LdaModel(bow_corpus, num_topics=num_topics, id2word=dictionary, passes=20, alpha='auto', eta='auto') topics = ldamodel.show_topics(num_topics=num_topics, num_words=5, log=False, formatted=False) return [topic[0] for topic in topics[0][1]] def load_lexicon(file): df=open(file,"r",encoding="utf-8", errors='replace') data=df.readlines();df.close() return [d.strip().lower() for d in data] def prediksi_sentiment(text): negasi_path = os.path.join(os.path.dirname(__file__), '..', 'assets', 'negasi.txt') fpos_path = os.path.join(os.path.dirname(__file__), '..', 'assets', 's-pos.txt') fneg_path = os.path.join(os.path.dirname(__file__), '..', 'assets', 's-neg.txt') positif, negatif, negasi = load_lexicon(fpos_path), load_lexicon(fneg_path), load_lexicon(negasi_path) posWords = [] negWords = [w for w in negatif if w in text] # percent_positif = 0 # percent_negatif = 0 for w in positif: if w in text: negated = False for n in negasi: if n+' '+w in text: negWords.append(n+' '+w) negated = True break if not negated: posWords.append(w) nPos, nNeg = len(posWords), len(negWords) # count = nPos + nNeg # if count != 0: # percent_positif = round((nPos / count) * 100) # percent_negatif = round((nNeg / count) * 100) if nPos>nNeg: return 1 if nPos 0.0: return 1 elif analysis.sentiment.polarity == 0.0: return 0 else: return -1