Проблема со стоп-словами Python / NLTK и записью файлов - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь записать в файл список стоп-слов из NLTK.

Итак, я написал этот скрипт:

import nltk
from nltk.corpus import stopwords
from string import punctuation

file_name = 'OUTPUT.CSV'
file = open(file_name, 'w+')  
_stopwords = set(stopwords.words('english')+list(punctuation)) 
i = 0
file.write(f'\n\nSTOP WORDS:+++\n\n')
for w in _stopwords:
    i=i+1
    out1 = f'{i:3}. {w}\n'
    out2 = f'{w}\n'
    out3 = f'{i:3}. {w}'
    file.write(out2)
    print(out3)

file.close()

Оригинальная программа использовала file.write(w), но, поскольку у меня возникли проблемы, я начал что-то пробовать.

Итак, я попытался использовать file.write(out1). Это работает, но порядок стоп-слов кажется случайным.

Что интересно, если я использую file.write(out2), я пишу только случайное количество стоп-слов, которые появляются в произвольном порядке, всегда меньше 211. У меня одна и та же проблема как в Visual Studio 2017, так и в Jupyter Notebook ,

Например, последний прогон написал 175 слов, оканчивающихся на:

its
wouldn
shan 

Используя file.write(out1), я получаю все 211 слов, и столбец заканчивается следующим образом:

209. more
210. have
211. ,

Кто-нибудь сталкивался с подобной проблемой. Есть идеи о том, что может происходить?

Я новичок в Python / NLTK, поэтому я решил спросить.

1 Ответ

0 голосов
/ 27 января 2019

Причина, по которой вы получаете случайный порядок стоп-слов, заключается в использовании set.

_stopwords = set(stopwords.words('english')+list(punctuation)) 

Набор представляет собой неупорядоченную коллекцию без повторяющихся элементов.Подробнее здесь .

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

Вы можете использовать этот простой пример, чтобы проверить это:

test = set('abcd')
for i in test: 
    print(i) 

Он выводит другой порядок (например, я пробовал в двух разных системах, это то, что я получил): На Istsystem

a
d
b
c

и во второй системе

d
c
a
b

Существуют и другие альтернативы для упорядоченных наборов.Отметьте здесь .


Кроме того, я проверил, что все три out1, out2 и out3 дают 211 стоп-слов.

...