2010-07-31 2 views
6

У меня есть таблица в моей БД, содержащая столбец свободного текстового поля.Вычислить TF-IDF, используя Sql

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

Возможно ли это рассчитать с помощью запроса Sql? если нет, или есть более простой способ, вы можете направить меня к нему?

Большое спасибо,

Jon

+0

Что RDBMS и версия? –

+0

Microsoft Sql Server 2008 – Jon

ответ

5

В SQL Server 2008 в зависимости от ваших потребностей вы могли бы применить полнотекстовой индексации в столбец затем запросите sys.dm_fts_index_keywords и sys.dm_fts_index_keywords_by_documenttable valued functions, чтобы получить количество ошибок.

Edit: На самом деле, даже не создавая постоянный полнотекстовый индекс вы можете по-прежнему позволяют эффективно использовать анализатор

WITH testTable AS 
(
SELECT 1 AS Id, N'how now brown cow' AS txt UNION ALL 
SELECT 2, N'she sells sea shells upon the sea shore' UNION ALL 
SELECT 3, N'red lorry yellow lorry' UNION ALL 
SELECT 4, N'the quick brown fox jumped over the lazy dog' 
) 

SELECT display_term, COUNT(*) As Cnt 
FROM testTable 
CROSS APPLY sys.dm_fts_parser('"' + REPLACE(txt,'"','""') + '"', 1033, 0,0) 
WHERE TXT IS NOT NULL 
GROUP BY display_term 
HAVING COUNT(*) > 1 
ORDER BY Cnt DESC 

Возвращает

display_term     Cnt 
------------------------------ ----------- 
the       3 
brown       2 
lorry       2 
sea       2 
+0

Вы рок !!! Это удивительное решение, которое понадобилось бы мне, чтобы найти. (Мне нужно было добавить только одну строку для фильтрации полей с нулевым текстом, иначе она вернет ошибку «Нулевой или пустой полнотекстовый предикат», строка, которую я добавляю, была «WHERE tbl1.txt_field! = '" "'") – Jon

+0

Спасибо, я включу это в свой ответ. –

2

решение для SQL Server 2008:

вот таблица:

CREATE TABLE MyTable (id INT, txt VARCHAR(MAX)); 

здесь SQL запрос:

SELECT sum(case when TSplitted.txt_word = 'searched' then 1 else 0 end) as cnt_searched 
    , count(*) as cnt_all 
FROM MyTable MYT 
INNER JOIN Fn_Split(MYT.id,' ',MYT.txt) TSplitted on MYT.id=TSplitted.id 

здесь Таблица функция Fn_Split (@id INT, @separator VARCHAR (32), @string VARCHAR (MAX)) (из here):

CREATE FUNCTION Fn_Split (@id int, @separator VARCHAR(32), @string VARCHAR(MAX)) 

RETURNS @t TABLE 
    (
     ret_id INT 
     ,txt_word VARCHAR(MAX) 
    ) 
AS 
    BEGIN 
     DECLARE @xml XML 
     SET @XML = N'<root><r>' + REPLACE(@s, @separator, '</r><r>') + '</r></root>' 

     INSERT INTO @t(ret_id, val) 
     SELECT @id, r.value('.','VARCHAR(5)') as Item 
     FROM @xml.nodes('//root/r') AS RECORDS(r) 

     RETURN 
    END 
Смежные вопросы