2017-03-15 5 views
1

Dies ist der Code, den ich gerade habe, die csvfile, die ich verwende, hat zwei Spalten, eine mit dem Text und eine mit der Nummer der Konversation, die es gehört. Jetzt habe ich es geschafft, die verschiedenen Ngrams aus dem Text zu bekommen, aber ich möchte auch die Anzahl der Konversationen mit dem Ngram verknüpft haben. Wenn also ein Ngram x Mal erscheint, möchte ich sehen, in welchen Konversationen es erscheint. Wie kann ich das tun?Wie füge ich zusätzliche Spalte in Dataframe nach Ngram-Zählung

import pandas as pd 
import numpy as np 
from sklearn.feature_extraction.text import CountVectorizer 


df = pd.read_csv("F:/textclustering/data/filteredtext1.csv", encoding="iso-8859-1" ,low_memory=False) 
document = df['Data'] 

vectorizer = CountVectorizer(ngram_range=(2, 2)) 
X = vectorizer.fit_transform(document) 
matrix_terms = np.array(vectorizer.get_feature_names()) 
matrix_freq = np.asarray(X.sum(axis=0)).ravel() 
terms = vectorizer.get_feature_names() 
freqs = X.sum(axis=0).A1 
dictionary = dict(zip(terms, freqs)) 
df = pd.DataFrame(dictionary,index=[0]).T.reindex() 
df.to_csv("F:/textclustering/data/terms2.csv", sep=',', na_rep="none") 

Eingang CSV

text, id 
example text is great, 1 
this is great, 2 
example text is great, 3 

gewünschte Ausgabe (oder etwas in der Nähe dieses)

ngram, count, id 
example text, 2, [1,3] 
text is, 2, [1,3] 
is great, 3, [1,2,3] 
this is, 1, [1] 

Antwort

1

Zuerst werden wir Dokument in csr Sparse Matrix verwandeln dann zu coo Matrix konvertieren. COO-Matrix ermöglicht es Ihnen, die Position von Zeilen und Spalten von dünn besetzten Elementen zu erhalten.

from itertools import groupby 
from sklearn.feature_extraction.text import CountVectorizer 

ls = [['example text is great', 1], 
     ['this is great', 2], 
     ['example text is great', 3]] 
document = [l[0] for l in ls] 
vectorizer = CountVectorizer(ngram_range=(2, 2)) 
X = vectorizer.fit_transform(document) 
X = X.tocoo() 

Dann können Sie groupby Spalte (für jedes Bigramm haben Sie). Hier ist ein kleiner Trick, dass Sie Tupel für Spalte zuerst sortieren müssen. Dann können Sie für jede Zeile den Index von der Zeile durch Ihr Bigramm ersetzen. Ich schaffe das Mapping wie diese

[[0, 'example text', 2, [0, 2]], 
[1, 'is great', 3, [0, 1, 2]], 
[2, 'text is', 2, [0, 2]], 
[3, 'this is', 1, [1]]] 
aussehen Wörterbuch Name id2vocab

output = [] 
id2vocab = dict((v,k) for k,v in vectorizer.vocabulary_.items()) 
zip_rc = sorted(zip(X.col, X.row), key=lambda x: x[0]) # group by column (vocab) 
count = np.ravel(X.sum(axis=0)) # simple sum column for count 
for g in groupby(zip_rc, key=lambda x: x[0]): 
    index = g[0] 
    bigram = id2vocab[index] 
    loc = [g_[1] for g_ in g[1]] 
    c = count[index] 
    output.append([index, bigram, c, loc]) 

Ausgabe mit

Verwandte Themen