【问题标题】:python nltk keyword extraction from sentencepython nltk从句子中提取关键字
【发布时间】:2012-07-10 04:33:06
【问题描述】:

“我们要做的第一件事,就是杀死所有的律师。” - 威廉莎士比亚

鉴于上面的引用,我想拔出"kill""lawyers" 作为两个突出的关键字来描述句子的整体含义。我提取了以下名词/动词词性标签:

[["First", "NNP"], ["thing", "NN"], ["do", "VBP"], ["lets", "NNS"], ["kill", "VB"], ["lawyers", "NNS"]]

我试图解决的更一般的问题是将句子提炼成“最重要”*的单词/标签,以总结句子的整体“意义”*。

*注意吓人的引号。我承认这是一个非常困难的问题,目前很可能没有完美的解决方案。尽管如此,我有兴趣看到解决具体问题(提取"kill""lawyers")和一般问题(总结关键字/标签中句子的整体含义)的尝试

【问题讨论】:

  • 您的标记词列表似乎删除了停用词.. 这是在遵循 ChrisGuest 的建议之后吗?
  • 不,我正在过滤这些 POS 标签:'NN','NNS','NNP','NNPS','JJ','VB','VBP','VBG' , 'VBD'

标签: python nlp nltk


【解决方案1】:

我认为这个问题没有任何完美的答案,因为没有任何人人都会同意的黄金输入/输出映射集。你认为这句话最重要的词是('kill', 'lawyers'),其他人可能会争辩正确答案应该是('first', 'kill', 'lawyers')。如果您能够非常准确且完全明确地准确描述您希望系统执行的操作,那么您的问题将解决一半以上。

在那之前,我可以建议一些额外的启发式方法来帮助您获得想要的东西。
使用您的数据构建idf 字典,即构建从每个单词到与该单词的稀有程度相关的数字的映射。更大的n-grams 也可以加分。

通过结合输入句子中每个单词的 idf 值及其 POS 标签,您可以回答以下形式的问题:“这个句子中最稀有的动词是什么?”、“这个句子中最稀有的名词是什么”、等等。在任何合理的语料库中,“kill”应该比“do”更稀有,“lawyers”比“thing”更稀有,所以也许试图在一个句子中找到最稀有的名词和最稀有的动词,然后只返回这两个就可以了适用于大多数预期用例的技巧。如果没有,你总是可以让你的算法更复杂一点,看看这是否能更好地完成这项工作。

扩展它的方法包括尝试使用 n-gram idf 识别更大的短语,构建句子的完整 parse-tree(可能使用 stanford parser)并识别这些树中的一些模式以帮助您找出哪些部分的树做重要的事情往往是基于等。

【讨论】:

    【解决方案2】:

    一种简单的方法是为 NN、VB 等保留 stop word 列表。这些是高频词,通常不会为句子添加太多语义内容。

    下面的 sn-p 显示了每种单词标记的不同列表,但您也可以为动词和名词使用单个停用词列表(例如 this one)。

    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]]
    

    【讨论】:

      【解决方案3】:

      在你的情况下,你可以简单地使用 Rake(感谢 Fabian)包来获取你需要的 python 包:

      >>> 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)]
      

      路径可以是例如this 文件。

      但总的来说,您最好使用 NLTK 包来进行 NLP 使用

      【讨论】:

        猜你喜欢
        • 2020-12-02
        • 1970-01-01
        • 2021-04-18
        • 1970-01-01
        • 2021-07-07
        • 2010-12-28
        • 1970-01-01
        • 1970-01-01
        • 2012-04-03
        相关资源
        最近更新 更多