NLTK: Как получить определенное содержимое массива в цикле с Python? - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь получить статистику с корпорацией, используя NLTK , я хотел бы знать, как получить список тегов, которые идут рядом с определенным тегом.Например, я хочу получить список тегов после тега DTDEF

Я пытаюсь следовать руководству по https://www.nltk.org/book/ch05.html и настроить его в соответствии со своими потребностями.

Здесь, код хранения в массиве «тегирует» все теги ПОСЛЕ слово 'ny' , или я хотел бы сохранить тег после тега DTDEF ( DTDEF является тэгом слова 'ny').

import nltk
from nltk.corpus.reader import TaggedCorpusReader
reader = TaggedCorpusReader('cookbook', r'.*\.pos')
train_sents=reader.tagged_sents()
for sent in train_sents:
    tags = [tag[1] for (word, tag) in nltk.bigrams(sent) if word[0]=='ny']

    #0 is for the word and 1 is for the tag, so tag[0] get you the word and 
    #tag[1] the tag, the same with word[0] and word[1]


fd = nltk.FreqDist(tags)
fd.tabulate()

Чтобы получить желаемый результат, я изменяю код следующим образом:

import nltk
from nltk.corpus.reader import TaggedCorpusReader
reader = TaggedCorpusReader('cookbook', r'.*\.pos')
train_sents=reader.tagged_sents()
for sent in train_sents:
    #i change the line here
    tags = [tag[1] for (word, tag) in nltk.bigrams(sent) if tag[1]=='DTDEF']

fd = nltk.FreqDist(tags)
fd.tabulate()

Я ожидаю списоктег после тега DTDEF, но вместо этого я получаю все вхождения тега DTDEF.DTDEF 150

Итак, я пытаюсь это сделать, но проблема с питоном заключается в том, что я не могу делать такие вещи:

import nltk
from nltk.corpus.reader import TaggedCorpusReader
reader = TaggedCorpusReader('cookbook', r'.*\.pos')
train_sents=reader.tagged_sents()
tags=[]
count=0
for sent in train_sents:
    for (word,tag) in sent:
        #if tag is DTDEF i want to get the tag after it
        if tag=="DTDEF":
            tags[count]=tag[acutalIndex+1]
            count+=1


fd = nltk.FreqDist(tags)
fd.tabulate()

Так что это причина моего вопроса.

Заранее благодарю за ответ и совет.

Ответы [ 2 ]

1 голос
/ 14 июня 2019

Спасибо за # CrazySqueak за помощь, я использую его код и редактирую часть, чтобы получить это:

import nltk
from nltk.corpus.reader import TaggedCorpusReader
reader = TaggedCorpusReader('cookbook', r'.*\.pos')
train_sents=reader.tagged_sents()
tags = []
foundit=False
for sent in train_sents:
    #i change the line here
    for (word,tag) in nltk.bigrams(sent):
        if foundit: #If the entry is after 'DTDEF'
            tags.append(tag[1]) #Add it to the resulting list of tags, i change
                                #tag [1] instead, if you use only tag, it will 
                                #store not only the tag but the word as well 
            #of foundit
            foundit=False #I need to make it false again, cause it will store again even 
                          #if the tag is != of DTDEF
        if tag[1]=='DTDEF': #If the entry is 'DTDEF'
            foundit=True #Set the 'After DTDEF' flag.

fd = nltk.FreqDist(tags)
fd.tabulate()

Еще раз спасибо за ваш совет и ваш ответ.

1 голос
/ 14 июня 2019

Я не уверен на 100%, что понимаю, но если вы хотите получить все записи в списке после определенной записи, самый простой способ это сделать:

foundthing=False
result = []
for i in list:
    if foundthing:
        result.append(i)
    if i == "Thing I'm Looking For":
        foundthing = True

Добавление этого к вашему коду приводит к:

import nltk
from nltk.corpus.reader import TaggedCorpusReader
reader = TaggedCorpusReader('cookbook', r'.*\.pos')
train_sents=reader.tagged_sents()
tags = []
foundit=False
for sent in train_sents:
    #i change the line here
    for (word,tag) in nltk.bigrams(sent):
        if foundit: #If the entry is after 'DTDEF'
            tags.append(foundit) #Add it to the resulting list of tags.
        if tag[1]=='DTDEF': #If the entry is 'DTDEF'
            foundit=True #Set the 'After DTDEF' flag.

fd = nltk.FreqDist(tags)
fd.tabulate()

Надеюсь, это поможет.

...