资源技术动态如何用TF-IDF自动生成文本摘要

如何用TF-IDF自动生成文本摘要

2020-01-10 | |  88 |   0

原标题:如何用TF-IDF自动生成文本摘要

来源:AI 研习社        链接:https://www.yanxishe.com/TextTranslation/1797


本文将使用NLTK经过五部实现文本摘要,再次将看到如何使用词频算法实现文本总结。


现在我们将使用TF-IDF算法来进行文本总结。

注意:在一下任务中,我们除了会高度依赖Math库之外,不会调用任何其他的现存库,所有实际算法都是我们亲自来实现。


Term Frequency * Inverse Document Frequency

                           词频*逆文档频率


TF-IDF算法是由两个算法相乘而来。


1)词频

定义:词频(TF)是指一个词(word)在一篇文档中出现的次数与文档中总的词数量的相除。

公式:TF(t) = (词在文档中出现的次数) / (文档中总的词数量)


2)逆文档频率

词频(TF)是一个词的“常见”程度,逆文档频率(IDF)是一个词的“稀有”或"稀有"程度。

公式:IDF(t) = log_e(文档数量 / 包含该词的文档数量)


例如:

假设一篇文档总包含100个词,在其中apple这个词出现了5词,则apple的词频(TF)就是(5/100)=0.05

假设我们总共有一亿份文档,其中有1千份文档中出现了apple这个词,则拟文档频率(IDF)可以计算为log(10,000,000/1,000)=4

所以,apple这个词的TF-IDF权重就可以计算为TF*IDF=0.05*4=0.20


容易么?我们将使用以上描述的同样公式,实现文本总结的生成。


Oh yeah,我爱数学。


9步实现过程:

环境依赖,python3,python的NLTK库,你喜欢的文本编辑器或者IDE


1.句子切分

sentences = sent_tokenize(text) # NLTK function    

total_documents = len(sentences)

我们将给句子分词,并且给出每个句子对应的权重。


2.构建每个词在每个句子中的频率矩阵

我们计算每个词在每个句子中的词频:

01.png

0_XE-lJbGtd1XC_x5E.png


结果类似如下:

{'nThose Who Are ': {'resili': 1, 'stay': 1, 'game': 1, 'longer': 1, '“': 1, 'mountain': 1}, 'However, I real': {'howev': 1, ',': 2, 'realis': 1, 'mani': 1, 'year': 1}, 'Have you experi': {'experienc': 1, 'thi': 1, 'befor': 1, '?': 1}, 'To be honest, I': {'honest': 1, ',': 1, '’': 1, 'answer': 1, '.': 1}, 'I can’t tell yo': {'’': 1, 'tell': 1, 'right': 1, 'cours': 1, 'action': 1, ';': 1, 'onli': 1, 'know': 1, '.': 1}...}


这里每个句子作为dict的key,key对应的value就是词频字典。


3.计算词频并且生成矩阵

我们需要计算每个词的TF在每个段落中。

现在,我们回忆一下TF的定义。

TF(t) = (一个词在一个文档中出现的次数) / (这个文档中总的词数)

这里,文档就是我们的段落,词就是段落中的词。

02.png

现在我们的结果矩阵如下:

{'nThose Who Are ': {'resili': 0.03225806451612903, 'stay': 0.03225806451612903, 'game': 0.03225806451612903, 'longer': 0.03225806451612903, '“': 0.03225806451612903, 'mountain': 0.03225806451612903}, 'However, I real': {'howev': 0.07142857142857142, ',': 0.14285714285714285, 'realis': 0.07142857142857142, 'mani': 0.07142857142857142, 'year': 0.07142857142857142}, 'Have you experi': {'experienc': 0.25, 'thi': 0.25, 'befor': 0.25, '?': 0.25}, 'To be honest, I': {'honest': 0.2, ',': 0.2, '’': 0.2, 'answer': 0.2, '.': 0.2}, 'I can’t tell yo': {'’': 0.1111111111111111, 'tell': 0.1111111111111111, 'right': 0.1111111111111111, 'cours': 0.1111111111111111, 'action': 0.1111111111111111, ';': 0.1111111111111111, 'onli': 0.1111111111111111, 'know': 0.1111111111111111, '.': 0.1111111111111111}}


如果我们比较这个结果,与上一步的结果,你会发现具有相同词频的词,这里就具有相同的TF分数。


4.构建一个有多少个文档包含该词的表

这也是一个简单的dict,目的是帮助我们计算IDT矩阵。

我们计算“有多少个句子包含这个词”,我们叫做,字文档矩阵:

03.png


这就是我们计算得到的词表:


