Como estou trabalhando em um projeto de pós-graduação (Textmining com SQL Server 2012 Semantic Search) , me deparo com uma situação em que preciso postar uma pergunta neste site, esperando que alguém possa me ajudar.
Esta pergunta é sobre stoplists e stopwords no SQL Server 2012. Eu configurei uma prova de conceito onde estou tentando indexar documentos e listar frases-chave estatisticamente relevantes com a nova funcionalidade de pesquisa semântica . Como não quero que algumas palavras sejam indexadas e, portanto, frases-chave estatisticamente relevantes, estou criando uma lista de palavras irrelevantes para excluir essas palavras.
Stoplist/stopwords para o idioma inglês ( lcid 1033 ):
/* Create stoplist and add words */
CREATE FULLTEXT STOPLIST [naam van de stoplist];
ALTER FULLTEXT STOPLIST [naam van de stoplist] ADD 'beeten' LANGUAGE 'English';
ALTER FULLTEXT STOPLIST [naam van de stoplist] ADD 'centimeter' LANGUAGE 'English';
ALTER FULLTEXT STOPLIST [naam van de stoplist] ADD 'info' LANGUAGE 'English';
ALTER FULLTEXT STOPLIST [naam van de stoplist] ADD 'ruud' LANGUAGE 'English';
GO
Criando um Catálogo de Texto Completo, Índice de Texto Completo com a lista personalizada e semântica:
/* Full-Text catalog */
CREATE FULLTEXT CATALOG [ft] WITH ACCENT_SENSITIVITY = ON AS DEFAULT;
GO
/* Full-Text Index */
CREATE FULLTEXT INDEX ON [dbo].[Documents]
( file_stream Language 1033 STATISTICAL_SEMANTICS )
KEY INDEX DocumentsFt
WITH STOPLIST = [naam van de stoplist];
GO
Eu tentei tudo o que posso pensar para verificar se eu perdi alguma coisa:
/*Select all words in the stoplist, with some debug information*/
SELECT sys.fulltext_stoplists.stoplist_id AS [Stoplist id]
, sys.fulltext_stoplists.name AS [Stoplist]
, sys.database_principals.name AS [Owner]
, sys.fulltext_languages.lcid AS [LCID]
, sys.fulltext_languages.name AS [Taal]
, sys.fulltext_stopwords.stopword AS [Stopwoord]
FROM sys.fulltext_languages
INNER JOIN sys.fulltext_stopwords
ON sys.fulltext_stopwords.language_id = sys.fulltext_languages.lcid
INNER JOIN sys.fulltext_stoplists
ON sys.fulltext_stopwords.stoplist_id = sys.fulltext_stoplists.stoplist_id
INNER JOIN sys.database_principals ON sys.database_principals.principal_id = sys.fulltext_stoplists.principal_id
WHERE sys.fulltext_stoplists.name = 'naam van de stoplist';
/* List with all Full-Text Indexes (with statistical_semantics) */
SELECT sys.fulltext_catalogs.name [Full-Text catalog]
, sys.indexes.name AS [Index]
, sys.indexes.type_desc AS [Index type]
, sys.fulltext_indexes.is_enabled AS [Index in use]
, sys.fulltext_stoplists.name AS [Stoplist]
, sys.tables.name AS [Table]
, sys.columns.name AS [Column]
, sys.fulltext_index_columns.language_id AS [LCID]
, sys.fulltext_languages.name AS [Language]
, sys.fulltext_index_columns.statistical_semantics [Semantic]
FROM sys.fulltext_catalogs
INNER JOIN sys.fulltext_indexes
ON sys.fulltext_catalogs.fulltext_catalog_id = sys.fulltext_indexes.fulltext_catalog_id
INNER JOIN sys.fulltext_index_columns
ON sys.fulltext_indexes.object_id = sys.fulltext_index_columns.object_id
INNER JOIN sys.indexes
ON sys.fulltext_indexes.object_id = sys.indexes.object_id
AND sys.fulltext_indexes.unique_index_id = sys.indexes.index_id
INNER JOIN sys.index_columns
ON sys.indexes.object_id = sys.index_columns.object_id
AND sys.indexes.index_id = sys.index_columns.index_id
INNER JOIN sys.columns
ON sys.index_columns.object_id = sys.columns.object_id
AND sys.index_columns.column_id = sys.columns.column_id
INNER JOIN sys.tables
ON sys.fulltext_indexes.object_id = sys.tables.object_id
INNER JOIN sys.fulltext_languages
ON sys.fulltext_index_columns.language_id = sys.fulltext_languages.lcid
LEFT JOIN sys.fulltext_stoplists
ON sys.fulltext_indexes.stoplist_id = sys.fulltext_stoplists.stoplist_id
WHERE sys.fulltext_index_columns.statistical_semantics = 1
ORDER BY sys.fulltext_catalogs.name
,sys.indexes.name
,sys.index_columns.key_ordinal;
/* Rebuild catalog */
ALTER FULLTEXT CATALOG [ft] REBUILD;
GO
/* Check status of the catalog rebuild */
/* 0 = Idle.
1 = Full population is in progress.
2 = Incremental population is in progress.
3 = Propagation of tracked changes is in progress.
4 = Background update index is in progress, such as automatic change tracking.
5 = Full-text indexing is throttled or pause
*/
SELECT FULLTEXTCATALOGPROPERTY('ft', 'PopulateStatus') AS Status;
GO
/* Repopulate Full-Text Index */
ALTER FULLTEXT INDEX ON dbo.Documents START UPDATE POPULATION;
GO
Todos os comandos acima indicam que as coisas estão configuradas corretamente.
Quando olho para as palavras indexadas, ainda vejo as palavras na lista de palavras irrelevantes, por exemplo, 'beeten'.
SELECT *
FROM sys.dm_fts_index_keywords(DB_ID('SQLServerArticles'), OBJECT_ID('Documents'))
WHERE display_term = 'beeten';
Eu até tentei se o analisador de texto completo não está funcionando corretamente com a seguinte declaração.
SELECT special_term, display_term
FROM sys.dm_fts_parser
(' "testing for fruit and nuts centimeter, any type of Beeten" ', 1033, 8, 0)
Esta instrução retorna o seguinte resultado:
Exact Match testing
Exact Match for
Exact Match fruit
Exact Match and
Exact Match nuts
Noise Word centimeter
Exact Match any
Exact Match type
Exact Match of
Noise Word beeten
Este resultado indica que a palavra 'beeten' é uma palavra de ruído. Essa palavra deve ser ignorada durante a indexação? O que eu perdi?
Novamente : como não quero que algumas palavras sejam indexadas e, portanto, frases-chave estatisticamente relevantes, estou criando uma lista de palavras irrelevantes para excluir essas palavras.
Se a configuração de localidade do sistema for diferente do inglês, há um bug conhecido (Microsoft Connect Item 753596 ) em que as palavras irrelevantes da localidade do sistema são usadas em vez das palavras irrelevantes do índice de texto completo para documentos armazenados em tabelas de arquivos.