2009-10-27 3 views
7

Я ищу хороший класс слов или функцию. Когда я копирую и вставляю что-то из Интернета и сравниваю его с моим обычным алгоритмом подсчета слов и MS Word, он всегда отключается чуть более 10%. Я думаю, что это слишком много. Так вы, ребята, знаете о точном алгоритме подсчета слов в C#.Word Count Algorithm in C#

+1

Является ли ваш алгоритм слишком высоким или слишком низким? Или это меняется? – Larsenal

+1

Вы считаете только слова, или это то, что вы вставляете также разметкой. – joshperry

+2

Почему вы используете слово Word Word как показатель для точности? Тонкие различия в том, что считается «словом», могут привести к значительным различиям в подсчете слов. 10% - это не сюрприз. То, что вы видите, вероятно, совершенно точно, но немного отличается. –

ответ

6

String.Split по предопределенным символам. Используйте пунктуации, пробелы (удалить несколько пробелов) и любые другие символы, которые вы определяете как «разбиение слов»

Что вы пробовали?

Я видел, что предыдущий пользователь получил гвозди для ссылок, но вот несколько примеров использования регулярных выражений или соответствия символов. Надеюсь, что это помогает, и никто не пострадает Х-)

String.Split Method (Char[])

Word counter in C#

C# Word Count

+0

не для ссылок, скорее, для поиска в явном виде ссылок w/no value add included in – zvolkov

+0

ok, point taken. –

+1

@astander Не забывайте параметр _StringSplitOptions.RemoveEmptyEntries_ в -_Split_, иначе слово «word1, word2» или «word1? Word2» будет считаться 3 словами! –

8

Как @astander предполагает, вы можете сделать String.split следующим образом:

string[] a = s.Split(
    new char[] { ' ', ',', ';', '.', '!', '"', '(', ')', '?' }, 
    StringSplitOptions.RemoveEmptyEntries); 

Пройдя в массив символов, вы можете разбить на несколько разрывов слов. Удаление пустых записей не позволит вам подсчитывать слова, отличные от слов.

+3

Это замечательно, но вы также должны учитывать новые строки. Если вы введете слово, нажмите Enter, введите слово, нажмите enter, он вернет счет 0. Одна из перегрузок для Split() позволяет использовать массив строк, поэтому вы можете изменить этот массив на строки символов и добавьте Environment.Newline (или "\ r \ n" и \ n "). –

+2

Если ваш вход содержит очень ограниченное форматирование, вам, вероятно, понадобится более широкая сеть - рассмотрите фигурные и угловые фигурные скобки, тире (хотя это может вызвать ложные срабатывания) и другие знаки препинания. – 2012-10-15 16:04:46

1

Вы также должны проверить на newlines, tabs и non-breaking spaces. Лучше всего скопировать исходный текст в StringBuilder и заменить все символы новой строки, табуляции и символы окончания предложения пробелами. Затем разделите строку на пробелы.

1

Я только что была такая же проблема в ClipFlair, где мне нужно, чтобы вычислить WPM (слов в минуту) для Movie Captions, поэтому я придумал следующий:

Вы можете определить этот статический метод расширения в статическом классе, а затем добавить предложение use в пространство имен этого статического класса в любом классе, который должен использовать этот метод расширения. Метод расширения вызывается с помощью s.WordCount(), где s представляет собой строку (идентификатор [переменная/постоянная] или буквальным)

public static int WordCount(this string s) 
{ 
    int last = s.Length-1; 

    int count = 0; 
    for (int i = 0; i <= last; i++) 
    { 
    if (char.IsLetterOrDigit(s[i]) && 
     ((i==last) || char.IsWhiteSpace(s[i+1]) || char.IsPunctuation(s[i+1]))) 
     count++; 
    } 
    return count; 
} 
4

Используйте регулярное выражение для поиска слова (например, [\ W] +) и просто сосчитать матчи

public static Regex regex = new Regex(
    "[\\w]+", 
RegexOptions.Multiline 
| RegexOptions.CultureInvariant 
| RegexOptions.Compiled 
); 

regex.Match (_someString) .Count

1

Вот урезанная версия класса C# кода я сделал для подсчета слов, азиатских слов, Charaters и т.д. Это почти то же самое как Microsoft Word. Я разработал оригинальный код для подсчета слов для документов Microsoft Word.

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Text.RegularExpressions; 
    namespace BL { 
    public class WordCount 
    { 

    public int NonAsianWordCount { get; set; } 
    public int AsianWordCount { get; set; } 
    public int TextLineCount { get; set; } 
    public int TotalWordCount { get; set; } 
    public int CharacterCount { get; set; } 
    public int CharacterCountWithSpaces { get; set; } 


    //public string Text { get; set; } 

    public WordCount(){} 

    ~WordCount() {} 


    public void GetCountWords(string s) 
    { 
     #region Regular Expression Collection 
     string asianExpression = @"[\u3001-\uFFFF]"; 
     string englishExpression = @"[\S]+"; 
     string LineCountExpression = @"[\r]+"; 
     #endregion 


     #region Asian Character 
     MatchCollection asiancollection = Regex.Matches(s, asianExpression); 

     AsianWordCount = asiancollection.Count; //Asian Character Count 

     s = Regex.Replace(s, asianExpression, " "); 

     #endregion 


     #region English Characters Count 
     MatchCollection collection = Regex.Matches(s, englishExpression); 
     NonAsianWordCount = collection.Count; 
     #endregion 

     #region Text Lines Count 
     MatchCollection Lines = Regex.Matches(s, LineCountExpression); 
     TextLineCount = Lines.Count; 
     #endregion 

     #region Total Character Count 

     CharacterCount = AsianWordCount; 
     CharacterCountWithSpaces = CharacterCount; 

     foreach (Match word in collection) 
     { 
      CharacterCount += word.Value.Length ; 
      CharacterCountWithSpaces += word.Value.Length + 1; 
     } 

     #endregion 

     #region Total Character Count 
     TotalWordCount = AsianWordCount + NonAsianWordCount; 
     #endregion 
    } 
} 
}