2010-03-22 9 views
0

J'ai une chaîne de texte arbitrairement grande de l'utilisateur qui doit être divisée en blocs de 10k (valeur potentiellement ajustable) et envoyée à un autre système pour traitement.Algorithme de segmentation de chaîne avec contexte de langage naturel

  • Chunks ne peut pas être plus de 10k (ou toute autre valeur arbitraire)
  • Le texte doit être rompu avec le contexte du langage naturel à l'esprit
    • divisés sur la ponctuation, si possible
    • divisée sur les espaces si aucune Ponction eXISTE
    • casser un mot en dernier recours

J'essaie de ne pas réinventer la roue avec ceci, aucune suggestion avant de rouler ceci à partir de zéro?

Utilisation de C#.

Répondre

2

Cela peut ne pas traiter tous les cas que vous avez besoin, mais il devrait vous aider sur votre chemin.

public IList<string> ChunkifyText(string bigString, int maxSize, char[] punctuation) 
    { 
     List<string> results = new List<string>(); 

     string chunk; 
     int startIndex = 0; 

     while (startIndex < bigString.Length) 
     { 
      if (startIndex + maxSize + 1 > bigString.Length) 
       chunk = bigString.Substring(startIndex); 
      else 
       chunk = bigString.Substring(startIndex, maxSize); 

      int endIndex = chunk.LastIndexOfAny(punctuation); 

      if (endIndex < 0) 
       endIndex = chunk.LastIndexOf(" "); 

      if (endIndex < 0) 
       endIndex = Math.Min(maxSize - 1, chunk.Length - 1); 

      results.Add(chunk.Substring(0, endIndex + 1)); 

      startIndex += endIndex + 1; 
     } 

     return results; 
    } 
+0

+1 J'ai fini par mettre en place quelque chose de similaire. Merci pour l'exemple de code! –

1

Je suis sûr que cela va probablement finir par être plus difficile que vous attendez (la plupart des choses en langage naturel), mais vérifiez Sharp Natural Language Parser. J'utilise actuellement SharpNLP, ça marche plutôt bien, mais il y a toujours des 'getcha's'. Laissez-moi savoir si ce n'est pas ce que vous cherchez.

Mark

+0

Merci Mark, je vais vérifier cette bibliothèque. –