[英]python nltk keyword extraction from sentence
“我们做的第一件事就是杀死所有的律师。” - 威廉莎士比亚
鉴于上面的引用,我想把"kill"
和"lawyers"
作为描述句子整体意义的两个突出关键词。 我提取了以下名词/动词POS标签:
[["First", "NNP"], ["thing", "NN"], ["do", "VBP"], ["lets", "NNS"], ["kill", "VB"], ["lawyers", "NNS"]]
我试图解决的更普遍的问题是将句子提炼为“最重要的”*单词/标签,以概括句子的整体“含义”*。
*注意恐慌报价。 我承认这是一个非常棘手的问题,目前很可能没有完美的解决方案。 尽管如此,我有兴趣看到解决特定问题的尝试(提取"kill"
和"lawyers"
)和一般问题(总结关键字/标签中句子的整体含义)
我不认为对这个问题有任何完美的答案,因为没有任何黄金集的输入/输出映射,每个人都会同意。 你认为这句话最重要的词是('杀','律师'),其他人可能认为正确答案应该是('先','杀','律师')。 如果您能够非常精确和完全明确地描述您希望系统做什么,那么您的问题将解决一半以上。
在此之前,我可以建议一些额外的启发式方法来帮助您获得所需的内容。
使用您的数据构建一个idf字典,即构建从每个单词到与该单词的罕见程度相关的数字的映射。 对于更大的n-gram也可以获得奖励积分。
通过将输入句子中每个单词的idf值与其POS标签结合起来,您可以回答“这句话中什么是最稀有动词”这一形式的问题,“这句话中最稀有的名词是什么”,等等。任何合理的语料库,'kill'应该比'do'更罕见,'律师'比'thing'更罕见,所以也许试图在一个句子中找到最稀有的名词和最稀有的动词而只返回那两个将对大多数人来说都是伎俩您的预期用例。 如果没有,你总是可以让你的算法更复杂,看看这似乎是否能更好地完成工作。
扩展这种方法的方法包括尝试使用n-gram idf识别更大的短语,构建句子的完整解析树 (使用stanford解析器 )并识别这些树中的某些模式以帮助您确定树的哪些部分重要的事情往往是基于等等。
一种简单的方法是为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]]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.