2017-12-18 4 views
0

Ich habe Situation, wo ich eine bestimmte Wörter unigram aus dem Textkörper entfernen muss, während Bi-Gramm dieses Wortes zusammen mit Unigrammen dieses Wortes beibehalten.Wie bestimmte Unigramm aus dem Textkörper entfernen, aber immer noch die Bi-Gramm dieses Wortes beibehalten?

Ich versuche, eine Textadressdaten (Spalte in einem Excel) zusammen mit einigen anderen numerischen Features zu einem Klassifizierungsalgorithmus zu übergeben. Ich muss die Textdaten berechnen und bestimmte Unigramme herausfiltern und sie an den Datenrahmen anhängen, damit der Klassifizierungsalgorithmus sie verstehen kann.

** sample data in Text Column** 

TAJ MAHAL 
TAJ MALABAR KOCHI 
TAJ MALABAR KOCHI 
TAJ RESIDENCY TVM 
LEELA PALACE 
PALACE ROAD 
HILL VIEW ROAD 
HILL AVENUE 
HILL STATION 

Für Taj und Hill, möchte ich nur Bigramme und Trigramme, ruhen alle Worte, die ich Unigramm- wollen, Bigramme und Trigramme.

** OUTPUT BigRAM und Unigramm- **

TAJ MAHAL 
TAJ MALABAR 
MALABAR KOCHI 
TAJ RESIDENCY 
KOCHI 
LEELA 
PALACE 
LEELA PALACE 
PALACE ROAD 
HILL VIEW 
HILL AVENUE 
HILL STATION 

Wenn ich als Stoppwörter Taj und Hill versuchen, die Bigramme und Trigramme sind nicht auch erzeugt

cv = CountVectorizer(max_features = 200,analyzer='word',ngram_range=(1, 3)) 
    cv_txt = cv.fit_transform(data.pop('Txt')) 
    for i, col in enumerate(cv.get_feature_names()): 
    data[col] = pd.SparseSeries(cv_txt[:, i].toarray().ravel(), fill_value=0) 

Nach der Filterung Aus den spezifischen Unigrammen möchte ich sie an den Datenrahmen anhängen, damit ich einen Klassifikationsalgorithmus ausführen kann. Endgültige Ausgabe ist dünn besetzte Matrix von countvectorized Textdaten

+0

Verwendung 'ngram_range = (2 , 3) ' –

+0

@ Vivek-Kumar Ich bin Gue OP wollte bestimmte Unigramme entfernen, aber generell Unigramme beibehalten. – ncfirth

+0

@ncfirth, richtig. Außerdem möchte ich die Elemente nach dem Filtern von countvectorizer zurück zum Datenrahmen anfügen. – pankaj

Antwort

1

Wenn Sie nur die spezifischen Unigramme entfernen möchten, müssen Sie sie aus den transformierten Daten mithilfe einer Maske entfernen. Wenn dies in etwas komplizierter als eine einmalige Analyse verwendet wird, würde ich vorschlagen, eine Wrapper-Klasse zu schreiben, um es zu verwalten, sonst wird es schwierig, den Überblick zu behalten.

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

X = """TAJ MAHAL 
TAJ MALABAR KOCHI 
TAJ MALABAR KOCHI 
TAJ RESIDENCY TVM 
LEELA PALACE 
PALACE ROAD 
HILL VIEW ROAD 
HILL AVENUE 
HILL STATION""" 
X = X.split('\n') 
df = pd.DataFrame(dict(txt=X)) 

cv = CountVectorizer(max_features = 200, analyzer='word', ngram_range=(1, 3)) 
cv.fit(df.txt) 
feat_name = cv.get_feature_names() 

#List of unigrams to remove (will work for ngrams too) 
remove_list = ['taj', 'hill'] 

# This is the mask of features you want to keep 
keep_mask = ~np.in1d(feat_name, remove_list) 

# before the mask 
X_transformed = cv.transform(df.txt) 
print(X_transformed.shape) 

# after the mask 
X_transformed = X_transformed[:, keep_mask] 
print(X_transformed.shape) 

EDIT, um aktualisierte Frage

# code to do the pandas merge 
feat_name = np.array(feat_name)[keep_mask] 
df_2 = pd.SparseDataFrame(data=X_transformed, 
          columns=feat_name, 
          default_fill_value=0) 
df_merge = df.merge(df_2, left_index=True, right_index=True) 

Ausgang:

(9, 13) 
(9, 11) 

diese ordentliche Datenrahmen in einer erhalten, eine nur

+0

Ich möchte diese zurück zu Dataframe auch, wie das getan werden kann, für i, col in Enumerate (cv.get_feature_names()): Daten [col] = pd.SparseSeries (cv_addr [:, i) .toarray() .ravel(), fill_value = 0) – pankaj

+0

Können Sie Ihre Frage bearbeiten, um klarzustellen, welche Art von Dateneingabe und -ausgabe Sie erwarten? – ncfirth

+0

Ich habe die Frage mit mehr Informationen aktualisiert, fügte ein Stück meines Codes sowie – pankaj

Verwandte Themen