0

データベースから単語のスコアを取得したいので、段落について、これが正の段落か負
の段落かを判断します。データベースのファイル形式は次のようになります。いくつかのキーワードが正と負のスコアを持っているところ

Word                Pos_Score           Neg_Score

Able                .324                .834
Country             .987                .213
Love                .378                .734 
agree               .546                .123
industry            .289                .714
guests              .874                .471

段落はこのようになります。

I agree with you.  It seems an intelligent tourist industry allows its guests to either immerse fully, in part, or not, depending upon the guest.  That is why the ugly American charges have always confused me.  

次に、段落の各単語をデータベースファイルと比較します。データベースファイルで見つかった単語の場合、単語のPos_ScoeスコアとNeg_Scoreスコアを取得します。これらのスコアは、段落全体が最後に比較されるときに変数に格納されます。Pos_Scoreは個別に追加すると、Neg_Scoreは個別に追加されます。これが結果になります。
私が試したコードはこれです

    private void button1_Click(object sender, EventArgs e)
            {
                string MyConString = "server=localhost;" +
                   "database=sentiwornet;" + "password=zia;" +
                   "User Id=root;";
                MySqlConnection connection = new MySqlConnection(MyConString);
                MySqlCommand command = connection.CreateCommand();
                MySqlDataReader Reader;
                StreamReader reader = new StreamReader("D:\\input.txt");
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    string[] parts = line.Split(' ');

                    foreach (string part in parts)
                    {
                        command.CommandText = "SELECT Pos_Score FROM score WHERE Word = 'part'";
                        command.CommandText = "SELECT Neg_Score FROM score WHERE Word = 'part'";
                        //var 
                        connection.Open();
                        Reader = command.ExecuteReader();

                    }
                }

            }
4

2 に答える 2

2

まず、このクエリはひどく非効率的であることが約束されています。代わりに、段落が十分に小さい場合は、引数をCSVリストとして渡してから、SQLでテーブルに変換することにより、データベース内のすべての結合を実行します。次の関数がそれを行います(http://codebank.wordpress.com/2007/03/06/simple-sql-csv-to-table-2/の提供):

警告:次のようなものを使用してすべての句読点を取り除く必要がありますstring.Replace(new[] { '.', ',' ... etc })

また、私のコードがあなたが望むものを正確に実行しない可能性があります-それはコンパイルさえしないかもしれません-しかしそれはプログラミングの喜びです。これにより、かなり複雑な問題を解決する方法について私が持っている一般的な考え方がわかります。

編集: あなたがMySqlを使用していることに気づきました。このコードはMSSQLで機能します。CLRのMySqlを使用したことがないため、すべてのクラスが同等かどうかはわかりません。以前行っていたことに戻る必要があるかもしれません。

リストするCSV

Create Function dbo.fn_CSVToTable (@CSVList Varchar(MAX))
Returns @Table Table (ColumnData Varchar(50))
As
Begin
If right(@CSVList, 1) <> ','
Select @CSVList = @CSVList + ','

Declare @Pos    Smallint,
@OldPos Smallint
Select  @Pos    = 1,
@OldPos = 1

While   @Pos < Len(@CSVList)
Begin
Select  @Pos = CharIndex(',', @CSVList, @OldPos)
Insert into @Table
Select  LTrim(RTrim(SubString(@CSVList, @OldPos, @Pos - @OldPos))) Col001
Select  @OldPos = @Pos + 1
End

Return
End

SQLプロシージャ

CREATE PROCEDURE dbo.spGetWordScores (@csv varchar(MAX))
AS
select POS_SCORE, NEG_SCORE, WORD from score
inner join dbo.fn_CSVToTable(@csv) input
    on input.ColumnData = score.WORD

新しいC#コード

var MyConString = "server=localhost;" +
               "database=sentiwornet;" + "password=zia;" +
               "User Id=root;";
var connection = new MySqlConnection(MyConString);

//Each line in the array will probably be one paragraph.
var fileLines = File.ReadAllLines("D:\\input.txt");
foreach (var line in fileLines)
{
        //Format your line into words by removing punctuation. I'm not going to bother
        //with that code because it is trivial.
        //var csv = line.Split(' ');

        var command = connection.CreateCommand();
                    command.CommandText = "exec spGetWordScores";
                    command.Parameters.AddWithValue("@csv", csv);
        var ds = command.ExecuteDataSet();

        //Now you have a DataSet with your word scores. do with them what you will.
}

役立つ拡張方法

public static class Extensions
{
    public static DataSet ExecuteDataSet(this SqlCommand command)
    {
        using (SqlDataAdapter da = new SqlDataAdapter(command)) {
        DataSet ds = new DataSet();

        // Fill the DataSet using default values for DataTable names, etc
        da.Fill(ds);

        return ds;
        }
    }
}
于 2013-03-18T18:20:42.017 に答える
0

データベースに戻ったり進んだりすると、パフォーマンスが低下します。入力文字列を受け取り、それを分割してスコアを計算するストアドプロシージャを作成することをお勧めします。これにより、すべての処理が1台のマシンで実行され、部分的な結果を伝達しないことで大幅な時間を節約できます。

于 2013-03-18T18:05:03.337 に答える