Python NLTK句子关键词提取

6
“我们要做的第一件事是杀死所有的律师。”- 威廉·莎士比亚
考虑到上述引语,我想提取“杀死”和“律师”作为描述该句整体含义的两个突出关键词。我已经提取了以下名词/动词POS标记:
[["First", "NNP"], ["thing", "NN"], ["do", "VBP"], ["lets", "NNS"], ["kill", "VB"], ["lawyers", "NNS"]]

我试图解决的更一般的问题是将句子提炼为“最重要的”单词/标签,以概括句子的整体“意义”。请注意引号。我承认这是一个非常困难的问题,在目前的情况下可能没有完美的解决方案。尽管如此,我对尝试解决特定问题(提取“杀死”和“律师”)和一般问题(用关键词/标签总结句子的整体意思)的方法很感兴趣。

你的标记词列表似乎已经去除了停用词..这是在遵循ChrisGuest的建议之后吗? - Spaceghost
不,我正在过滤这些词性标签:'NN','NNS','NNP','NNPS','JJ','VB','VBP','VBG','VBD'。 - waigani
3个回答

4
我认为这个问题没有完美的答案,因为没有任何一组输入/输出映射是每个人都会同意的黄金标准。你可能认为该句子最重要的词是(“kill”,“lawyers”),但其他人可能会认为正确答案应该是(“first”,“kill”,“lawyers”)。如果您能非常精确且完全明确地描述您想要系统执行的任务,那么您的问题将解决一半以上。
在此之前,我可以建议一些额外的启发式方法来帮助您实现您的目标。 使用您的数据构建一个idf字典,即建立从每个单词到与该单词的稀有程度相关的数字的映射。对于更大的n-grams,进行此操作可以获得额外的加分。
通过将输入句子中每个单词的idf值与它们的POS标签相结合,您可以回答以下问题:“这个句子中最罕见的动词是什么?”,“这个句子中最罕见的名词是什么?”等。在任何合理的语料库中,“杀死”应该比“做”更罕见,“律师”比“事物”更罕见,因此也许尝试查找句子中最罕见的名词和最罕见的动词,并仅返回这两个结果,对于大多数预期的用例来说就足够了。如果不行,您可以使算法更加复杂,看看是否能更好地完成任务。
扩展方法包括尝试使用n-gram idf识别更大的短语,构建完整的句子解析树(可能使用斯坦福解析器),并在这些树中识别出一些模式,以帮助您确定哪些部分的树是基于重要事情的,等等。

2
在您的情况下,您可以简单地使用Python的Rake(由Fabian提供的)软件包来获取您需要的内容: Rake
>>> path = #your path 
>>> r = RAKE.Rake(path)
>>> r.run("First thing we do, let's kill all the lawyers")
[('lawyers', 1.0), ('kill', 1.0), ('thing', 1.0)]

路径可以是例如这个文件。
但一般来说,最好使用NLTK包进行NLP用途。

2
一种简单的方法是为名词(NN)、动词(VB)等保留 停用词 列表。这些通常是高频词,不会给句子添加太多语义内容。
下面的片段显示了每种类型的单词令牌具有不同的列表,但您也可以使用一个停用词列表来同时处理动词和名词(例如 这个)。
stop_words = dict(
    NNP=['first', 'second'],
    NN=['thing'],
    VBP=['do','done'],
    VB=[],
    NNS=['lets', 'things'],
)


def filter_stop_words(pos_list):
    return [[token, token_type] 
            for token, token_type in pos_list 
            if token.lower() not in stop_words[token_type]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接