2010-07-31 27 views
6

Tôi có một bảng trong DB của tôi chứa một cột trường văn bản miễn phí.Tính TF-IDF bằng Sql

Tôi muốn biết tần suất mỗi từ xuất hiện trên tất cả các hàng hoặc thậm chí có thể tính TF-IDF cho tất cả các từ, trong đó tài liệu của tôi là giá trị của trường đó trên mỗi hàng.

Có thể tính toán điều này bằng truy vấn Sql không? nếu không hoặc có một cách đơn giản hơn, bạn có thể vui lòng hướng tôi đến đó không?

Nhiều Cảm ơn,

Jon Giải pháp

+0

RDBMS gì và phiên bản? –

+0

Microsoft Sql Server 2008 – Jon

Trả lời

5

Trong SQL Server 2008 tùy thuộc vào nhu cầu của bạn, bạn có thể áp dụng đầy đủ chỉ mục văn bản vào cột rồi truy vấn sys.dm_fts_index_keywordssys.dm_fts_index_keywords_by_documenttable valued functions để nhận số lần xuất hiện.

Edit: Trên thực tế ngay cả khi không tạo ra một chỉ mục văn bản đầy đủ dai dẳng bạn vẫn có thể tận dụng các phân tích cú pháp

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 

Returns

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

Bạn đá !!! Đó là một giải pháp tuyệt vời mà có thể đã đưa tôi ngày để tìm. (Tôi chỉ phải thêm một dòng để lọc các trường có văn bản rỗng nếu không nó sẽ trả về lỗi "Vị từ đầy đủ hoặc rỗng toàn văn", dòng tôi thêm là "WHERE tbl1.txt_field! = '" "'") – Jon

+0

Cảm ơn, tôi sẽ kết hợp điều đó vào câu trả lời của tôi. –

2

cho SQL Server 2008:

đây là bảng:

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

đây là SQL truy vấn:

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 

đây là bảng chức năng có giá trị Fn_Split (@ id int, @separator VARCHAR (32), @string VARCHAR (MAX)) (lấy từ 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 
Các vấn đề liên quan