簡體   English   中英

從句子中提取python nltk關鍵字

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

在你的情況下,你可以簡單地使用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)]

路徑可以是例如文件。

但一般來說,最好使用NLTK包進行NLP使用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM