Анализ текста: поиск наиболее распространенного слова в столбце с использованием Python - PullRequest
0 голосов
/ 26 сентября 2019

Я создал фрейм данных только с колонкой с темой.

df = activities.filter(['Subject'],axis=1)
df.shape

Это вернуло этот фрейм данных:

    Subject
0   Call Out: Quadria Capital - May Lo, VP
1   Call Out: Revelstoke - Anthony Hayes (Sr Assoc...
2   Columbia Partners: WW Worked (Not Sure Will Ev...
3   Meeting, Sophie, CFO, CDC Investment
4   Prospecting

Затем я попытался проанализировать текст с этим кодом:

import nltk
top_N = 50
txt = df.Subject.str.lower().str.replace(r'\|', ' ')
words = nltk.tokenize.word_tokenize(txt)
word_dist = nltk.FreqDist(words)

stopwords = nltk.corpus.stopwords.words('english')
words_except_stop_dist = nltk.FreqDist(w for w in words if w not in stopwords) 

rslt = pd.DataFrame(word_dist.most_common(top_N), columns=['Word', 'Frequency'])
print(rslt)

Я получаю сообщение об ошибке: у объекта 'Series' нет атрибута 'Subject'

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Данные:

Subject
"Call Out: Quadria Capital - May Lo, VP"
Call Out: Revelstoke - Anthony Hayes (Sr Assoc...
Columbia Partners: WW Worked (Not Sure Will Ev...
"Meeting, Sophie, CFO, CDC Investment"
Prospecting

# read in the data
df = pd.read_clipboard(sep=',')

enter image description here

Обновленный код:

  • Преобразовать все слова в нижний регистр и удалить все небуквенно-цифровые символы
    • txt = df.Subject.str.lower().str.replace(r'\|', ' ') создает pandas.core.series.Series и будет заменен
  • words = nltk.tokenize.word_tokenize(txt), выбрасывает TypeError, поскольку txt является Series.
    • Следующий код маркирует каждую строку кадра данных
  • Маркируя слова, разбивает каждую строку на list.В этом примере при просмотре df будет показан столбец tok, где каждая строка представляет собой список
import nltk
import pandas as pd

top_N = 50

# replace all non-alphanumeric characters
df['sub_rep'] = df.Subject.str.lower().str.replace('\W', ' ')

# tokenize
df['tok'] = df.sub_rep.apply(nltk.tokenize.word_tokenize)

enter image description here

  • Чтобы проанализировать все слова в столбце, отдельные списки строк объединяются в один список, называемый words.
# all tokenized words to a list
words = df.tok.tolist()  # this is a list of lists
words = [word for list_ in words for word in list_]

# frequency distribution
word_dist = nltk.FreqDist(words)

# remove stopwords
stopwords = nltk.corpus.stopwords.words('english')
words_except_stop_dist = nltk.FreqDist(w for w in words if w not in stopwords)

# output the results
rslt = pd.DataFrame(word_dist.most_common(top_N), columns=['Word', 'Frequency'])

Выходные данные rslt:

        Word  Frequency
        call          2
         out          2
     quadria          1
     capital          1
         may          1
          lo          1
          vp          1
  revelstoke          1
     anthony          1
       hayes          1
          sr          1
       assoc          1
    columbia          1
    partners          1
          ww          1
      worked          1
         not          1
        sure          1
        will          1
          ev          1
     meeting          1
      sophie          1
         cfo          1
         cdc          1
  investment          1
 prospecting          1
1 голос
/ 26 сентября 2019

Ошибка выдается, потому что вы преобразовали df в Серию в этой строке:

df = activities.filter(['Subject'],axis=1)

Так что, когда вы говорите:

txt = df.Subject.str.lower().str.replace(r'\|', ' ')

df - это Серии ине имеет атрибута Series.Попробуйте заменить на:

txt = df.str.lower().str.replace(r'\|', ' ')

Или, в качестве альтернативы, не фильтруйте ваш DataFrame до одной серии раньше, и тогда

txt = df.Subject.str.lower().str.replace(r'\|', ' ')

должно работать.

[ОБНОВЛЕНИЕ]

То, что я сказал выше, неверно, так как указанный фильтр не возвращает Series, а скорее DataFrame с одним столбцом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...