Парсинг физических адресов

Как записать распарсенный адрес в одну строку, то есть 123456, г Москва, улица Марьинский парк ,д.21,кор.2

Как записать распарсенный адрес в одну строку, то есть 123456, г Москва, улица Марьинский парк ,д.21,кор.2

from natasha import (
    Segmenter,
    MorphVocab,
    
    NewsEmbedding,
    NewsMorphTagger,
    NewsSyntaxParser,
    NewsNERTagger,
    
    PER,
    NamesExtractor,
    DatesExtractor,
    MoneyExtractor,
    AddrExtractor,

    Doc
)
#from natasha.markup import show_markup, show_json
segmenter = Segmenter()
morph_vocab = MorphVocab()

emb = NewsEmbedding()
morph_tagger = NewsMorphTagger(emb)
syntax_parser = NewsSyntaxParser(emb)
ner_tagger = NewsNERTagger(emb)

names_extractor = NamesExtractor(morph_vocab)
dates_extractor = DatesExtractor(morph_vocab)
money_extractor = MoneyExtractor(morph_vocab)
addr_extractor = AddrExtractor(morph_vocab)
for line in df['Адрес объекта'].head(1):
    display(addr_extractor.find(line))

Результат кода выше отражен на скриншоте, теперь мне надо записать распарсенный адрес в одну строку, то есть 123456, г Москва, улица Марьинский парк ,д.21,кор.2

Пробывала так:

    listik = []
str_listik = []
for line in df['Адрес объекта'].head(100):
    
    #display(addr_extractor.find(line).fact.parts)
        #print(addr_extractor.find(line).fact.parts)    
# for match in parser.findall(addr_extractor.find(line).fact.parts):
#               print([_.value for _ in match.tokens]) 
    for index, paramValue in enumerate(addr_extractor.find(line).fact.parts):
        p=paramValue
        i = index
        if p.type=='индекс':
            listik.append( p.value)
        if p.type=='город':
            listik.append( p.value)
        if p.type=='улица':
            listik.append( p.value)
        if p.type=='дом':
            listik.append( p.value + ',')
        if  p.type=='корпус':
            listik.append(p.type + p.value + ',')
            
str_listik.append(' '.join(map(str,listik)))

print(str_listik)

В итоге получается одна строка с набором адресов, помогите получить разные строки.( отдельно по каждому адресу)


Ответы (1 шт):

Автор решения: insolor

Инициализацию/очистку listik = [] перенесите внутрь первого цикла (иначе в него будут собираться части всех адресов), а для строки str_listik.append(' '.join(map(str,listik))) добавьте отступ, чтобы она была внутри цикла (иначе в список str_listik попадает только последнее состояние списка listik).

str_listik = []

for line in df['Адрес объекта'].head(100):
    listik = []
    for index, paramValue in enumerate(addr_extractor.find(line).fact.parts):
        p=paramValue
        i = index
        if p.type=='индекс':
            listik.append( p.value)
        if p.type=='город':
            listik.append( p.value)
        if p.type=='улица':
            listik.append( p.value)
        if p.type=='дом':
            listik.append( p.value + ',')
        if  p.type=='корпус':
            listik.append(p.type + p.value + ',')
            
    str_listik.append(' '.join(map(str,listik)))

print(str_listik)
→ Ссылка