2009-10-27 16 views
7

Sto cercando una parola o una funzione di conteggio delle parole. Quando copio e incollo qualcosa da internet e lo confronta con il mio algoritmo di conteggio parole personalizzato e MS Word, è sempre disattivato di poco più del 10%. Penso che sia troppo. Quindi voi ragazzi sapete di un algoritmo preciso di conteggio delle parole in C#.Algoritmo conteggio parole in C#

+1

Il tuo algoritmo è costantemente troppo alto o troppo basso? O varia? – Larsenal

+1

Stai contando solo parole, o è anche ciò che stai incollando. – joshperry

+2

Perché stai usando il conteggio delle parole di MS Word come benchmark per la precisione? Sottili differenze in ciò che conta come una "parola" possono determinare differenze significative nel conteggio delle parole. Il 10% non è una sorpresa lì. Quello che stai vedendo è probabilmente perfettamente preciso, ma solo leggermente diverso. –

risposta

6

String.Split tramite caratteri predefiniti. Usa segni di punteggiatura, spazi (rimuovi più spazi) e qualsiasi altro carattere che tu determini essere "word splits"

Che cosa hai provato?

Ho visto che il precedente utente è stato inchiodato per i collegamenti, ma qui ci sono alcuni esempi di utilizzo di espressioni regolari o di corrispondenza dei caratteri. Speranza che aiuta, e nessuno si fa male X)

String.Split Method (Char[])

Word counter in C#

C# Word Count

+0

non per i collegamenti, piuttosto, per cercare su Google i link ovvi con nessun valore aggiunto in – zvolkov

+0

ok, punto preso. –

+1

@astander Non dimenticare l'opzione _StringSplitOptions.RemoveEmptyEntries_ in -_Split_ altrimenti, "word1, word2" o "word1? Word2" verranno conteggiati come 3 parole! –

8

Come @astander suggerisce, si può fare uno String.Split come segue:

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

Passando in una serie di caratteri, è possibile dividere in più interruzioni di parole. Rimozione di voci vuote ti impedirà di contare le parole non parole.

+3

Questo è ottimo, ma dovresti anche tener conto delle nuove righe. Se si digita una parola, premere invio, digitare una parola, premere invio, restituirà un conteggio di 0. Uno degli overload per Split() consente una matrice di stringhe, quindi è possibile modificare questa matrice in stringhe di caratteri e aggiungi Environment.Newline (o "\ r \ n" e \ n "). –

+2

A meno che il tuo input non contenga una formattazione molto limitata, probabilmente avrai bisogno di una rete più ampia - considera bretelle ricurve e angolate, trattini (anche se questo può produrre falsi positivi) e altri segni di punteggiatura. –

1

È inoltre necessario verificare newlines, tabs e non-breaking spaces. Trovo che sia meglio copiare il testo di origine in uno e sostituire tutte le nuove righe, tabulazioni e caratteri di fine frase con spazi. Quindi dividi la stringa in base agli spazi.

1

Ho appena avuto lo stesso problema in ClipFlair, in cui avevo bisogno di calcolare WPM (parole al minuto) per le didascalie film, quindi mi si avvicinò con la seguente:

È possibile definire questo statica metodo di estensione in una classe statica e quindi aggiungere una clausola using allo spazio dei nomi di quella classe statica in qualsiasi classe che deve utilizzare questo metodo di estensione. Il metodo di estensione viene richiamato mediante s.WordCount(), dove s è una stringa (un identificatore [variabile/costante] o letterale)

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

Usa un'espressione regolare per trovare le parole (ad esempio [\ w] +) e basta contare le partite

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

regex.Match (_someString) Count

1

Ecco la versione ridotta di classe C# codice che ho fatto per le parole che contano, parole asiatico, charaters ecc Questo è quasi lo stesso come Microsoft Word. Ho sviluppato il codice originale per contare le parole per i documenti di 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 
    } 
} 
} 
Problemi correlati