Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.61 KB | None | 0 0
  1. ####################
  2. # Projeto SIM 2017/2018 - Analise de texto
  3. #
  4. # Joao Correia v2
  5. #
  6. #
  7. ####################
  8. import numpy as np
  9. import sys
  10. import glob
  11. from stemmer import Stemmer
  12. from sklearn.decomposition import NMF
  13. import re
  14.  
  15. ###################
  16.  
  17. # variaveis globais
  18. st = Stemmer('english')
  19. # COMPLETAR colocar as variaveis lidas por argumentos
  20. numero_ficheiros_a_analisar = 1
  21. numero_de_topicos = 1
  22.  
  23. #
  24.  
  25. # Faz o print dos topicos e top words
  26. def print_top_words(model, feature_names, n_top_words):
  27. for topic_idx, topic in enumerate(model.components_):
  28. print("Topic #%d:" % topic_idx)
  29. print(" ".join([feature_names[i]
  30. for i in topic.argsort()[:-n_top_words - 1:-1]]))
  31. print()
  32.  
  33.  
  34. def parseArgs(args):
  35. # Guardar em variaveis os argumentos pedidos pelo enunciado
  36. for arg in args:
  37. print(arg)
  38. pass
  39.  
  40. # COMPLETAR
  41. # remover da lista texto as palavras contidas no ficheiro stopwords
  42. def removeStopWords(texto):
  43.  
  44.  
  45. # ADAPTAR e COMPLETAR
  46. stopwords = [] # COMPLETAR deve ser a lista de stopwords (pode ser global ou passada por parametro)
  47. # lista por compreensao que cria uma lista com elementos que nao estejam noutra (neste caso da stopwords)
  48. texto_limpo = [termo for termo in texto if termo not in stopwords]
  49.  
  50.  
  51. return texto_limpo
  52.  
  53.  
  54. def readText(path):
  55. ##
  56.  
  57. texto = []
  58. # COMPLETAR ler conteudo do ficheiro para uma lista texto, contendo uma palavra por indice -> FEITO ACHO
  59.  
  60.  
  61. with open(path, 'r') as f:
  62. for line in f:
  63. for word in line.split():
  64. temp = word.lower()
  65. re.sub('[\,\.]*', "", temp)
  66. texto.append(temp.lower())
  67. return texto
  68.  
  69.  
  70. ## devolve lista de ficheiros
  71. def readFiles(path):
  72. # listar ficheiros de um caminho (path) (assumindo path = /caminho/pasta/) -> FEITO ACHo
  73.  
  74. file_list = glob.glob(pathname=path + '*')
  75. print(file_list)
  76. return file_list
  77.  
  78.  
  79. ### COMPLETAR : deve devolver uma lista de documentos ja processado (sem stopwords e na forma reduzida)
  80. def stemWords(text_apos_stopwords):
  81. text_normalizado = []
  82. st.stemWords()
  83. ## utilizar o objeto global st
  84. # exemplos
  85. print(st.stemWord('tests'))
  86. print(st.stemWord('waiting'))
  87.  
  88. return text_normalizado
  89.  
  90.  
  91. def textPreProcessing():
  92. # COMPLETAR : passar o caminho para os ficheiros a analisar -> FEITO
  93. files = readFiles('C:/Users/edgar/Desktop/jnsfr-simaulas-d4a8e622622e/text-analysis/bbc/business/')
  94. docs = []
  95. terms = []
  96.  
  97. #COMPLETAR : carregar o conjunto de stopwords uma vez para poder ser reutilizada ao longo do for
  98. # ler o ficheiro de stopwords existente (stopwords.txt)
  99. stop_words = []
  100.  
  101.  
  102. for i in range(numero_ficheiros_a_analisar):
  103. ## COMPLETAR algo neste sentido
  104.  
  105. # 1 remover stopwords do texto
  106. text_apos_stopwords = removeStopWords(readText(files[i]))
  107. # 2 a partir do texto sem stop words .. criar uma nova lista com as palavras raiz (processo de stemming)
  108. texto_processado = stemWords(text_apos_stopwords)
  109. docs.append(texto_processado)
  110.  
  111. # COMPLETAR criar lista com termos a partir de todos os termos presents em docs (sem repeticoes)
  112. terms.append('')
  113.  
  114.  
  115.  
  116. return docs, terms
  117.  
  118.  
  119.  
  120.  
  121. #Devolve matriz X com a Term-Frequency - Inverse-Document-Frequency
  122. # sera necessario ter acesso a uma lista de termos e de docs
  123. def termfrequency(docs, terms): ## completar com argumentos que sejam necessarios
  124. numeroDePalavras = 1
  125. numeroDeFicheiros = 1
  126.  
  127. # cria a matriz a zeros para calculo do TF (term frequency)
  128. X = np.zeros([numeroDePalavras, numeroDeFicheiros])
  129. ### COMPLETAR calcula termos para uma matriz da package numpy [numeroDePalavras][numeroDeFicheiros]
  130.  
  131.  
  132. ### COMPLETAR calcula IDF para uma matriz da package numpy [numeroDePalavras]
  133. X_idf = np.zeros([numeroDePalavras])
  134.  
  135. ### COMPLETAR calcular tf-idf para um array numpy [numeroDePalavras][numeroDeFicheiros]
  136. ## tfidf[termo][documento] = TF[termo][documento] * IDF[termo]
  137. X_tfidf = np.zeros([numeroDePalavras, numeroDeFicheiros])
  138.  
  139. return X_tfidf
  140.  
  141.  
  142. def pipeline():
  143. ## 1 tratamento do texto:
  144. # Passos :
  145. # (1) ler texto_raw
  146. # (2) passar para letra minuscula com a funcao lowercase()
  147. # (3) remover pontuacao com ".replace()"
  148. # (4) remover stopwords
  149. # (5) stemming
  150. # (6) construcao da lista de termos e lista de documentos
  151. list_docs, terms = textPreProcessing()
  152. ## 2 contagem da frequencia dos termos
  153. # Passos:
  154. # (1) construcao da matriz TF ( term frequency )
  155. # (2) construcao da matriz IDF ( inverse document frequency )
  156. # (3) construcao da matriz TF-IDF
  157. X_tfidf = termfrequency(list_docs, terms)
  158.  
  159. ## 3 aplicacao do NNF (COMPLETO)
  160. model = NMF(n_components=numero_de_topicos, init='random', random_state=0)
  161. W = model.fit_transform(X_tfidf)
  162.  
  163. ## 4 Output para consola e ficheiros
  164. # Passos:
  165. # (1) analisar resultados olhando para os terms e para W
  166. # (2) fazer output para ficheiro dos resultdos. Para cada topico escrever pares : termo, peso (weight); um por linha
  167. # exemplo : topico_1.csv : <term1> , <weight_term1> \n <term2> , <weight_term2> \n
  168.  
  169. # funcao para print das topwords (para analise e debug)
  170. print_top_words(model,terms,n_top_words=10)
  171.  
  172. ## COMPLETAR : output para ficheiro dos topicos e pesos (W)
  173.  
  174.  
  175. pass
  176.  
  177.  
  178. if __name__ == '__main__':
  179. parseArgs(sys.argv)# COMPLETAR .. fazer o parse dos argumentos pedidos no enunciado
  180.  
  181. # ANALISAR : funcao principal do programa
  182. pipeline()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement