Как я могу считать tfidf с Bigram? - PullRequest
1 голос
/ 26 апреля 2020

Здесь у меня есть фрейм данных с именем tweetRV.csv с 3 столбцами (твиты, стоп-слова и группы). И я использую только столбец с именем (Stopword) для TFIDF, и мне удалось получить результат с кодом ниже. Мне удалось отделить текст в Unigram, а затем подсчитать TFIDF, как показано ниже:

import pandas as pd
import numpy as np
from math import log

def idf(doc, wordBank):
N = len(doc.index)
result = pd.DataFrame(columns=['word', 'idf'])
for index, word in wordBank.iterrows():
  dft = np.sum(doc.str.contains(word['words']))
  idft = log(N / (dft + 1), 10)
  result = result.append(pd.Series([word['words'],  idft], index=['word', 'idf']), ignore_index=True)
return result
def tf(doc, wordBank):
wordList = doc.str.split(' ')
maxFt = [len(s)  for s in wordList]
result = pd.DataFrame()
for index, word in wordBank.iterrows():
  ft = np.add([s.count(word['words']) for s in wordList], 0)
  ftd = 1 + np.log10(ft + 1e-15)
  result = result.append(pd.Series(ftd), ignore_index=True)
result = result.replace(-np.inf, 0)
return result

def tfIdf(tf, idf):
result = pd.DataFrame()
for i in tf:
  tfIdf = tf[i] * idf['idf']
  result = result.append(pd.Series(tfIdf), ignore_index=True)
return result

print('Run it?')
print('Input (Y/N)')
option = input()
print('\n')

if(option == 'Y'):
print('Running...')
print('\n')
text = ""
df_csv = pd.read_csv('tweetRV.csv', encoding='utf-8')

for index, row in df_csv.iterrows():
text += row['Stopword'].replace('[','').replace("'","").replace(",","").replace("]"," ")

data = {'sentences':(text)}
doc = pd.DataFrame([data])

text = ""
itemText = []

df_csv = pd.read_csv('tweetRV.csv', encoding='utf-8')

for index, row in df_csv.iterrows():
text += row['Stopword'].replace('[','').replace("'","").replace(",","").replace("]"," ")

listText = list(text.split(' '))
del listText[-1]

for item in listText:
if item in itemText:
  pass
else:
  itemText.append(item)

data = {'words':itemText}
vocabulary = pd.DataFrame(data=data)

doc = doc['sentences']

resultIDF = idf(doc, vocabulary)
resultTF = tf(doc, vocabulary)

resultTfIdf = tfIdf(resultTF, resultIDF)
resultTfIdf.columns = itemText
resultTfIdf = resultTfIdf.transpose()

print(resultTfIdf)
resultTfIdf.to_csv('result.csv', encoding='utf-8')
else:
print('Closing...')

со словом в столбце «Стоп-слово» уже размечено следующим образом:

Stopword
['red', 'velvet', 'seulgi', 'tells', 'sasaengs', 'stop', 'calling', 'live', 'instagram', 'broadcast']
['producers', 'red', 'velvet', 'psycho', 'reveal', 'song', 'addictive']
['red', 'velvet', 'voice', 'characters', 'dreamwork', 'trolls']

С TFIDF результат, подобный этому, в виде файла CSV

word     tfidf
red      -0.936380807003807
velvet   -0.933304531753474
wendy    -0.754125287111263
joy      -0.726979416468285
irene    -0.726979416468285

, но теперь я хочу заменить Unigram на Bigram, чтобы сделать TFIDF. Я хочу отделить текст в биграмме, а затем сосчитать TFIDF. Является ли это возможным? Кто-нибудь здесь может помочь мне с кодом? спасибо

...