Извлечение ключевых слов из текста в .NET - PullRequest
4 голосов
/ 27 октября 2010

Мне нужно вычислить, сколько раз каждое ключевое слово повторяется в строке, с сортировкой по наибольшему числу. Какой самый быстрый алгоритм доступен в коде .NET для этой цели?

Ответы [ 4 ]

6 голосов
/ 27 октября 2010

РЕДАКТИРОВАТЬ: код ниже группирует уникальные токены с количеством

string[] target = src.Split(new char[] { ' ' });

var results = target.GroupBy(t => new
{
    str = t,
    count = target.Count(sub => sub.Equals(t))
});

Это, наконец, начинает иметь больше смысла для меня ...

РЕДАКТИРОВАТЬ: код ниже приводит к подсчету коррелируется с цельюподстрока:

string src = "for each character in the string, take the rest of the " +
    "string starting from that character " +
    "as a substring; count it if it starts with the target string";
string[] target = {"string", "the", "in"};

var results = target.Select((t, index) => new {str = t, 
    count = src.Select((c, i) => src.Substring(i)).
    Count(sub => sub.StartsWith(t))});

Результаты теперь:

+       [0] { str = "string", count = 4 }   <Anonymous Type>
+       [1] { str = "the", count = 4 }  <Anonymous Type>
+       [2] { str = "in", count = 6 }   <Anonymous Type>

Исходный код ниже:

string src = "for each character in the string, take the rest of the " +
    "string starting from that character " +
    "as a substring; count it if it starts with the target string";
string[] target = {"string", "the", "in"};

var results = target.Select(t => src.Select((c, i) => src.Substring(i)).
    Count(sub => sub.StartsWith(t))).OrderByDescending(t => t);

с благодарным подтверждением этого предыдущего ответа .

Результаты отладчика (которому требуется дополнительная логика для включения соответствующей строки с ее счетчиком):

-       results {System.Linq.OrderedEnumerable<int,int>}    
-       Results View    Expanding the Results View will enumerate the IEnumerable   
        [0] 6   int
        [1] 4   int
        [2] 4   int
4 голосов
/ 27 октября 2010

Не знаю о самом быстром, но Linq, пожалуй, самый понятный:

var myListOfKeywords = new [] {"struct", "public", ...};

var keywordCount = from keyword in myProgramText.Split(new []{" ","(", ...})
   group by keyword into g
   where myListOfKeywords.Contains(g.Key)
   select new {g.Key, g.Count()}

foreach(var element in keywordCount)
   Console.WriteLine(String.Format("Keyword: {0}, Count: {1}", element.Key, element.Count));

Вы можете написать это не в стиле Linq-y, но основная предпосылка та же;разбить строку на слова и сосчитать вхождения каждого интересующего слова.

2 голосов
/ 27 октября 2010

Простой алгоритм: разбить строку на массив слов, выполнить итерацию по этому массиву и сохранить счетчик каждого слова в хеш-таблице.Сортировка по количеству, когда закончите.

1 голос
/ 27 октября 2010

Вы можете разбить строку на набор строк, по одной на каждое слово, а затем выполнить запрос LINQ для коллекции.Хотя я сомневаюсь, что это будет самый быстрый, он, вероятно, будет быстрее, чем регулярное выражение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...