今天跟大家聊聊我最近在做的关键词提取实践,一开始我也有点懵,感觉无从下手。但硬着头皮上,一步一个脚印,总算是搞出点眉目了。
我啥也不懂,就知道关键词提取这玩意儿有用,能快速抓住文章重点。于是我上网查资料,看了各种算法,像什么TF-IDF、TextRank、LDA啥的,把我头都看大了。感觉每个算法都挺厉害,但又不知道哪个适合我的需求。
后来我决定先从最简单的TF-IDF入手。这玩意儿简单粗暴,就是统计词频,然后乘以一个逆文档频率。说白了,就是看哪个词在文章里出现得多,但在其他文章里出现得少,那这个词就越重要。
我找了一篇新闻稿,用Python写了个简单的TF-IDF脚本。先把文章分词,然后统计每个词的词频。这里我用的是jieba分词,感觉还挺好用的。 我计算了每个词的逆文档频率。这部分我直接用了sklearn库,里面有现成的函数可以用,省了不少事。
跑完脚本,我得到了每个词的TF-IDF值。然后,我按照TF-IDF值从大到小排序,取了前几个词作为关键词。结果嘛差强人意。有些词确实挺重要的,但也有一些词是没啥意义的,比如“的”、“了”之类的。
为了解决这个问题,我加入了停用词过滤。 就是把那些没啥意义的词,比如“的”、“了”、“是”之类的,从词频统计里排除掉。我网上找了个停用词表,加载到程序里,然后在分词后,把停用词过滤掉。这一下,关键词提取的效果就好多了。
但是,TF-IDF还是有它的局限性。它只考虑了词频,没有考虑词语之间的关系。比如,“人工智能”这个词,虽然“人工”和“智能”这两个词单独出现可能频率不高,但它们组合在一起就非常重要。为了解决这个问题,我开始研究TextRank算法。
TextRank算法是基于图的排序算法,它把文章里的每个词都看作图里的一个节点,然后根据词语之间的共现关系,建立节点之间的连接。说白了,就是看哪个词和哪个词经常一起出现,如果两个词经常一起出现,那它们之间的连接就越强。 然后,TextRank算法通过迭代计算,给每个节点赋予一个权重,权重越高的节点,就越重要。
我用Python实现了TextRank算法。这里我用的是networkx库,它提供了方便的图操作功能。 我先把文章分词,然后根据词语之间的共现关系,建立了一个图。我用TextRank算法计算了每个节点的权重。我按照权重从大到小排序,取了前几个词作为关键词。
TextRank算法提取的关键词,比TF-IDF算法提取的关键词,语义性更强,更能抓住文章的重点。 但是,TextRank算法的计算复杂度比较高,对于长文章来说,计算时间比较长。
这回关键词提取实践,让我对关键词提取算法有了更深入的了解。虽然我只是用了TF-IDF和TextRank这两个简单的算法,但它们已经能解决我大部分的需求了。 还有很多其他的关键词提取算法,比如LDA、LSA啥的,以后有机会再研究研究。
我觉得,做技术就是这样,不怕从头开始,不怕遇到困难,只要一步一个脚印,坚持下去,总能有所收获。 希望我的这回实践记录,能对大家有所帮助。
