我有一张包含数百万封邮件的表格。我想从每个消息中删除一个停用词列表 - 在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...
有更好的解决方案吗?
答案 0 :(得分:5)
要解决无法在消息的开头和结尾更新停用词的问题,您可以做的只是将空格连接到每条消息的开头和结尾, THEN 执行替换,然后修剪前导/尾随空格:
UPDATE tbl
SET message = TRIM(REPLACE(CONCAT(' ', REPLACE(message, ' in ', ' in '), ' '), ' in ', ''));
编辑:您还需要考虑的是,消息中间的停用词仍然需要在替换后保留空格,因为您不希望以{结尾{ {1}} - > no I in team
。我们通过在禁用词之后添加另一个空格来处理这个问题,以便在右边有两个空格...然后,当它被替换时,会保留额外的空格,因为我们只替换了 一个的禁用词 每边都有空间。
答案 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 , ' %')