Есть ли эффективный способ создать словарь наиболее часто встречающихся слов из списка предложений?

#python #nlp #nltk

#python #nlp #nltk

Вопрос:

Я выяснил, как использовать схему tfidf для отслеживания распределения слов по документу. Тем не менее, я хочу создать словарь наиболее частых и наименее частых слов для списка предложений.

Вот некоторая часть предварительной обработки текста:

 print(my.df) -> 
(17298, 2)

print(df.columns) ->
Index(['screen_name', 'text'], dtype='object')



txt = re.sub(r"[^ws]","",txt)
txt = re.sub(r"@([A-Z-a-z0-9_] )", "", txt)
tokens = nltk.word_tokenize(txt)
token_lemmetized = [lemmatizer.lemmatize(token).lower() for token in tokens]
df['text'] = df['text'].apply(lambda x: process(x))
  

тогда это моя вторая попытка:

 import nltk
nltk.download('stopwords')
from nltk.corpus import stopwords
import string
stop = set(stopwords.words('english'))

df['text'] = df['text'].apply(lambda x: [item for item in x if item not in stop])

all_words = list(chain.from_iterable(df['text']))
for i in all_words:
    x=Counter(df['text'][i])
    res= [word for word, count in x.items() if count == 1]
    print(res)
  

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

примеры фрагментов данных :

вот данные, которые я использовал, и файл можно безопасно найти здесь: пример данных

пример ввода и вывода:

InputList = {«RT @GOPconvention: #Oregon голосует сегодня. Это означает 62 дня до @GOPconvention!», «RT @DWStweets: Выбор на 2016 год очевиден: нам нужен еще один демократ в Белом доме. #DemDebate #WeAreDemocrats «, «Трамп призывает к снижению налогов на триллион долларов для Уолл-стрит»., От городского совета Чатема до Конгресса, @RepRobertHurt оставил заметный след в своем сообществе. Горжусь нашей совместной работой от имени VA!}

пример вывода токенов

 ['rt', 'gopconvention', 'oregon', 'vote', 'today', 'that', 'mean', '62', 'day', 'until', 'gopconvention', 'http', 't', 'co', 'ooh9fvb7qs']
  

вывод:

Я хочу создать словарь для наиболее частых слов и наименее частых слов из предоставленных данных. есть идея, как это сделать? Спасибо

Комментарии:

1. Если у вас есть списки слов, вы можете использовать collections.Counter() , чтобы получить наиболее и наименее распространенные

2. @G.Anderson спасибо, не могли бы вы дать свой полный ответ, если это возможно?

3. Прежде всего, я прошу прощения, похоже, вы уже используете счетчик, хотя я не вижу импорта. Вместо того, чтобы перебирать ваши слова и выполнять поиск в столбце df, вы могли бы просто использовать c=Counter(all_words) , а затем получить доступ к методам в нем с помощью c.most_common()`. Для получения более конкретной справки было бы полезно увидеть пример ввода и вывода в вашем вопросе

4. @G.Anderson Я обновил свой пост, также вы можете безопасно просмотреть фрагмент примера данных. Есть какое-либо конкретное решение?

Ответ №1:

collections.Counter() могу сделать это за вас. Я не смог добраться до вашей ссылки на данные, но скопировав и вставив текст, который вы опубликовали в качестве примера, вот как это можно сделать:

 >>> import collections
>>> s = "in above approach I want to create most frequent and least frequent 
words from list of sentences, but my attempt didn't produce that outuput?
what should I do? any elegant way to make this happen? any idea? can anyone 
give me possible idea to make this happen? Thanks"
>>> c = dict(collections.Counter(s.split()))
>>> c
{'in': 1, 'above': 1, 'approach': 1, 'I': 2, 'want': 1, 'to': 3, 'create': 1, 
'most': 1, 'frequent': 2, 'and': 1, 'least': 1, 'words': 1, 'from': 1,
 'list': 1, 'of': 1, 'sentences,': 1, 'but': 1, 'my': 1, 'attempt': 1, 
 "didn't": 1, 'produce': 1, 'that': 1, 'outuput?': 1, 'what': 1, 'should': 1, 
 'do?': 1, 'any': 2, 'elegant': 1, 'way': 1, 'make': 2, 'this': 2, 'happen?': 
2, 'idea?': 1, 'can': 1, 'anyone': 1, 'give': 1, 'me': 1, 'possible': 1, 
'idea': 1, 'Thanks': 1}
>>> maxval = max(c.values())
>>> print([word for word in c if c[word] == maxval])
['to']
  

Сначала вы захотите убрать знаки препинания и тому подобное; в противном случае, например, happen и happen? будут считаться двумя разными словами. Но вы заметите, что c вот словарь, где ключами являются слова, а значениями — сколько раз слово встречается в строке.

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

 from collections import Counter
import re

fakenews = ["RT @GOPconvention: #Oregon votes today. That means 62 days until the @GOPconvention!",
            "RT @DWStweets: The choice for 2016 is clear: We need another Democrat in the White House. #DemDebate #WeAreDemocrats ",
            "Trump's calling for trillion dollar tax cuts for Wall Street.",
            "From Chatham Town Council to Congress, @RepRobertHurt has made a strong mark on his community. Proud of our work together on behalf of VA!"]

big_dict = {}

for tweet in fakenews:
    # Strip out any non-alphanumeric, non-whitespaces
    pattern = re.compile('([^sw]|_) ')
    tweet_simplified = pattern.sub('', tweet).lower()

    # Get the word count for this Tweet, then add it to the main dictionary
    word_count = dict(Counter(tweet_simplified.split()))
    for word in word_count:
        if word in big_dict:
            big_dict[word]  = word_count[word]
        else:
            big_dict[word] = word_count[word]

# Start with the most frequently used words, and count down.
maxval = max(big_dict.values())
print("Word frequency:")
for i in range(maxval,0,-1):
    words = [w for w in big_dict if big_dict[w] == i]
    print("%d - %s" % (i, ', '.join(words)))
  

Вывод:

 Word frequency:
3 - the, for
2 - rt, gopconvention, on, of
1 - oregon, votes, today, that, means, 62, days, until, dwstweets, choice, 2016, is, clear, we, need, another, democrat, in, white, house, demdebate, wearedemocrats, trumps, calling, trillion, dollar, tax, cuts, wall, street, from, chatham, town, council, to, congress, reproberthurt, has, made, a, strong, mark, his, community, proud, our, work, together, behalf, va
  

Комментарии:

1. Как я уже сказал, я не смог получить доступ к вашей ссылке.

2. можете ли вы попробовать эту суть: данные ? как я могу подобрать слова, которые встречались один или два раза вместо этого? Спасибо

3. Привет, извините, у меня эта ошибка, AttributeError: 'int' object has no attribute 'split' когда я продолжаю маркировать и лемматизировать твиты fakenews (например, то, что я сделал в своем посте), как ваше решение работает для токенов во вложенном списке? не могли бы вы указать мне на основе моей первоначальной попытки? потому что мой ввод — это список токенов. Спасибо за вашу любезную помощь.

4. «разделение» работает только со строками, поэтому убедитесь, что все в вашем исходном списке на самом деле является строкой. Если нет, добавьте такую команду, как tweet = str(tweet) прямо внутри for цикла, прежде чем начать ее использовать. И, как и все списки в Python, ваш список текстов твитов должен быть заключен в парные скобки, а не фигурные скобки. Фигурные скобки используются для словарей и наборов Python, а не для списков.