2012-05-30 4 views
0

Пожалуйста, помогите мне построить частотную таблицу пар слов из таблицы с 100 млн записей, которая работает на SQL Server 2008 db. Таблица выглядит следующим образом:скрипт для создания пар слов частоты на 100 млн. DB

Original table 
id |source |comment(255) 
------------------- 
1  A1  review budget limitation 

источник некоторого ID, который может иметь около 800 различных значений. Распределение источников в исходной таблице экспоненциально. Это означает, что количество записей с источником A1 может составлять 20 миллионов, а A500 - всего 10 000.

В финале я хотел бы получить таблицу пары слов по частоте с игнорированием словами: , и, к, а, я, это, в, или, является

Как я ожидал, что он должен работать (я мог бы быть не оптимальным здесь):

  1. прочитал первые два слова из комментария в исходной таблице, поместите его в ЧАСТОТЫ
  2. прочитать следующие два слова и положил его

Таблица частот

id | word pairs  | source |Frequency 
--------------------------------------------- 
1 review budget   A1   1 
2 budget limitation  A1   1 
  1. Заполните полный комментарий от первой записи, имеющей, например, источник A1
  2. начала следующей записи и обработать его таким же образом.
  3. Если он найден, то такие же пары слов уже существуют в таблице частот, а источник - это то же самое, что просто увеличение частоты, если источник отличается - добавьте эту пару с новым источником.

Помогите мне с оптимальным сценарием sql для SQL Server?

+0

Какое максимальное количество слов вы можете иметь в комментарии? –

+0

комментарии ограничены в 255 символах. – AntarcticIce

+0

Сколько слов среди этих символов? В вашем примере у вас три. –

ответ

1

Я буду работать это в минуту (момент времени), но я хотел бы выдвинуть два императива:

  • Все, что должно быть сделано быстро в SQL должно быть сделано набор на основе , Избегайте обработки вещей «по одному».
  • Используйте таблицу значных функцию, чтобы разделить комментарии в таблицу пар слов
  • Использование общих табличных выражений слой вашей работы, чтобы держать вещи читаемым

С помощью этих трех правил, которые вы можете перемещать тонны данных , После того, как вы построили select-statement, это просто вопрос сбрасывания его в таблицу.

EDIT:

CREATE FUNCTION dbo.SplitToPairs(@sText nvarchar(255)) 
RETURNS @Pairs TABLE (
    Pair nvarchar(255) NOT NULL 
) 
AS 
BEGIN 
    SET @sText = LTRIM(RTRIM(@sText)); 
    DECLARE @Pos1 int = 0 
    DECLARE @Pos2 int = CHARINDEX(' ', @sText); 
    DECLARE @Pos3 int; 
    IF @Pos2 <> 0 
    BEGIN 
     DECLARE @Word1 nvarchar(255) = SUBSTRING(@sText, @Pos1+1, @[email protected]); 
     WHILE CHARINDEX(N'|' + @Word1 + N'|', N'|the|and|of|to|a|i|it|in|or|is|') <> 0 
     BEGIN 
      SET @Pos1 = @Pos2; 
      SET @Pos3 = CHARINDEX(' ', @sText, @Pos2+1); 
      SET @Pos2 = @Pos3; 
      SET @Word1 = SUBSTRING(@sText, @Pos1+1, @[email protected]); 
     END 
     DECLARE @Word2 nvarchar(255); 

     WHILE @Pos2 <> 0 
     BEGIN 
      SET @Pos3 int = CHARINDEX(' ', @sText, @Pos2+1); 
      IF @Pos3 <> 0 
      BEGIN 
       SET @Word2 = SUBSTRING(@sText, @Pos2+1, @[email protected]); 
       WHILE CHARINDEX(N'|' + @Word2 + N'|', N'|the|and|of|to|a|i|it|in|or|is|') <> 0 
       BEGIN 
        SET @Pos1 = @Pos2; 
        SET @Pos2 = @Pos3; 
        SET @Word2 = SUBSTRING(sText, @Pos2+1, @[email protected]); 
       END 
       INSERT @Pairs (Pair) VALUES (@Word1 + N' ' + @Word2) 
      END 

      SET @Pos1 = @Pos2; 
      SET @Pos2 = @Pos3; 
      SET @Word1 = @Word2; 
     END 
    END 
    -- Note: if only one word in text, no insert happens 
    RETURN @Pairs 
END 

Затем использовать, чтобы построить отборное

SELECT I.Source, P.Pair, COUNT(*) AS Frequency 
FROM Information AS I CROSS APPLY dbo.SplitToPairs(i.Comment) AS P 
GROUP BY I.Source, P.Pair 

Вполне возможно, что я уезжаю на какой-то крайний случай, но это должно дать вам представление о том, что я собираюсь. Он также не считает слова «word1 word2» и «word2 word1» равными.

Я оставляю это в качестве упражнения для читателя: р

EDIT:

Добавлено TABLE ключевых слов на RETURNS линии.

Кроме того, присвоение значения в DECLARE работает только начиная с SQL 2008 я думаю ..

EDIT:

Добавлено RETURN заявление

EDIT:

Изменения за отзывы AntarticIce

+0

ничего себе, это хорошо! Я столкнулся с попыткой создать функцию. Msg 102, уровень 15, состояние 1, процедура SplitToPairs, строка 2 Неправильный синтаксис около '('. Msg 102, уровень 15, состояние 1, процедура SplitToPairs, строка 22 Неверный синтаксис около 'int'. Msg 1087, Level 15, State 2, Procedure SplitToPairs, строка 32 Должен объявить переменную таблицы «@Pairs». – AntarcticIce

+0

МОЖЕТ быть в состоянии заменить функцию некоторым причудливым регулярным выражением или текстовым запросом. Но я недостаточно разбираюсь в них. основной инструмент здесь действительно использует CROSS APPLY, чтобы разделить ваш комментарий на пары, а затем группировать и подсчитывать этот набор. –

+0

@VincentVancalbergh Вы правы в том, что не можете объявлять и присваивать значения в одной строке до тех пор, пока SQL 2008 - t работаю в 2005 году. – Bridge