0

いくつかの単語をマッピングするために Dictionary of を使用しようとしています (int はそれほど関連性がありません)。単語をディックに挿入した後(チェックしました)、ドキュメント全体を調べて特定の単語を探します。

私がそれをすると、単語がdicに存在してもfalseを返します。

何が問題で、どうすれば修正できますか?

public string RemoveStopWords(string originalDoc){
        string updatedDoc = "";
        string[] originalDocSeperated = originalDoc.Split(' ');
        foreach (string word in originalDocSeperated)
        {
            if (!stopWordsDic.ContainsKey(word))
            {
                updatedDoc += word;
                updatedDoc += " ";
            }
        }
        return updatedDoc.Substring(0, updatedDoc.Length - 1); //Remove Last Space
    }

例: dic には、"the" という単語としてストップ ワードが含まれています。originalDoc から「the」という単語を取得し、それが存在しないかどうかを確認したい場合でも、IF ステートメントを入力すると、両方とも同じように記述されます。大文字と小文字を区別しない

Dictionary<string, int> stopWordsDic = new Dictionary<string, int>();

string stopWordsContent = System.IO.File.ReadAllText(stopWordsPath);
            string[] stopWordsSeperated = stopWordsContent.Split('\n');
            foreach (string stopWord in stopWordsSeperated)
            {
                stopWordsDic.Add(stopWord, 1);
            }

stopWords ファイルは、各行に単語があるファイルです。

スナップショット: ここに画像の説明を入力

ありがとうございました

4

4 に答える 4

0

ディクショナリを作成するときは、次のことを行う必要があります。

var stopWords= new Dictionary<string, int>(
    StringComparer.InvariantCultureIgnoreCase);

最も重要な部分は InvariantCultureIgnoreCase です。

public string RemoveStopWords(string originalDoc){
    return String.Join(" ", 
           originalDoc.Split(' ')
              .Where(x => !stopWordsDic.ContainsKey(x))
    );
}

さらに、辞書の入力方法を変更する必要があります (これにより、辞書を作成するときに単語以外の記号がすべて削除されます)。

        // Regex to find the first word inside a string regardless of the 
        // preleading symbols. Cuts away all nonword symbols afterwards
        Regex validWords = New Regex(@"\b([0-9a-zA-Z]+?)\b");

        string stopWordsContent = System.IO.File.ReadAllText(stopWordsPath);
        string[] stopWordsSeperated = stopWordsContent.Split('\n');

        foreach (string stopWord in stopWordsSeperated)
        {
            stopWordsDic.Add(validWords.Match(stopWord).Value, 1);
        }
于 2015-11-13T08:48:03.503 に答える
0

すべてのエントリの値として 1 を設定しているようです。リストの方がニーズに合っているかもしれません:

List<string> stopWordsDic = new List<string>();

string stopWordsContent = System.IO.File.ReadAllText(stopWordsPath);
string[] stopWordsSeperated = stopWordsContent.Split(Environment.NewLine);
foreach (string stopWord in stopWordsSeperated)
{
    stopWordsDic.Add(stopWord);
}

次に、要素を確認しますContains()

public string RemoveStopWords(string originalDoc){
    string updatedDoc = "";
    string[] originalDocSeperated = originalDoc.Split(' ');
    foreach (string word in originalDocSeperated)
    {
        if (!stopWordsDic.Contains(word))
        {
            string.Format("{0}{1}", word, string.Empty);
            //updatedDoc += word;
            //updatedDoc += " ";
        }
    }
    return updatedDoc.Substring(0, updatedDoc.Length - 1); //Remove Last Space
}
于 2015-11-13T09:07:50.640 に答える