Создание матрицы частот термина из Dataframe Python - PullRequest
1 голос
/ 12 марта 2019

Я делаю некоторую обработку естественного языка на некоторых данных твиттера.Поэтому мне удалось успешно загрузить и очистить некоторые твиты и поместить их в кадр данных ниже.

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  

1 Ответ

1 голос
/ 12 марта 2019

Вероятно, не оптимально при итерации по каждой строке, но работает.Размер мили может варьироваться в зависимости от длины твитов и количества обрабатываемых твитов.

import pandas as pd
from collections import Counter

# example df
df = pd.DataFrame()
df['tweets'] = [['test','xd'],['hehe','xd'],['sam','xd','xd']]

# result dataframe
df2 = pd.DataFrame()
for i, row in df.iterrows():
    df2 = df2.append(pd.DataFrame.from_dict(Counter(row.tweets), orient='index').transpose())
...