0

我有一张包含数百万条消息的表格。我想从每条消息中删除停用词列表 - 在 SQL 中

示例输入:

id  message
-------------------------------
1   we are on top of the world
2   too bad the apple is rotten
3   there is no I in team
4   it matters where you go to

要删除的停用词:

in, on, of, to, too

期望的输出:

id  message
-------------------------------
1   we are top the world
2   bad the apple is rotten
3   there is no I team
4   it matters where you go

我猜这里的问题是,任何一个停用词都可能出现在消息的开头、中间或结尾。因此,这样的查询将是令人满意的:

UPDATE table SET message = REPLACE(message, ' in ', '');
UPDATE table SET message = REPLACE(message, ' on ', '');
UPDATE table SET message = REPLACE(message, ' of ', '');
etc...

有更好的解决方案吗?

4

2 回答 2

5

为了解决无法更新消息开头和结尾的停用词的问题,您可以做的只是在每条消息的开头和结尾连接一个空格,然后执行替换,然后修剪前导/尾随空格退出:

UPDATE tbl 
SET message = TRIM(REPLACE(CONCAT(' ', REPLACE(message, ' in ', ' in  '), ' '), ' in ', ''));

编辑:您还必须考虑的是,消息中间的停用词在被替换后仍然必须保留空格,因为您不想以no I in team->结尾no Iteam。我们通过在停用词后添加另一个空格来解决此问题,以便在右侧有两个空格......然后,当它被替换时,多余的空格会被保留,因为我们只替换每侧有一个空格的停用词。


SQLFiddle 演示

于 2012-07-18T07:07:44.730 回答
2

如果您创建一个名为 stopwords 的表,其中包含一个字段停用词,其中包含所有停用词的列表,您可以这样做:

CREATE TABLE [dbo].[stopwords](
    [stopword] char(100) NOT NULL
) 

insert into stopwords values ('in');
insert into stopwords values ('on');
insert into stopwords values ('of');
insert into stopwords values ('to');
insert into stopwords values ('too');

-- DEBUG: select message ,stopword, replace(message,CONCAT(' ', stopword , ' '), ' ')
update table 
set message = trim(replace(CONCAT(' ',message, ' '),CONCAT(' ',stopword,' '),' ')) 
from stopwords
where CONCAT(' ', message , ' ')  like CONCAT('% ' ,stopword , ' %')
于 2012-07-18T07:25:05.200 回答