0

Twitterの感情分析Windows Phoneアプリを作りたいです。

アプリケーションは、ユーザーが入力した検索語句に基づいて、関連するすべてのツイートを取得することで機能します。たとえば、入力検索ボックスに「Windows Phone」と入力すると、結果には「windows phone」という用語を含むすべてのツイートが表示されます。

これがコードです(Arik Poznanskiのブログから取得したものです)

    /// <summary>
    /// Searches the specified search text.
    /// </summary>
    /// <param name="searchText">The search text.</param>
    /// <param name="onSearchCompleted">The on search completed.</param>
    /// <param name="onError">The on error.</param>
    public static void Search(string searchText, Action<IEnumerable<Twit>> onSearchCompleted = null, Action<Exception> onError = null, Action onFinally = null)
    {
        WebClient webClient = new WebClient();

        // register on download complete event
        webClient.OpenReadCompleted += delegate(object sender, OpenReadCompletedEventArgs e)
        {
            try
            {
                // report error
                if (e.Error != null)
                {
                    if (onError != null)
                    {
                        onError(e.Error);
                    }
                    return;
                }

                // convert json result to model
                Stream stream = e.Result;
                DataContractJsonSerializer dataContractJsonSerializer = new DataContractJsonSerializer(typeof(TwitterResults));
                TwitterResults twitterResults = (TwitterResults)dataContractJsonSerializer.ReadObject(stream);

                App thisApp = Application.Current as App;
                thisApp.klasifikasi = new Klasifikasi();

                foreach (Twit Tweet in twitterResults.results)
                {
                    try
                    {
                        thisApp.klasifikasi.UploadData(Tweet); //requesting 
                        break;
                    }
                    finally
                    {
                        // notify finally callback
                        if (onFinally != null)
                        {
                            onFinally();
                        }
                    }
                }
                //thisApp.klasifikasi.UploadDatas(twitterResults.results);
                //thisApp.PositiveTweetModel = new PositiveTweetModel("Positive", twitterResults.results);

                // notify completed callback
                if (onSearchCompleted != null)
                {
                    onSearchCompleted(twitterResults.results);

                   /// Divide the list here

                }
            }
            finally
            {
                // notify finally callback
                if (onFinally != null)
                {
                    onFinally();
                }
            }
        };

        string encodedSearchText = HttpUtility.UrlEncode(searchText);
        webClient.OpenReadAsync(new Uri(string.Format(TwitterSearchQuery, encodedSearchText)));
    }

そしてメソッドを呼び出す

           TwitterService.Search(
            text,
           (items) => { PositiveList.ItemsSource = items; },
           (exception) => { MessageBox.Show(exception.Message); },
           null
           );

POST データを API にアップロードする

    public void UploadData(Twit tweetPerSend)
    {
        if (NetworkInterface.GetIsNetworkAvailable())
        {
            chatterbox.Headers[HttpRequestHeader.ContentType] = "application/x-www-                       form-urlencoded";
            chatterbox.Headers["X-Mashape-Authorization"] = "MXBxYmptdjhlbzVnanJnYndicXNpN2NwdWlvMWE1OjA0YTljMWJjMDg4MzVkYWY2YmIzMzczZWFkNDlmYWRkNDYzNGU5NmI=";

            var Uri = new Uri("https://chatterboxco-sentiment-analysis-for-social-media---nokia.p.mashape.com/sentiment/current/classify_text/");

            StringBuilder postData = new StringBuilder();
            postData.AppendFormat("{0}={1}", "lang", HttpUtility.UrlEncode("en"));
            postData.AppendFormat("&{0}={1}", "text", HttpUtility.UrlEncode(tweetPerSend.DecodedText));
            postData.AppendFormat("&{0}={1}", "exclude", HttpUtility.UrlEncode("is")); // disesuaikan 
            postData.AppendFormat("&{0}={1}", "detectlang", HttpUtility.UrlEncode("0"));
            chatterbox.UploadStringAsync(Uri, "POST", postData.ToString());
            chatterbox.UploadStringCompleted += new UploadStringCompletedEventHandler(chatterbox_UploadStringCompleted);

        }
    }


    void chatterbox_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
    {
        var chatterbox = sender as WebClient;
        chatterbox.UploadStringCompleted -= chatterbox_UploadStringCompleted;
        string response = string.Empty;
        if (!e.Cancelled)
        {
            response = HttpUtility.UrlDecode(e.Result);
            nilaiKlasifikasi = ParsingHasil(response);
            MessageBox.Show(nilaiKlasifikasi.ToString()); //just testing
            //textBlock1.Text = response;
        }
    }

    private double ParsingHasil(String response)
    {

        var result = Regex.Match(@response, @"(?<=""value"": )(-?\d+(\.\d+)?)(?=,|$)");
        Debug.WriteLine(result);
        double hasil = Convert.ToDouble(result.ToString());
        //return Convert.ToInt32(result);
        return hasil;

    }

ただし、取得するツイートは 1 つだけではなく、多数のツイートが存在するため、主な問題は、すべてのツイートを取得して結果を API に要求した後、「WebClient は同時実行をサポートしていません」というエラーが表示されることです。 /O操作」

この問題を解決する方法を知っている人はいますか?

任意の助けをいただければ幸いです

4

1 に答える 1

1

UploadStringAsyncを一度に1つずつ同期的に実行する必要があります。(つまり、UploadStringCompletedハンドラーでの次のUploadStringAsyncのチェーン実行。

または、UploadStringAsyncごとに新しいWebClientを作成します。

于 2012-12-16T06:14:24.563 に答える