从senten中提取python-nltk关键字

2024-05-15 14:05:33 发布

您现在位置:Python中文网/ 问答频道 /正文

"First thing we do, let's kill all the lawyers." - William Shakespeare

鉴于上述引文,我想把"kill""lawyers"作为描述句子整体意义的两个突出关键字。我提取了下列名词/动词词性标记:

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

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

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


Tags: the标记关键字alldo句子firstwe
3条回答

我不认为这个问题有任何完美的答案,因为没有任何黄金的输入/输出映射集,每个人都会同意。你认为这句话最重要的词是“杀”、“律师”,其他人可能会争辩说正确的答案应该是“第一”、“杀”、“律师”。如果您能够非常精确和完全明确地描述您希望系统做什么,那么您的问题将得到一半以上的解决。

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

通过将输入句子中每个单词的idf值与其POS标记结合起来,您可以回答这样的问题:“这个句子中最稀有的动词是什么?”在任何合理的语料库中,“kill”应该比“do”更稀有,“layers”应该比“thing”更稀有,所以也许尝试在一个句子中找到最稀有的名词和最稀有的动词,然后只返回这两个就可以实现大多数预期的用例。如果不是,你总是可以让你的算法复杂一点,看看这是否做得更好。

扩展这一功能的方法包括尝试使用n-gramidf识别较大的短语,构建完整的句子parse-tree(可能使用stanford parser),并在这些树中识别一些模式,以帮助您确定树的哪些部分做了重要的事情,这些都倾向于基于它们,等等

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

下面的代码片段显示了每种类型的单词标记的不同列表,但是您也可以为动词和名词(例如thisone)使用一个停止词列表。

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

在您的例子中,您可以简单地使用python的Rake(感谢Fabian)包来获得所需的内容:

>>> 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的使用

相关问题 更多 >