如何通过SQL删除停用词

时间:2012-07-18 07:00:30

标签: mysql

我有一张包含数百万封邮件的表格。我想从每个消息中删除一个停用词列表 - 在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...

有更好的解决方案吗?

2 个答案:

答案 0 :(得分:5)

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

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

编辑:您还需要考虑的是,消息中间的停用词仍然需要在替换后保留空格,因为您不希望以{结尾{ {1}} - > no I in team。我们通过在禁用词之后添加另一个空格来处理这个问题,以便在右边有两个空格...然后,当它被替换时,会保留额外的空格,因为我们只替换了 一个的禁用词 每边都有空间。


SQLFiddle Demo

答案 1 :(得分:2)

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

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 , ' %')