2017-06-21 4 views
0

Je suis en train de construire un modèle d'analyse de sentiment sur un fichier csv sur l'utilisation du texte analytique api sur azurComment accéder à l'API cognitive Microsoft (HTTPError: Erreur HTTP 400: Bad Request)

C'est le code I utilisé:

for j in range(0,num_of_batches): # this loop will add num_of_batches strings to input_texts 
    input_texts.set_value(j,"") # initialize input_texts string j 
    for i in range(j*l//num_of_batches,(j+1)*l//num_of_batches): #loop through a window of rows from the dataset 
     comment = str(mydata["tweet"][i])   #grab the comment from the current row 
     comment = comment.replace("\"", "'") #remove backslashes (why? I don’t remember. #honestblogger) 

     #add the current comment to the end of the string we’re building in input_texts string j 
     input_texts.set_value(j, input_texts[j] + '{"language":"' + "pt"',"id":"' + str(i) + '","text":"'+ comment + '"},') 

    #after we’ve looped through this window of the input dataset to build this series, add the request head and tail 
    input_texts.set_value(j, '{"documents":[' + input_texts[j] + ']}') 

headers = {'Content-Type':'application/json', 'Ocp-Apim-Subscription-Key':account_key} 

Sentiment = pd.Series() 
batch_sentiment_url = "https://westus.api.cognitive.microsoft.com/text/analytics/v2.0/sentiment" 

jusqu'à présent tout va bien, mais quand j'essaie d'obtenir les données de l'api je reçois une erreur dans la dernière partie

for j in range(0,num_of_batches): 
    # Detect sentiment for the each batch. 
    req = urllib2.Request(batch_sentiment_url, input_texts[j], headers) 
    response = urllib2.urlopen(req) 
    result = response.read() 
    obj = json.loads(result.decode('utf-8')) 

    #loop through each result string, extracting the sentiment associated with each id 
    for sentiment_analysis in obj['documents']: 
     Sentiment.set_value(sentiment_analysis['id'], sentiment_analysis['score']) 

#tack our new sentiment series onto our original dataframe 

mydata.insert(len(mydata.columns),'Sentiment',Sentiment.values) 

Cette erreur

HTTPError: HTTP Error 400: Bad Request 

Répondre

1

Vous obtenez une erreur 400 parce que votre JSON malformé (guillemets autour dépareillées « pt »). Je ne pense pas que vous vous faites des faveurs en utilisant le module pandas pour la demande sortante, ou en essayant de créer manuellement le JSON. En particulier, vous êtes vulnérable aux marques de citation errantes ou aux caractères d'échappement vissés.

Voilà comment vous pouvez le faire à la place:

input_texts = [] 
for j in range(0,num_of_batches): # this loop will add num_of_batches strings to input_texts 
    documents = [] 
    for i in range(j*l//num_of_batches,(j+1)*l//num_of_batches): #loop through a window of rows from the dataset 
    documents.append({ 
     'language':'pt', 
     'id': str(i), 
     'text': str(mydata["tweet"][i])}) 
    input_texts.append({'documents':documents}) 

... 
req = urllib2.Request(batch_sentiment_url, json.dumps(input_texts[j]), headers) 
+0

Il a très bien fonctionné et a donné les résultats, mais la longueur de mes données est 1544 et la longueur des sentiments de retour sont 1543. Comment puis-je trouver les disparus enregistrer ou laisser tomber! Merci beaucoup –

+0

Par «longueur des données», voulez-vous dire le nombre de documents? Vous pouvez corréler l'entrée et la sortie en utilisant le champ 'id'. – cthrash

+0

pour référence future J'ai ajouté tweetid field au lieu de id puis j'ai créé une nouvelle base de données pour les résultats de sentiment et le tweetid, concaténés avec le cadre de données d'origine pour déposer l'enregistrement et par la longueur des données que je veux dire nombre d'enregistrements Merci pour l'aide que vous avez sauvé ma journée :) –

0

Toujours valider les appels API en utilisant d'abord curl. Ensuite, insérez dans le code. Cette ligne curl fonctionne pour moi:

curl -k -X POST -H "Ocp-Apim-Subscription-Key: <your ocp-apim-subscription-key>" -H "Content-Type: application/json" --data "{ 'documents': [ { 'id': '12345', 'text': 'now is the time for all good men to come to the aid of their party.' } ] }" "https://westus.api.cognitive.microsoft.com/text/analytics/v2.0/sentiment"