2017-05-14 1 views
0

J'ai un fichier csv avec 2 colonnes - phrase et étiquette. Je veux faire une matrice de terme de document pour ces phrases. Je suis nouveau en Python et jusqu'à présent, je pouvais atteindre ceci:Tokenization et dtMatrix en python avec nltk

import nltk 
import csv 
import numpy 
from nltk import sent_tokenize, word_tokenize, pos_tag 
reader = csv.reader(open('my_file.csv', 'rU'), delimiter= ";",quotechar = '"') 
for line in reader: 
for field in line: 
    tokens = word_tokenize(field) 

Mais je ne comprends pas comment prendre une seule colonne pour tokenization et créer cette matrice.

J'ai lu quelques sujets sur stackoverflow concernant le même problème mais dans tous les exemples que j'ai pu trouver, le fichier csv ne contenait qu'une colonne ou des textes codés en dur.

J'apprécierais vraiment n'importe quelle réponse. Merci d'avance!

Répondre

1

Supposons que vous ayez le fichier example.csv comme ce qui suit:

label;sentence 
"class1";"This is an example sentence." 
"class1";"This is another example sentence." 
"class2";"The third one is random." 

Lire le fichier à l'aide DictReader au lieu de reader pour qu'il vous donne à chaque ligne comme un dictionnaire

import csv 
reader = csv.DictReader(open('example.csv', 'r'), delimiter= ";",quotechar = '"') 
lines = list(reader) # this is a list each is dictionary 
sentences = [l['sentence'] for l in lines] # get only 

documents à long terme utilisant scikit-learn

from sklearn.feature_extraction.text import CountVectorizer 
count_vect = CountVectorizer(lowercase=True) 
X_count = count_vect.fit_transform(sentences) 

Le dictionnaire (mot au dictionnaire d'index) est accessible via count_vect.vocabulary_ et X_count est votre matrice document terme,

X_count.toarray() 
# [[1 0 1 1 0 0 1 0 0 1] 
# [0 1 1 1 0 0 1 0 0 1] 
# [0 0 0 1 1 1 0 1 1 0]] 

matrice document terme en utilisant NLTK c'est un peu la même chose que scikit -apprendre mais vous pouvez construire vous-même le dictionnaire et transformer des phrases pour documenter terme matrice

from nltk import word_tokenize 
from itertools import chain, groupby 
import scipy.sparse as sp 

word_tokenize_matrix = [word_tokenize(sent) for sent in sentences] 
vocab = set(chain.from_iterable(word_tokenize_matrix)) 
vocabulary = dict(zip(vocab, range(len(vocab)))) # dictionary of vocabulary to index 

words_index = [] 
for r, words in enumerate(word_tokenize_matrix): 
    for word in sorted(words): 
     words_index.append((r, vocabulary.get(word), 1)) 

Après avoir obtenu ligne/colonne/valeur de chaque condamn es, vous pouvez appliquer groupby et compter les mots qui apparaissent plus d'une fois.

rows, cols, data = [], [], [] 
for gid, g in groupby(words_index, lambda x: (x[0], x[1])): 
    rows.append(gid[0]) 
    cols.append(gid[1]) 
    data.append(len(list(g))) 
X_count = sp.csr_matrix((data, (rows, cols))) 

et ici, vous pouvez créer votre propre matrice de terme de document!

+0

Nous vous remercions de votre aide! J'apprécie vraiment cela. – ZverArt

+1

Votre bienvenue. Ce code est très brut. S'il vous plaît laissez-moi savoir si vous avez d'autres questions! – titipata