Я перебираю очень большой (~ 5 ГБ) текстовый документ, например, так:
<P ID=912>
bird
dog
dog
dog
</P>
<P ID=5>
aardvark
bird
bird
cat
egret
</P>
<P ID=291>
aardvark
aardvark
aardvark
aardvark
aardvark
bird
dog
fish
fish
fish
</P>
<P ID=621>
aardvark
aardvark
bird
dog
fish
fish
fish
</P>
<P ID=5>
bird
egret
egret
</P>
<P ID=1>
bird
</P>
Документ очень "не в порядке" в том смысле, что идентификаторы не организованы.Мне нужно создать решение, которое проходит через каждый абзац (обозначается тегами <P ID = x></P>
, которые всегда будут там) и извлекать идентификационный номер.
Я использую NLTK
для токенизации абзацев, которыеотлично работает, моя проблема в том, что я не могу извлечь ID
из тега.
import nltk
from nltk.tokenize import word_tokenize, RegexpTokenizer
import re
def get_input(filepath):
f = open(filepath, 'r')
content = f.read()
return content
def main():
myfile = get_input("filepath")
p = r'<P ID=\d+>(.*?)</P>'
paras = RegexpTokenizer(p)
para_id = 0
for para in paras.tokenize(myfile):
para_id = re.match("<P ID=\d+>", para)
print("Current paragraph Number: {}".format(para_id))
main()
В результате:
Current paragraph Number: None
Current paragraph Number: None
Current paragraph Number: None
Current paragraph Number: None
Current paragraph Number: None
Current paragraph Number: None
Однако я ожидаю, что это будет выглядеть так:
Current paragraph Number: 912
Current paragraph Number: 5
Current paragraph Number: 291
Current paragraph Number: 621
Current paragraph Number: 5
Current paragraph Number: 1
Как мне нужно изменить: para_id = re.match("<P ID=\d+>", para)
Редактировать: Я также пытался: para_id = [i['id'] for i in soup(para, 'html.parser').find_all('p')]
, но это дает пустое []
Я неконечно, почему я не могу создать суп из единственного абзаца
NB - я должен упомянуть, что это минимальный пример кода.Реальная программа намного больше и требует анализа NLTK, потому что я много работаю со стоп-словами и текстовыми токенизациями.