Я делаю некоторую обработку естественного языка на некоторых данных твиттера.Поэтому мне удалось успешно загрузить и очистить некоторые твиты и поместить их в кадр данных ниже.
id text
1104159474368024599 repmiketurner the only time that michael cohen told the truth is when he pled that he is guilty also when he said no collusion and i did not tell him to lie
1104155456019357703 rt msnbc president trump and first lady melania trump view memorial crosses for the 23 people killed in the alabama tornadoes t
Проблема заключается в том, что я пытаюсь построить матрицу частотных терминов, где каждая строка представляет собой твит, а каждая -столбец - это значение, в котором упомянутое слово встречается для конкретной строки.Моя единственная проблема заключается в том, что в другом посте упоминаются термины распределения текстовых файлов.Вот код, который я использовал для генерации фрейма данных выше
import nltk.classify
from nltk.tokenize import word_tokenize
from nltk.tokenize import wordpunct_tokenize
from nltk.corpus import stopwords
from nltk.probability import FreqDist
df_tweetText = df_tweet
#Makes a dataframe of just the text and ID to make it easier to tokenize
df_tweetText = pd.DataFrame(df_tweetText['text'].str.replace(r'[^\w\s]+', '').str.lower())
#Removing Stop words
#nltk.download('stopwords')
stop = stopwords.words('english')
#df_tweetText['text'] = df_tweetText.apply(lambda x: [item for item in x if item not in stop])
#Remove the https linkes
df_tweetText['text'] = df_tweetText['text'].replace("[https]+[a-zA-Z0-9]{14}",'',regex=True, inplace=False)
#Tokenize the words
df_tweetText
Сначала я попытался использовать функцию word_dist = nltk.FreqDist (df_tweetText ['text'])) , но этозакончил бы подсчет значения всего предложения вместо каждого слова в строке.
Еще одна вещь, которую я пробовал, состояла в том, чтобы токенизировать каждое слово с помощью df_tweetText ['text'] = df_tweetText ['text']. Apply (word_tokenize) , затем вызвать FeqDist еще раз, но это дает мне ошибку, говорящую unhashable type: 'list' .
1104159474368024599 [repmiketurner, the, only, time, that, michael, cohen, told, the, truth, is, when, he, pled, that, he, is, guilty, also, when, he, said, no, collusion, and, i, did, not, tell, him, to, lie]
1104155456019357703 [rt, msnbc, president, trump, and, first, lady, melania, trump, view, memorial, crosses, for, the, 23, people, killed, in, the, alabama, tornadoes, t]
Есть ли какой-нибудь альтернативный способ попытаться построить этот термин частотная матрица?В идеале я хочу, чтобы мои данные выглядели примерно так
id |collusion | president |
------------------------------------------
1104159474368024599 | 1 | 0 |
1104155456019357703 | 0 | 2 |
РЕДАКТИРОВАТЬ 1: Поэтому я решил взглянуть на библиотеку textmining и воссоздать один из их примеров.Единственная проблема заключается в том, что он создает матрицу срочных документов с одной строкой каждого твита.
import textmining
#Creates Term Matrix
tweetDocumentmatrix = textmining.TermDocumentMatrix()
for column in df_tweetText:
tweetDocumentmatrix.add_doc(df_tweetText['text'].to_string(index=False))
# print(df_tweetText['text'].to_string(index=False))
for row in tweetDocumentmatrix.rows(cutoff=1):
print(row)
EDIT2: Итак, я попробовал SKlearn, но этот метод работал, но проблема в том, что я нахожу китайский / японскийсимволы в моих столбцах, которые не должны существовать.Кроме того, мои столбцы почему-то отображаются в виде чисел
from sklearn.feature_extraction.text import CountVectorizer
corpus = df_tweetText['text'].tolist()
vec = CountVectorizer()
X = vec.fit_transform(corpus)
df = pd.DataFrame(X.toarray(), columns=vec.get_feature_names())
print(df)
00 007cigarjoe 08 10 100 1000 10000 100000 1000000 10000000 \
0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0 0