python中的文本图形句子

时间:2017-02-08 17:33:27

标签: python graph nlp tokenize text-mining

我试图在python中解决文本挖掘问题,其中包括:

目标:通过将段落标记为句子来创建由节点(句子)组成的图形,它们的边缘将是它们的相似性。

这根本不是新的,但问题的症结并没有在互联网上得到很好的对待。因此,在从段落中获得句子之后,有趣的一点是计算句子(所有组合)之间的相似性矩阵以绘制图形。

是否有任何软件包能够以简单的方式在几个向量之间执行类似的操作?,即使给定的字符串列表也会形成相似的图表...

可重现的例子:

# tokenize into sentences
>>> from nltk import tokenize
>>> p = "Help my code works. The graph isn't still connected. The code computes the relationship in a graph. "
>>> sentences=tokenize.sent_tokenize(p)
  ['Help my code works.', "The graph isn't still connected.", 'The code computes the relationship in a graph.']
>>> len (sentences)
3

# compute similarity with dice coeffcient.
>>>def dice_coefficient(a, b):
    """dice coefficient 2nt/na + nb."""
    a_bigrams = set(a)
    b_bigrams = set(b)
    overlap = len(a_bigrams & b_bigrams)
    return overlap * 2.0/(len(a_bigrams) + len(b_bigrams)
>>>dice_coefficient(sentences[1],sentences[2])
0.918918918918919

因此,使用此功能,我可以手动完成,然后使用节点和边缘创建图形。但总是一个全局解决方案(用n个句子)是最好的。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

以下列表推导创建了一个元组列表,其中前两个元素是索引,最后一个是相似性:

edges = [(i,j,dice_coefficient(x,y)) 
         for i,x in enumerate(sentences) 
         for j,y in enumerate(sentences) if i < j]

您现在可以移除某个阈值以下的边缘,并将剩余的边缘转换为networkx的图形:

import networkx as nx
G = nx.Graph()
G.add_edges_from((i,j) for i,j,sim in edges if sim >= THRESHOLD)