2017-07-04 1 views
1

J'ai 2 fichiers python dans le même dossier utils.py et preprocessing.py.redéfinition de la fonction utilisé en python

J'ai deux fonctions définies dans utils.py fichier: preprocess_text, text2seq_generator

je dois utiliser ces functions dans preprocessing.py. Mais je reçois pas d'importer et d'avertissement disant redéfinition de la ligne preprocess_text utilisé 19

code:

utils.py

from __future__ import print_function 
from collections import defaultdict 
from collections import Counter 
from string import punctuation 
#import pdb 


def filter_text(text): 
    return ''.join([c for c in text if c not in punctuation]).lower() 

def preprocess_text(file_path_src, file_path_tar, max_feats): 
    f_src = open(file_path_src) 
    f_tar = open(file_path_tar) 
    vocab = defaultdict(int) 
    freq_src = defaultdict(int) 
    freq_tar = defaultdict(int) 
    sents_src = [line.rstrip() for line in f_src.readlines()] 
    sents_tar = [line.rstrip() for line in f_tar.readlines()] 

    for sent in sents_src: 
     sent = filter_text(sent) 
     for word in sent.split(): 
      freq_src[word] += 1 

    for sent in sents_tar: 
     for word in sent.split(): 
      freq_tar[word] += 1 

    freq_sorted_src = Counter(freq_src) 
    freq_sorted_src = freq_sorted_src.most_common(max_feats) 
    freq_sorted_tar = Counter(freq_tar) 
    freq_sorted_tar = freq_sorted_tar.most_common(max_feats) 

    freq_words_src = map(lambda x:x[0], freq_sorted_src) 
    freq_words_tar = map(lambda x:x[0], freq_sorted_tar) 

    vocab_src = dict({v:k for k, v in enumerate(freq_words_src)}) 
    vocab_tar = dict({v:k for k, v in enumerate(freq_words_tar)}) 

    vocab_src["UNK"] = max_feats 
    vocab_src["<s>"] = max_feats + 1 
    vocab_src["</s>"] = max_feats + 2 

    vocab_tar["UNK"] = max_feats 
    vocab_tar["<s>"] = max_feats + 1 
    vocab_tar["</s>"] = max_feats + 2 
    #pdb.set_trace() 
    return vocab_src, vocab_tar, sents_src, sents_tar 


def text2seq_generator(vocab_src, vocab_tar, sents_src, sents_tar): 
    unk_key = vocab_src["UNK"] 
    for sent_src, sent_tar in zip(sents_src, sents_tar): 
     seq_src = map(lambda x:vocab_src.get(x, unk_key), filter_text(sent_src).split()) 
     seq_tar = map(lambda x:vocab_tar.get(x, unk_key), sent_tar.split()) 
     #pdb.set_trace() 
     yield seq_src, seq_tar 


#vs, vt, ss, st = preprocess_text('../data/training.hi-en.en', '../data/training.hi-en.hi', 5000) 
#for x,y in text2seq_generator(vs, vt, ss, st): 
#print(y) 

fichier preprocessing.py:

from keras.preprocessing.text import Tokenizer 
    from keras.preprocessing.sequence import pad_sequences 
    import codecs 
    import pdb 
    import numpy as np 
    from utils import preprocess_text,text2seq_generator 

Erreur:

from keras.preprocessing.text import Tokenizer 
    from keras.preprocessing.sequence import pad_sequences 
    import codecs 
    import pdb 
    import numpy as np 
    from utils import preprocess_text 

    Traceback (most recent call last): 

    File "<ipython-input-8-335a30ab7871>", line 6, in <module> 
from utils import preprocess_text 

    ImportError: cannot import name 'preprocess_text' 

avertissement:

redefinition of unused preprocess_text from line 19 
+0

fichier .py d'importation et d'utiliser le function.you pourrait faire "à partir du pré-traitement des importations" –

+1

Beaucoup d'indentation cassée dans votre code. En outre, trop de code - afficher le code minimum qui génère toujours votre erreur – vmg

+0

@ Prakash047 toujours la même erreur – Anagha

Répondre

1

Il semble que vous avez un autre paquet appelé utils quelque part dans votre PYTHONPATH qui est en conflit avec votre fichier en cours.

Vous pouvez charger explicitement votre module depuis son chemin avec le module importlib.

Ajouter ces lignes à preprocessing.py (python 3.3 et 3.4):

from importlib.machinery import SourceFileLoader 

utils = SourceFileLoader("utils", "/path/to/utils.py").load_module() 
utils.preprocess_text(...) 

Pour python3.5 +, vous devez utiliser:

import importlib.util 
spec = importlib.util.spec_from_file_location("utils", "/path/to/utils.py") 
utils = importlib.util.module_from_spec(spec) 
spec.loader.exec_module(utils) 
utils.preprocess_text(...) 
+0

Merci, je n'ai pas' utils.preprocess_text (....) 'part, preprocess_text est une fonction qui est le fichier' util.py', et il doit être utilisé avec d'autres fichiers .py – Anagha

+0

@Anagha L'avez-vous essayé? Une fois le module chargé, vous pouvez y accéder avec 'moduleName.function()'. –

+0

Pas de chance, son erreur de syntaxe de lancement – Anagha

1

Option 1

Vous exécutez à partir d'un IDE Python (au lieu de l'exécuter à partir du commandline). Ensuite, l'IDE (au moins avec spyder c'est le cas) va regarder dans votre variable d'environnement path pour le script utils.py. Ce qui n'est probablement pas là.

Solution 1

Ajoutez ces lignes au début de votre script:

import sys 
sys.path.insert(0, 'directory_of_utils.py_script') 
from utils import preprocess_text, text2seq_generator 

Ou tout simplement changer votre répertoire de travail:

import os 
os.chdir('directory_of_utils.py_script') 
from utils import preprocess_text, text2seq_generator 

Option 2

Vous avez déjà installé le module utils. Par conséquent, le script va essayer de trouver la fonction preprocess_text dans ce module (BTW: cela n'arrivera pas si vous l'exécutez via la ligne de commande).

Solution 2

Renommer utils.py (Et si vous travaillez à partir IDE ajouter les lignes de la solution 1!).

+0

Merci, mais aucun d'eux n'a fonctionné. son lancer 'ImportError: aucun module nommé 'utils1' – Anagha

+0

et la combinaison de 1 et 2? votre répertoire de travail n'est probablement pas le même que le répertoire de votre script 'utils1.py' –

+0

oui, le chemin semble être le même – Anagha