{'resili': 2, 'stay': 2, 'game': 3, 'longer': 2, '“': 5, 'mountain': 1, 'truth': 1, 'never': 2, 'climb': 1, 'vain': 1, ':': 8, 'either': 1, 'reach': 1, 'point': 2, 'higher': 1, 'today': 1, ',': 22, 'train': 1, 'power': 4, 'abl': 1, 'tomorrow.': 1, '”': 5, '—': 3, 'friedrich': 1, 'nietzsch': 1, 'challeng': 2, 'setback': 2, 'meant': 1, 'defeat': 3, 'promot': 1, '.': 45, 'howev': 2, 'realis': 2, 'mani': 3, 'year': 4, 'crush': 1, 'spirit': 1, 'easier': 1, 'give': 4, 'risk': 1}

例如:resili在两句话中出现,power在四句号中出现。


5.计算IDF矩阵

我们将开始计算每个段落中的每个词的IDF分数

我们先回忆一下IDF的定义。


IDF(t) = log_e(文档总数 /包含这个词的文档数量)

这里,段落就是文档,段落中的词,就是这里讲的词。


04.png

结果的句子,类似如下所示:

{'nThose Who Are ': {'resili': 1.414973347970818, 'stay': 1.414973347970818, 'game': 1.2388820889151366, 'longer': 1.414973347970818, '“': 1.0170333392987803, 'mountain': 1.7160033436347992}, 'However, I real': {'howev': 1.414973347970818, ',': 0.37358066281259295, 'realis': 1.414973347970818, 'mani': 1.2388820889151366, 'year': 1.1139433523068367}, 'Have you experi': {'experienc': 1.7160033436347992, 'thi': 1.1139433523068367, 'befor': 1.414973347970818, '?': 0.9378520932511555}, 'To be honest, I': {'honest': 1.7160033436347992, ',': 0.37358066281259295, '’': 0.5118833609788743, 'answer': 1.414973347970818, '.': 0.06279082985945544}, 'I can’t tell yo': {'’': 0.5118833609788743, 'tell': 1.414973347970818, 'right': 1.1139433523068367, 'cours': 1.7160033436347992, 'action': 1.2388820889151366, ';': 1.7160033436347992, 'onli': 1.2388820889151366, 'know': 1.0170333392987803, '.': 0.06279082985945544}}

与TF矩阵相比较,两者有什么不同?


6.计算TF-IDF矩阵

现在我们有了TF和IDF两个矩阵,这里就非常容易了。

TF-IDF就是这两个算法的乘积。

简单的讲,我们就是把IDF与TF相乘,而生成新的矩阵。

05.png

结果如下:


{'nThose Who Are ': {'resili': 0.04564430154744574, 'stay': 0.04564430154744574, 'game': 0.03996393835210118, 'longer': 0.04564430154744574, '“': 0.0328075270741542, 'mountain': 0.05535494656886449}, 'However, I real': {'howev': 0.10106952485505842, ',': 0.053368666116084706, 'realis': 0.10106952485505842, 'mani': 0.08849157777965261, 'year': 0.07956738230763119}, 'Have you experi': {'experienc': 0.4290008359086998, 'thi': 0.2784858380767092, 'befor': 0.3537433369927045, '?': 0.23446302331278887}, 'To be honest, I': {'honest': 0.34320066872695987, ',': 0.07471613256251859, '’': 0.10237667219577487, 'answer': 0.2829946695941636, '.': 0.01255816597189109}, 'I can’t tell yo': {'’': 0.0568759289976527, 'tell': 0.15721926088564644, 'right': 0.12377148358964851, 'cours': 0.19066703818164435, 'action': 0.13765356543501517, ';': 0.19066703818164435, 'onli': 0.13765356543501517, 'know': 0.11300370436653114, '.': 0.006976758873272827}}


7.句子的权重(分数)

不同的打分算法会有不同的分数,这里我们使用句子中的所有词的TD-IDF分数之和来对当前句子打分。

06.png

打分结果,如下所示:

{'nThose Who Are ': 0.049494684794344025, 'However, I real': 0.09203831532832171, 'Have you experi': 0.3239232585727256, 'To be honest, I': 0.16316926181026162, 'I can’t tell yo': 0.12383203821623005}


8.阈值发现

与任何摘要算法相似,都具有不同的计算方式来计算阈值。我们计算句子得分的平均分数。

07.png

我们得到的分数如下:

0.15611302409372044


9.生成摘要

算法:如果句子的分数比我们上一步计算的均值分数大,我们则选择这个句子用于摘要。

08.png

# Everything in one place: Algorithms Assemble

上一篇:Google Brain的最先进文本摘要

下一篇:关于TensorFlow 2.0你需要了解的一切

用户评价
全部评价

热门资源

  • 应用笔画宽度变换...

    应用背景:是盲人辅助系统,城市环境中的机器导航...

  • GAN之根据文本描述...

    一些比较好玩的任务也就应运而生,比如图像修复、...

  • 端到端语音识别时...

    从上世纪 50 年代诞生到 2012 年引入 DNN 后识别效...

  • 人体姿态估计的过...

    人体姿态估计是计算机视觉中一个很基础的问题。从...

  • 谷歌发布TyDi QA语...

    为了鼓励对多语言问答技术的研究,谷歌发布了 TyDi...