簡體   English   中英

NLTK-用特定的單詞替換大塊

[英]NLTK - Replace chunks with specific word

我正在使用nltk進行NLP。 我正在使用分塊提取人員姓名。 分塊后,我想用特定的字符串“ Male”或“ Female”替換這些塊。

我的代碼是:

import nltk

with open('male_names.txt') as f1:
    male = [line.rstrip('\n') for line in f1]
with open('female_names.txt') as f2:
     female = [line.rstrip('\n') for line in f2]

with open("input.txt") as f:
    text = f.read()

words = nltk.word_tokenize(text)
tagged = nltk.pos_tag(words)
chunkregex = r"""Name: {<NNP>+}"""
chunkParser = nltk.RegexpParser(chunkregex)
chunked = chunkParser.parse(tagged)

for subtree in chunked.subtrees(filter=lambda t: t.label() == 'Name'):
    chunk=[]
    for word, pos in subtree:
        chunk.append(word)
        temp = " ".join(chunk)
    **if temp in male:
        subtree = ('Male', pos)
    if temp in female:
        subtree = ('Female', pos)**
    print subtree

print chunked

我的輸入數據是:

傑克·斯派洛(Jack Sparrow)船長抵達牙買加的皇家港口,指揮一艘船。 盡管營救了韋瑟比·斯旺(Wayby Swann)州長的女兒伊麗莎白·斯旺(Elizabeth Swann)溺水,但仍因海盜罪被判入獄。

當前輸出為:

(S (Name Captain/NNP Jack/NNP Sparrow/NNP)到達/ VBZ進入/ IN(名字港口/ NNP皇家/ NNP)進入/ IN(名字牙買加/ NNP)到/ TO指揮官/ VB a / DT艦船/ NN ./。盡管/ IN正在營救/ VBG (Name Elizabeth/NNP Swann/NNP) ,/,/ IN的/ DT女兒/ NN (Name Governor/NNP Weatherby/NNP Swann/NNP) ,/,/ IN溺水/ VBG,/,他/ PRP被/ VBZ監禁/ VBN for / IN盜版/ NN ./。)

我想用“ Male”或“ Female”替換這些塊,其輸出應為:

(S Male/NNP到達/ VBZ進/ IN(名字港口/ NNP皇家/ NNP)進/ IN(名字牙買加/ NNP)到/ TO司令官/ VB a / DT艦/ NN ./。盡管/ IN正在營救/ VBG Female/NNP ,/,/ IN Male/NNP ,/的/ DT女兒/ NN,來自/ IN溺水/ VBG,/,他/ PRP被/ VBZ監禁/ VBN,/ IN盜版/NN./。)

代碼中的粗體部分沒有執行應有的功能。 print subtree語句顯示更改,但print chunked不會更改。

我做錯了什么或者還有其他方法嗎?
我是python和nltk的新手。 任何幫助表示贊賞。

malefemale的名字列表包括:

[“傑克·斯帕羅船長”,“州長韋瑟·斯旺”,“羅賓”]

[“伊麗莎白·斯旺”,“珍妮”]

我不知道我是否正確理解了您的問題。 NLTK子樹只是普通的Python列表。 因此,您也可以在此處執行常規列表操作。嘗試使用此代碼段,而不要在代碼中使用for循環部分。

for subtree in chunked.subtrees(filter=lambda t: t.label() == 'Name'):
    full_name = []
    for word, pos in subtree:
        full_name.append(word)
        st = " ".join(full_name)  # iterate till the variable catches full name as tokenizer segments words.
        if st in male:
            subtree[:] = [("Male",pos)]  # replacing the subtree with our own value
        elif st in female:
            subtree[:] = [("Female",pos)]

輸出:

> (S (Name male/NNP) arrives/VBZ in/IN (Name Port/NNP Royal/NNP) in/IN (Name Jamaica/NNP) to/TO commandeer/VB a/DT ship/NN ./. Despite/IN rescuing/VBG (Name female/NNP) ,/, the/DT daughter/NN of/IN (Name male/NNP) ,/, from/IN drowning/VBG ,/, he/PRP is/VBZ jailed/VB for/IN piracy/NN./.)

暫無
暫無

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

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