“我们做的第一件事就是杀死所有的律师。” - William Shakespeare
鉴于上面的引用,我想提取"kill"
和"lawyers"
作为两个突出的关键词来描述句子的整体含义。我提取了以下名词/动词POS标签:
[["First", "NNP"], ["thing", "NN"], ["do", "VBP"], ["lets", "NNS"], ["kill", "VB"], ["lawyers", "NNS"]]
我想要解决的更普遍的问题是将句子提炼为“最重要的”*单词/标签,以概括句子的整体“含义”*。
*请注意恐慌报价。我承认这是一个非常棘手的问题,目前很可能没有完美的解决方案。尽管如此,我有兴趣看到尝试解决具体问题(提取"kill"
和"lawyers"
)和一般问题(总结关键字/标签中句子的整体含义)
答案 0 :(得分:3)
我不认为对这个问题有任何完美的答案,因为没有任何黄金集的输入/输出映射,每个人都会同意。你认为这句话最重要的词是('杀','律师'),其他人可能认为正确答案应该是('先','杀','律师')。如果您能够非常精确和完全明确地描述您希望系统做什么,那么您的问题将解决一半以上。
在此之前,我可以建议一些额外的启发式方法来帮助您获得所需的内容 使用您的数据构建idf字典,即构建从每个单词到与该单词的罕见程度相关的数字的映射。对于较大的n-grams也可以获得奖励积分。
通过将输入句子中每个单词的idf值与其POS标签相结合,您可以回答“这句话中什么是最稀有动词”这一形式的问题,“这句话中最稀有的名词是什么”,在任何合理的语料库中,'kill'应该比'do'更罕见,'律师'比'thing'更罕见,所以也许试图在一个句子中找到最稀有的名词和最稀有的动词并且只返回那两个将会做大多数预期用例的技巧。如果没有,你总是可以让你的算法更复杂,看看这似乎是否能更好地完成工作。
扩展这种方法的方法包括尝试使用n-gram idf识别更大的短语,构建句子的完整parse-tree(使用stanford parser}并识别这些树中的某些模式以帮助您弄清楚树的哪些部分做重要的事情往往是基于等等。
答案 1 :(得分:2)
一种简单的方法是为NN,VB等保留stop word列表。这些是高频词,通常不会为句子添加太多的语义内容。
下面的代码段显示了每种类型的单词标记的不同列表,但您也可以为动词和名词使用单个停用词列表(例如this一个)。
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]]
答案 2 :(得分:2)