artigo - Universidade Federal do Paraná
Transcrição
artigo - Universidade Federal do Paraná
Classificação de Postagens de Grupos do Facebook Fabrı́cio José de Oliveira Ceschin Universidade Federal do Paraná R. Cel. Francisco H. dos Santos, 100 Renan Luciano Burda Universidade Federal do Paraná R. Cel. Francisco H. dos Santos, 100 [email protected] [email protected] Abstract mais semelhante trata da classificação de postagens de empresas no facebook, utilizando o classificador SVM e a representação de vetores de pesos TF-IDF [9]. O SVM também foi utilizado para extrair a opinião de publicações de status dos usuários [8]. Outra aplicação de aprendizado de máquina na rede social classifica o gênero de uma pessoa, através do classificador Naı̈ve Bayes, baseando-se em um texto postado [15]. Entretanto, muitos artigos relacionados a uma generalização do problema, a classificação de texto, tarefa de classificar automaticamente um conjunto de documentos em diferentes categorias predefinidas [30], foram encontrados. Nestes artigos, são encontrados os mais variados tipos de classificadores, desde o k-nearest neighbors (KNN) até redes neuronais. A representação mais utilizada nos artigos, em sua grande maioria, é o vetor de pesos TF-IDF, embora exista a representação de vetor de palavras [16]. As abordagens que utilizam o KNN apresentam diversas variações. A abordagem mostrada em [11], por exemplo, utiliza uma função de similaridade para calcular a distância entre os texto. Os k textos mais similares ao texto de entrada são selecionados e a classe mais presente é escolhida. Já em [30] calcula-se o centroide de todas as classes e utiliza a mesma função de similaridade, calculando a distância do texto de entrada com as categorias. A categoria mais próxima é escolhida neste caso. Como as abordagens que visam o KNN, as que fazem uso de redes neuronais têm uma vasta variação, como em [16], no qual apenas uma camada escondida é utilizada. Large groups are always a problem in social networks. Due to their constant activity, it’s difficult to find something, especially in sales groups, where the categorization is very important. In this paper we use machine learning techniques, such as cossine similarity, KNN, multilayer perceptron and SVM, as a suggestion to solve this problem in a facebook group. For this, we created a dataset, containing posts from a facebook group classified into categories. 1. Introdução Com o objetivo de fornecer aos usuários as novidades mais recentes, as redes sociais procuram manter seu conteúdo organizado de forma temporal, dando prioridade ao conteúdo mais atual. Entretanto, esta abordagem pode não ser boa em grupos, locais em que pessoas com interesse em comum podem compartilhar conteúdo. Em grupos de venda, por exemplo, o conteúdo mais recente nem sempre é o mais importante. Para este tipo de grupo, abordagens semelhantes aos sites de venda seriam interessantes: separar o conteúdo em categorias, facilitando o acesso de um possı́vel comprador a um item que ele realmente tem interesse. Este trabalho tem como objetivo classificar postagens de grupos de venda do facebook utilizando algoritmos de aprendizado de máquina, com a finalidade de manter o conteúdo organizado em categorias. Para tal, foi criado um dataset [10], com postagens de um grupo de venda do facebook divididas em categorias. Inicialmente, este artigo apresenta os trabalhos relacionados a este tema, na Seção 2. Em seguida, na Seção 3, os conceitos utilizados são explicados, seguido pela implementação, na Seção 4, que utiliza estes conceitos. Finalmente, na Seção 5, encontram-se as conclusões obtidas. 3. Conceitos Nesta seção são apresentados os conceitos utilizados para a implementação do trabalho, primeiramente no préprocessamento, seção 3.1, e na classificação, seção 3.2. 3.1. Pré-processamento 2. Revisão Bibliográfica A obtenção de caracterı́sticas é um dos desafios da classificação de texto. Esta seção tem como objetivo mostrar a representação utilizada neste trabalho. Ao pesquisar artigos relacionados na literatura, não encontramos nenhum com o mesmo objetivo. A publicação 1 3.1.1 • Term Frequency (TF): mede com que frequência uma palavra t ocorre em um texto. O TF é dado pela função: Case folding e normalização O primeiro passo no pré-processamento de textos é o case folding e a normalização. O case folding trata de manter um padrão para a comparação, mantendo todos os textos em caixa baixa [2]. Já a normalização consiste em remover todos os acentos, caracteres especiais e números de um texto [33]. A normalização pode seguir várias regras, como substituir sı́mbolos e números por seus nomes, por exemplo. 3.1.2 T F (t) = • Inverse Document Frequency (IDF): mede o quão importante é uma palavra t. O IDF é dado pela função: Remoção de stop words Após a normalização do texto, é necessário remover as stop words, palavras que não têm significados essenciais em um texto, normalmente as palavras mais comuns em uma lı́ngua [32]. 3.1.3 Número de vezes que t aparece no texto Número total de palavras do texto IDF (t) = loge Bag-of-words 3.1.5 A bag-of-words é uma representação utilizada em processamento de linguagem natural e recuperação de informação, geralmente utilizada em classificação de documentos. Nesta representação, a frequência de ocorrência de cada palavra é usada como caracterı́stica para treinar um classificador [31]. Considere os seguintes textos: Número total de textos Número de textos com a palavra t Vector space model (VSM) O vector space model (VSM) representa cada texto como um vetor, que contém o TD-IDF de cada palavra [28]. Dado um texto i e o TF-IDF de uma palavra j deste texto, wi,j , ele é representado por: d~i = (wi,1 , wi,2 , ..., wi,t ) 1. João gosta de assistir filmes. Maria também gosta de filmes. 3.2. Classificação 2. João também gosta de assistir jogos de futebol. Os seguintes métodos de classificação foram utilizados neste trabalho: Similaridade do Cosseno, K-Nearest Neighbors, Multilayer Perceptron (MLP) e Support Vector Machine (SVM). Utilizando a representação bag-of-words, cada texto é uma instância, representada pela frequência da palavra, tratada como uma caracterı́stica. Assim, as caracterı́sticas destes textos são representadas pelo conjunto de todas as palavras presentes nos textos. No exemplo, as caracterı́sticas são: [ ”João”, ”gosta”, ”de”, ”assistir”, ”filmes”, ”Maria”, ”também”, ”jogos”, ”futebol” ]. Cada texto, então, é representado pela frequência deste conjunto de palavras, cada posição referente a uma palavra, na ordem apresentada no conjunto de caracterı́sticas. No exemplo, os textos são representados da forma: 3.2.1 Similaridade do Cosseno Dada a representação Vector space model (VSM) de dois textos i e j, a similaridade entre eles é calculada através do cosseno do ângulo formado pelos vetores de pesos di e dj , da seguinte forma: 1. [ 1, 2, 2, 1, 2, 1, 1, 0, 0 ] n P 2. [ 1, 1, 2, 1, 0, 0, 1, 1, 1 ] sim(di , dj ) = s Assim, temos uma possı́vel representação para textos que pode ser utilizada em um classificador. 3.1.4 n P k=0 TF-IDF (wi,k × wj,k ) k=0 2 wi,k n P 2 ∗ wj,k k=0 Logo, se os textos forem muito similares, o cosseno do ângulo gerado entre eles tende a ser próximo à 1. Em contrapartida, se os ângulos forem muito distintos, o cosseno deste ângulo tende a ficar próximo de zero. A figura 1 mostra a representação de quatro textos em um espaço bidimensional. O TF-IDF é uma medida estatı́stica utilizada para avaliar o quão importante uma palavra é para um texto em relação a uma coleção de textos [29]. Esta medida pode ser obtida utilizando a representação bag-of-words, citada na seção anterior, através da multiplicação de dois termos: 2 3.2.3 Uma rede neuronal do tipo MPL (Multilayer Perceptron) é formada por nós fontes, que são utilizados como entrada. Seguindo esta construção, existe uma camada, ou mais, escondida (hidden layers) e os nós de saı́da, respectivamente. Todas as camadas, retirando a de entrada, é constituı́da por neurônios, sendo cada um deles inicializados com um peso randômico. A rede é progressiva, ou seja, os neurônios de uma camada estão apenas conectados à próxima. Desta forma, a entrada passa por todas as camadas existentes. O número de nós de entrada é, respectivamente, o módulo da entrada, ou seja, sua dimensionalidade e, consequentemente, a quantidade de neurônios da camada de saı́da é dado pela máxima dimensionalidade do conjunto resposta desejado [4]. A figura 3 apresenta uma rede neuronal com duas camadas escondidas. Figura 1: A semelhança entre dois textos é medida através do cosseno do ângulo formado entre seus vetores [7]. Tendo essa métrica de comparação, no préprocessamento é feita a média dos itens de cada classe, gerando um único vetor para a classe, o seu centroide. Dado um texto de entrada, é calculada a sua similaridade com cada classe. Então, o texto é classificado como sendo da classe que tiver maior similaridade [30]. 3.2.2 Multilayer Perceptron (MLP) K-Nearest Neighbors Assim como a Similaridade do Cosseno, suas instâncias de entrada são os Vector space model (VSM), em que a classificação de uma nova instância é baseada na distância dos K elementos de treinamento mais próximos. Assim, este novo elemento será classificado na classe que mais ocorreu entre estes K elementos, como pode ser observado na figura 2. Figura 3: Arquitetura de uma rede neural multilayer perceptron com duas camadas escondidas [4]. 3.2.4 Support Vector Machine (SVM) O SVM (Support Vector Machine), originalmente desenvolvido para classificação binária, busca, em padrões linearmente separáveis, a construção de um hiperplano como superfı́cie de decisão (uma fronteira), de tal forma que a separação entre os exemplos seja máxima. Quando os padrões são não-linearmente separáveis,o SVM busca uma função de mapeamento, que projeta os dados em um espaço em que os dados são linearmente separáveis [14, 18]. A ideia do SVM é maximizar a margem do hiperplano dos dados de treinamento. Um hiperplano ótimo é aquele cuja distância da margem para o exemplo da classe positiva é igual a distância da margem para o exemplo da classe negativa. A figura 4 ilustra um hiperplano ótimo definido pelos vetores de suporte, os exemplos da base de treinamento mais próximos. Figura 2: A classe é calculada a partir dos K vizinhos mais próximos [5]. A semelhança entre as instâncias é medida em termos da distância euclidiana. Dada uma instância x, descrita por (a1 (x),a2 (x),...,an (x)), onde ai (x) é o i-ésimo atributo, a distância entre duas instâncias xi e xj é dada por [20]: v u n uX d(xi , xj ) = t (ar (xi ) − ar (xj ))2 ) r=1 3 duas classes, é necessário utilizar uma abordagem diferente, já que o SVM é um classificador binário. A abordagem mais comum é a um-contra-todos, também chamada de um contra-o-resto [2], em que existem q classificadores, onde q é o número de classes. Cada SVM ci é treinado para a classe i, usando como contra exemplo as outras classes. A decisão final, então, pode ser obtida através de uma ”apuração de votos”[18]. 4. Implementação Figura 4: Os exemplos da base de treinamento mais próximos do hiperplano são chamados de vetores de suporte [18]. Esta seção apresenta as informações referentes à implementação do trabalho, iniciando com a obtenção do dataset, na seção 4.1, seguido pelo funcionamento do préprocessamento, na seção 4.2, e da classificação, na seção 4.3. A função de decisão, responsável por construir o hiperplano, onde K é a função de kernel, responsável por projetar o espaço de entrada no espaço de caracterı́sticas, α e b são os parâmetros encontrados durante o treinamento, xi são os vetores de caracterı́sticas e yi , os rótulos da classe, é definida por [18]: f (x) = X 4.1. Dataset αi yi K(x, xi ) + b i Utilizando a biblioteca Facebook Python SDK [6] e gerando um token de acesso através da Graph API da rede social [12], foram coletados 1524 postagens do UFPR Mercadão [13], um grupo com cerca de 145 mil membros, cujo principal objetivo é a venda, compra e troca de produtos. O conteúdo, salvo no formato csv, foi exportado para o Google Drive, disponı́vel em [10], para facilitar a classificação das postagens, classificadas manualmente em 12 classes: animais, crianças, comida, serviços, entretenimento, moda, casa, esportes, eletrônicos, imóveis, negócios e eletrônicos. Além da classificação em classes, um pré-processamento do texto é feito manualmente, removendo palavras que possam influenciar na classificação do texto, como nomes pessoais, e corrigindo erros de digitação. Fazendo isso, garantimos que um texto de entrada que contém nome pessoal ou erro de digitação seja considerado similar a um texto do conjunto de treinamento, justamente por ele conter aquele nome ou mesmo erro. Devido a classificação manual e o tempo hábil disponı́vel, não foi possı́vel coletar mais postagens. Entretanto, pretendemos aumentar a base de dados para dar sequência a este trabalho. A Tabela 1 apresenta a distribuição dos dados do dataset. A partir desta tabela, com os textos classificados, é gerado um novo arquivo csv, utilizado como entrada do pré-processamento, contendo o texto da postagem e sua categoria em cada linha. Na maioria das vezes, os problemas não são linearmente separáveis. Por conta disso, é necessário projetar os dados em um espaço em que os dados são linearmente separáveis, projetando o espaço de entrada no espaço de caracterı́sticas utilizando a função kernel (kernel trick). Assim que projetados, é possı́vel encontrar um hiperplano que separe os dados neste espaço [18]. A figura 5 exemplifica o uso do kernel trick para projetar os dados em outra dimensão. Figura 5: Exemplo de projeção de um problema não-linearmente separável, em que os dados são projetados em outra dimensão (bidimensional para tridimensional) [18]. Como a maioria dos problemas reais envolvem mais que 4 Classe Animais Crianças Comida Serviços Entretenimento Moda Casa Esportes Eletrônicos Imóveis Negócios Veı́culos Quantidade 39 19 89 131 67 271 218 49 409 66 15 151 entrada para o classificador, junto com os rótulos de cada texto. Os testes realizados sobre os classificadores utilizou cross validation, com 20% dos dados para teste e 80% para treino. Cada teste foi executado cem vezes e a acurácia média foi calculada, como medida de comparação. 4.3.1 Tabela 1: Distribuição do dataset criado em suas 12 classes. Similaridade do Cosseno Ao utilizar a similaridade de cosseno como classificador, é calculada a média do vetor de pesos dos textos de cada classe, gerando um cluster para cada classe. A similaridade de um texto com uma classe é calculada através do método cosine similarity, também da biblioteca scikit-learn [21, 19]. O texto é classificado como sendo da classe que obteve maior similaridade. Este método de classificação obteve 80.53% de acurácia. 4.2. Pré-processamento Todos os conceitos apresentados na seção 3.1 foram utilizados na implementação do pré-processamento. O arquivo csv gerado na criação do dataset é lido, linha a linha. Para cada texto, primeiramente, são removidos caracteres especiais. Em seguida, o texto é deixado em caixa baixa e os números são removidos. Então, os espaços duplicados são removidos. Finalmente, as stop words, também em csv [17], com a inclusão de palavras frequentes em grupos de venda, são removidas do texto, que é adicionado a um dicionário, assim como sua categoria. Depois de processados, os textos e suas classes são escritos em um novo arquivo csv. Utilizando a classe TfidfVectorizer [26], da biblioteca scikitlearn [19], os textos são transformados na representação Vector space model (VSM), antes de ser utilizado no classificador. O método fit ”treina”a classe com os dados de treinamento, guardando as caracterı́sticas que representam os textos, ou seja, o conjunto de palavras dos dados de treinamento. Com o método transform, os dados passados como parâmetro são transformados para a representação Vector space model (VSM), com as caracterı́sticas de acordo com o ”treinamento”feito anteriormente, na forma de uma matriz esparsa da biblioteca scipy [27]. 0 4.3.2 K-Nearest Neighbors Utilizando o classificador KNeighborsClassifier [22], da biblioteca scikit-learn [19], os valores de K foram variados de 1 a 16. A figura 6 apresenta os resultados obtidos. As maiores acurácias foram com os valores 10 e 11, com 78.32%. 4.3. Classificação Para implementar a classificação, foram utilizadas as bibliotecas scikit-learn [19] e tensorflow [1]. Os classificadores utilizados são os mesmos apresentados na seção 3.2: primeiramente a Similaridade do Cosseno, na seção 4.3.1, seguido pelo K-Nearest Neighbors, na seção 4.3.2, Multilayer Perceptron (MLP), na seção 4.3.3, e Support Vector Machine (SVM), na seção 4.3.4. Todos os classificadores lêem o arquivo csv gerado na fase de pré-processamento e a classe TfidfVectorizer [26], da biblioteca scikit-learn [19], para criar o vetor de pesos das postagens, utilizado como Figura 6: Comparação das acurácias com a variação do parâmetro K. 5 4.3.3 Multilayer Perceptron (MLP) Figura 8: Comparação das implementações e funções de kernel do SVM. 5. Conclusão Dentre todos os classificadores utilizados, o LinearSVC (SVM com função kernel linear) obteve a melhor acurácia, com 82.93%, seguido pela similaridade de cosseno, com 80.53%, KNN (com K igual a 10 ou 11), com 78.32%, e o Multilayer Perceptron, com 77.82%. A figura 9 apresenta uma comparação da acurácia dos classificadores utilizados. Figura 7: Grafo gerado pelo tensorflow representando a rede multilayer perceptron. Para este classificador, utilizamos a biblioteca tensorflow [1], do Google. Seguindo alguns exemplos disponı́veis no github [3], criamos uma rede neuronal do tipo Multilayer Perceptron (MLP). Dentre diversos testes e diante do curto perı́odo de tempo disponı́vel, a rede que apresentou melhor resultado, com 77.82% de acurácia, teve taxa de aprendizagem de 10%, 20 épocas, duas camadas escondidas, a primeira com o n/2 neurônios e a segunda com n/4, onde n é o número de caracterı́sticas, e a divisão em 30 partições no treinamento. A figura 7 mostra o grafo gerado pelo tensorflow, representando a rede neural criada. 4.3.4 Figura 9: Comparação da acurácia dos classificadores. 5.1. Trabalhos Futuros Embora o SVM tenha apresentado melhores resultados, no futuro, pretendemos fazer testes com diferentes redes neuronais. Além disso, é necessário aumentar o dataset e equilibrar a quantidade de textos por classe para verificar se a acurácia se mantém, mesmo com uma maior diversidade dos textos. Um problema encontrado durante o trabalho foi a categorização dos posts em uma única classe, já que muitos deles podem ser encaixados em mais de uma classe. Acreditamos que uma redefinição de classes ou a utilização de alguma técnica de classificação multi-classes (ou seja, adicionar o texto para diversas categorias que ele se encaixa). Uma técnica de rejeição também pode ser utilizada para descartar os textos que o classificador apresentar maior dificuldade (ou baixa precisão) em classificar. Assim, a responsabilidade de classificação destes textos não são da Support Vector Machine (SVM) Foram utilizados duas implementações do SVM [24]: o SVC [25], com quatro funções de kernel diferentes (linear, polinomial, rbf e sigmóide), e LinearSVC [23], que possui apenas a função de kernel linear. A figura 8 apresenta os resultados das duas implementações, incluindo as variações de função de kernel do SVC. O LinearSVC apresentou a melhor acurácia, com 82.93%. 6 máquina, as possı́veis classes de um determinado texto podem funcionar apenas como uma sugestão. Os textos que não forem rejeitados podem, então, ser classificados, aumentando a acurácia. [10] Fabrı́cio Ceschin e Renan Burda. Dataset - grupos de venda. https://docs.google.com/spreadsheets/d/ 1cvKZEeUMuDCvCs4n9xFmdQ81EXr5crb3IqdCHDtyNkU/ edit?usp=sharing, acessado em novembro de 2015. [11] Lijun Wang e Zhang Jiakou. Improved knn classification algorithms research in text categorization, 2012. http://ieeexplore.ieee.org/xpl/login. jsp?tp=&arnumber=6201850, acessado em novembro de 2015. Referências [1] Martı́n Abadi, Ashish Agarwal, Paul Barham, Eugene Brevdo, Zhifeng Chen, Craig Citro, Greg S. Corrado, Andy Davis, Jeffrey Dean, Matthieu Devin, Sanjay Ghemawat, Ian Goodfellow, Andrew Harp, Geoffrey Irving, Michael Isard, Yangqing Jia, Rafal Jozefowicz, Lukasz Kaiser, Manjunath Kudlur, Josh Levenberg, Dan Mané, Rajat Monga, Sherry Moore, Derek Murray, Chris Olah, Mike Schuster, Jonathon Shlens, Benoit Steiner, Ilya Sutskever, Kunal Talwar, Paul Tucker, Vincent Vanhoucke, Vijay Vasudevan, Fernanda Viégas, Oriol Vinyals, Pete Warden, Martin Wattenberg, Martin Wicke, Yuan Yu, e Xiaoqiang Zheng. TensorFlow: Large-scale machine learning on heterogeneous systems, 2015. Software available from tensorflow.org. [12] Facebook. Graph api explorer - facebook for developers. https://developers.facebook.com/tools/ explorer/?method=GET&path=me%3Ffields% 3Did%2Cname&version=v2.1&__mref=message_ bubble, acessado em novembro de 2015. [13] Facebook. Ufpr mercadão. https://www.facebook. com/groups/ufprmercadao/, acessado em novembro de 2015. [14] André Ricardo Gon¸calves. Máquina de vetores de suporte. http://www-users.cs.umn.edu/˜andre/ arquivos/pdfs/svm.pdf, acessado em dezembro de 2015. [2] Prabhakar Raghavan e Hinrich Schütze Christopher D. Manning. Introduction to Information Retrieval. Cambridge University Press, 2008. http://nlp. stanford.edu/IR-book/html/htmledition/ capitalizationcase-folding-1.html, acessado em novembro de 2015. [15] Zach Galant e David Kravitz Jeremy Keeshin. Machine Learning and Feature Based Approaches to Gender Classification of Facebook Statuses. Stanford University, 2010. http://thekeesh.com/cs224n/final_ writeup.pdf, acessado em novembro de 2015. [3] Aymeric Damien. Tensorflow examples. https://github.com/aymericdamien/ TensorFlow-Examples, acessado em dezembro de 2015. [16] Taeho Jo. Automatic text categorization using ntc, 2009. http://ieeexplore.ieee.org/xpl/login. jsp?tp=&arnumber=5272193, acessado em novembro de 2015. [4] Fernando César C. de Castro e Maria Cristina F. de Castro. Multilayer perceptrons. http://www.feng.pucrs. br/˜decastro/pdf/RNA_C4.pdf, acessado em dezembro de 2015. [17] Stanley Loh. Listas de stopwords - stoplist (portugues, ingles, espanhol). http: //miningtext.blogspot.com.br/2008/11/ listas-de-stopwords-stoplist-portugues. html, acessado em novembro de 2015. [5] Rodrigo Fernandes de Mello. Aprendizado baseado em instâncias. http://scikit-learn.org/stable/ modules/svm.html, acessado em dezembro de 2015. [18] David Menotti. Classificadores lineares. http:// web.inf.ufpr.br/menotti/ci171-2015-2-1/ slides/aula-ClassificadoresLineares.pdf, acessado em dezembro de 2015. [6] Martey Dodoo. Facebook python sdk. https: //github.com/pythonforfacebook/ facebook-sdk, acessado em novembro de 2015. [7] Alexandre Duarte. Modelo de espaço vetorial. http://pt.slideshare.net/alexandrend/ modelo-de-espao-vetorial-16256538, acessado em dezembro de 2015. [19] F. Pedregosa, G. Varoquaux, A. Gramfort, V. Michel, B. Thirion, O. Grisel, M. Blondel, P. Prettenhofer, R. Weiss, V. Dubourg, J. Vanderplas, A. Passos, D. Cournapeau, M. Brucher, M. Perrot, e E. Duchesnay. Scikit-learn: Machine learning in Python. Journal of Machine Learning Research, 12:2825– 2830, 2011. [8] Akash Shrivatava e Bhasker Pant. Opinion Extraction and Classification of Real Time Facebook Status. Global Journal of Computer Science and Technology, 2012. http: [20] Aurora Trinidad Ramirez Pozo. Aprendizado baseado //globaljournals.org/GJCST_Volume12/ 7-Opinion-Extraction-and-Classification-of-Real.em instâncias. http://www.inf.ufpr.br/aurora/ disciplinas/datamining/ibk.pdf, acessado em pdf, acessado em dezembro de 2015. dezembro de 2015. [9] Bei Yu e Linchi Kwok. Classifying Business Marketing Mes[21] Scikit-learn. Cosine similarity. http:// sages on Facebook. SIGIR 2011 Workshop: Internet Adverscikit-learn.org/stable/modules/metrics. tising, 2011. http://research.microsoft.com/ html#cosine-similarity, acessado em novembro en-us/um/beijing/events/ia2011/n7.pdf, de 2015. acessado em novembro de 2015. 7 [22] Scikit-learn. Kneighborsclassifier. http: //scikit-learn.org/stable/modules/ generated/sklearn.neighbors. KNeighborsClassifier.html#sklearn. neighbors.KNeighborsClassifier, acessado em dezembro de 2015. [23] Scikit-learn. Linearsvc. http://scikit-learn.org/ stable/modules/generated/sklearn.svm. LinearSVC.html#sklearn.svm.LinearSVC, acessado em dezembro de 2015. [24] Scikit-learn. Support vector machines. http: //pt.slideshare.net/alexandrend/ modelo-de-espao-vetorial-16256538, acessado em dezembro de 2015. [25] Scikit-learn. Svc. http://scikit-learn.org/ stable/modules/generated/sklearn.svm. SVC.html#sklearn.svm.SVC, acessado em dezembro de 2015. [26] Scikit-learn. Tfidfvectorizer. http://scikit-learn. org/stable/modules/generated/sklearn. feature_extraction.text.TfidfVectorizer. html, acessado em novembro de 2015. [27] Scipy. Sparce matrices. http://docs.scipy.org/ doc/scipy/reference/sparse.html, acessado em novembro de 2015. [28] Dr. Ian Soboroff. Ir models: The vector space mode. http://www.csee.umbc.edu/˜ian/irF02/ lectures/07Models-VSM.pdf, acessado em novembro de 2015. [29] tf idf. Tf-idf: A single-page tutorial - information retrieval and text mining. http://www.tfidf.com/, acessado em novembro de 2015. [30] Pinki Kumari e Jordan Pascual Vishwanath Bijalwan, Vinay Kumar. Knn based machine learning approach for text and document mining, 2014. http://www.sersc. org/journals/IJDTA/vol7_no1/6.pdf, acessado em novembro de 2015. [31] Wikipedia. Bag-of-words model. https://en. wikipedia.org/wiki/Bag-of-words_model, acessado em novembro de 2015. [32] Wikipedia. Stop words. https://en.wikipedia. org/wiki/Stop_words, acessado em novembro de 2015. [33] Wikipedia. Text normalization. https://en. wikipedia.org/wiki/Text_normalization, acessado em novembro de 2015. 8