如果你曾经为网站做过单词或短语分析以便获得更好的搜索排名,你会对SSIS的这个任务很感兴趣。关键词提取任务是从文本流中查找并计算关键词的出现频率的工具。它可与接收任何形式的文本,输出两列:一列是关键词,另一列是这个关键词在文本中出现的频率的统计值。这个统计值可以是该关键词出现的次数,也可以是使用稍微复杂一点的计算公式(TFIDF)计算得出的几率值。缩写词TFIDF的全称是Term Frequency and Inverse Document Frequency,是一个用于计算单词或词组在在整个文本中出现的几率。下面是这个公式的表达式:
TDIDF (of a term or phrase) = (frequency of term) * log((# rows in sample)/(# rows with term or phrase))
这里我们讨论的关键词提取任务使用SSIS组件内嵌的算法和公式计算得到提取结果,我们自己不能修改内部的算法逻辑,它是由别人设计好的,但是可以配置一些选项例如,如何分割关键词,统计名词还是名词词组。我们也可以根据提取行为调整这些配置。虽然在特定范围内提取,但是它还是提供一些预先定义的单词或词组时干扰项,这些干扰次货词组不予统计在最终结果之内。经过几次测试调整就可以产生一个非常有价值的统计结果。
在使用之前也许会思考它的使用场合,例如数据仓库内保存类一个客户服务系统中的一个数据列,它存储的是客户的建议和意见,如果使用这种任务来产生一个关键词统计结果是不是会很有用呢?我们可以很清楚地看出最大范围内客户不满意的地方,这就是使用关键词提取的一个很合适的场合。这里要求输入数据类型是ANSI(DT_WSTR)或者Unicode(DT_NTEXT)。如果不是这来年各种类型要使用Data Convertion来转换数据。最好的学习方法还是来实际操作一个例子,这个例子就是关于客户评价的。
从生产环境中得到一个客户服务系统中的客户评价的数据列。为了简便起见我们将他们放在一个文本文件中。
- 使用下面内容创建一个文本文件,保存为c”\custsvc.txt
Ice maker in freezer stopped working model XX-YY3
Door to refrigerator is coming off model XX-1
Ice maker is making a funny noise XX-YY3
Handle on fridge falling off model XX-Z1
Freezer is not getting cold enough XX-1
Ice maker grinding sound fridge XX-YY3
Customer asking how to get the ice maker to work model XX-YY3
Customer complaining about dent in side panel model XX-Z1
Dent in model XX-Z1
Customer wants to exchange model XX-Z1 because of dent in door
Handle is wiggling model XX-Z1
- 创建一个包命名为TermExtractionExample,拖放一个Data Flow task,双击进入Control Flow 设计界面
- 拖放一个Flat File Connection,连接上述文件,将输出列的列名修改为CustSvcNote。OutputColumnWidth设置为100。添加一个Flat File DataSource,使用上面建立的文件数据源
- 我们可以看到Flat File DataSource的输出数据类型是DT_STR,这里需要将数据类型转换成DT_WSTR或者DT_NTEXT。添加一个Data Conversion Transform,将Flat File DataSource和它连接起来设置Input Column为CustSvcNote,输出别名为ConvCustSvcNote,数据类型为DT_WSTR
- 添加一个Term Extraction task,将Data Conversion Transform和它连接起来,打开编辑界面,如图1显示输入列和两个有默认列名的输出列,这里也可以修改输出列的列名,这里我们选择ConvCustSvcNote因为它被转换成Unicode String,如果你选择了CustSvcNote,将会得到下面的验证提示:The input column can only have DT_WSTR or DT_NTEXT as its data type.
图1 - 关闭编辑界面,忽略关于错误输出的警告。
- 新建一个OLE DB Destination,将Term Extraction task和它连接起来,将它连接上数据库AdventureWorks
- 点击新建一个表使用下面的语句创建新表。
CREATE TABLE [TermResults] ([Term] NVARCHAR(128),[Score] DOUBLE PRECISION) - 点击Mappings ,查看映射关系。
- 在Term Extract Transformation和OLE DB Destination之间添加一个Data View,运行这个package。运行过程中将会停止并在DataView中显示执行结果。可以看到一组单词和他们的统计值。这里我们默认设置,所以score列显示的是关键词出现的次数,点击Advanced标签,如图2,查看高级设置。
图2 - 高级标签被分成四个部分。
Term Type:设置输入流应该如何划分。Noun将只统计名词,Noun Phrases将只统计名词词组,Noun and Noun Phrases将这二者都统计。
Score Type :使用Frequence或者TFIDF算法统计。
Parameters:次数门槛表示设置表示至少出现2次才会被统计出来。最大长度表示单词最大字母的个数必须小于12。
配置不同得到的结果也会不同,下图3显示不同的配置得到的不同结果。
图3
这里注意到Term Type设置为Both的时候“model XX-Z1”统计了3次,但是我们在文本中查看发现它出现了5次,如果设置Term Type为nouns的时候会统计5次。这也说明名词词组可能不会被正确地统计。
在图3的统计结果中我们也可以看到“model”,“model XX-Z1”,“model XX-YY3”,“ice maker”,“dent”,“customer”出现的频率较高,这里也可以假设模型XX-Z1,XX-YY3有可能出现了问题,需要检查一下。
在这个结果中我们也看到一些名词并不是我们感兴趣的,例如model,customer。也可以将这些干扰单词舍弃。使用Exclusion标签内的设置可以达到这个目目的。如图6-20显示了配置结果,保存后查看结果。下面是新建TermExclusions表的语句和,表中的 数据只有两行model和customer。
CREATE TABLE [dbo].[TermExclusions](
[Term] [nvarchar](128) NULL
) ON [PRIMARY]
图4
最后TermResults表中的结果如图5,图中显示的单词出现的次数,如果在Advanced中选择的是TFIDF,那么这里的结果将是一个类似0.213这样的小数。
图5
我们还可以看到结果中“model XX-Z1”,“model XX-YY3”没有统计了,这是因为我们去除了“model” 。另外一种方法是使用一个关键词列表,在这个列表中添加一些想统计的关键词来干预统计结果,这就是另外一种task-关键词查找。