Уберите .txt и посчитайте самые частые слова - PullRequest
0 голосов
/ 16 мая 2018

Мне нужно

1) Очистить .txt из списка стоп-слов, который у меня есть в отдельном .txt.

2) После этого мне нужно сосчитать 25 наиболее часто встречающихся слов.

Вот что я придумал для первой части:

#!/usr/bin/python
# -*- coding: iso-8859-15 -*-

import re
from collections import Counter

f=open("text_to_be_cleaned.txt")
txt=f.read()
with open("stopwords.txt") as f:
    stopwords = f.readlines()
stopwords = [x.strip() for x in stopwords]

querywords = txt.split()
resultwords  = [word for word in querywords if word.lower() not in stopwords]
cleantxt = ' '.join(resultwords)

Для второйчасть, я использую этот код:

words = re.findall(r'\w+', cleantxt)
lower_words = [word.lower() for word in words]
word_counts = Counter(lower_words).most_common(25)
top25 = word_counts[:25]

print top25

Исходный файл для очистки выглядит следующим образом:

(b)

ввторой абзац, первое предложение, слова «и Высокому представителю» вставляются в конце;во втором предложении слова «он проводит ежегодные прения» заменяют словами «дважды в год они проводят прения», а в конце слова «включая общую политику в области безопасности и обороны» *.1019 *

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

Когда я запускаю все это, каким-то образом выходные данные все еще содержат слова изсписок стоп-слов:
[(«статья», 911), («европейский», 586), («тот», 586), («совет», 569), («союз», 530),(«член», 377), («штаты», 282), («парламент», 244), («комиссия», 230), («соответствие», 217), («договор», 187), («в 174), («процедура», 161), («политика», 137), («сотрудничество», 136), («законодательный», 136), («действующий», 130), («акт»), 125), («исправлено», 125), («государство», 123), («положения», 115), («безопасность», 113), («меры», 111), («принять», 109), ('common', 108)]

Как вы, вероятно, можете сказать, я только начал изучать python, поэтому я был бы очень благодаренФул для простых объяснений!:)

Используемые файлы можно найти здесь:

Stopwordlist

Файл, подлежащий очистке

РЕДАКТИРОВАТЬ: Добавлены примеры для исходного файла, стоп-файл и выходной.Предоставлены исходные файлы

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Ваш код почти готов, основная ошибка в том, что вы запускаете регулярное выражение \w+, чтобы сгруппировать слова после , когда вы «очистили» слова, выданные str.split. Это не работает, потому что пунктуация все еще будет прикреплена к результату str.split. Попробуйте вместо этого следующий код.

import re
from collections import Counter

with open('treaty_of_lisbon.txt', encoding='utf8') as f:
    target_text = f.read()

with open('terrier-stopwords.txt', encoding='utf8') as f:
    stop_word_lines = f.readlines()

target_words = re.findall(r'[\w-]+', target_text.lower())
stop_words = set(map(str.strip, stop_word_lines))

interesting_words = [w for w in target_words if w not in stop_words]
interesting_word_counts = Counter(interesting_words)

print(interesting_word_counts.most_common(25))
0 голосов
/ 16 мая 2018

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

querywords = txt.split()

Вы просто разбиваете текст, что означает, что некоторые стоп-слова все еще могут быть приклеены к пунктуации и, следовательно, не являютсяфильтруется на следующем шаге.

>>> text = "Text containing stop words like a, the, and similar"
>>> stopwords = ["a", "the", "and"]
>>> querywords = text.split()
>>> cleantxt = ' '.join(w for w in querywords if w not in stopwords)
>>> cleantxt
'Text containing stop words like a, the, similar'

Вместо этого вы можете использовать re.findall, как вы это сделали позже в своем коде:

>>> querywords = re.findall(r"\w+", text)
>>> cleantxt = ' '.join(w for w in querywords if w not in stopwords)
>>> cleantxt
'Text containing stop words like similar'

Обратите внимание, однако, что это разделит составные словакак "re-arranged" в "re" и "arranged".Если это не то, что вам нужно, вы также можете использовать это, чтобы просто разделить пробелами, а затем обрезать (некоторые) знаки препинания (хотя в тексте их может быть больше):

querywords = [w.strip(" ,.-!?") for w in txt.split()]

Изменение только этогоСтрока, кажется, решает проблему с предоставленными вами входными файлами.

Остальное выглядит хорошо, хотя есть несколько незначительных моментов:

  • вы должны преобразовать stopwords в set так что поиск O (1) вместо O (n)
  • убедитесь, что lower стоп-слов, если они еще не
  • нет необходимости ' '.join очищенытекст, если вы хотите снова разделить его сразу после этого
  • top25 = word_counts[:25] является избыточным, список уже содержит не более 25 элементов
...