Наиболее распространенные предложения извлечения с подсчетом с использованием Python
Я хочу написать скрипт Python, который ищет все строки Excel и возвращает 10 самых распространенных предложений. Я написал основы ngrams для текстового файла.
Файл содержит текст CSV с DJ лучше 4 раза, а GD 3 раза.
import nltk
import pandas as pd
file = open('dj.txt', encoding="utf8")
text= file.read()
length = [3]
ngrams_count = {}
for n in length:
ngrams = tuple(nltk.ngrams(text.split(' '), n=n))
ngrams_count.update({' '.join(i) : ngrams.count(i) for i in ngrams})
ngrams_count
df = pd.DataFrame(list(zip(ngrams_count, ngrams_count.values())),
columns=['Ngramm', 'Count']).sort_values(['Count'],
ascending=False)
df
Выход -
Ngramm Count
1 is best,dj is 4
3 is cool,gd is 2
21 is best,gd is 2
25 best,dj is Best,dj 1
19 not cool,dj is 1
20 cool,dj is best,gd 1
22 best,gd is cool,dj 1
23 is cool,dj is 1
24 cool,dj is best,dj 1
0 dj is best,dj 1
18 is not cool,dj 1
27 Best,dj is best,dj 1
28 best,dj is best,dj 1
29 best,dj is best,gd 1
30 best,gd is cool,gd 1
31 cool,gd is COOL,gd 1
32 is COOL,gd is 1
26 is Best,dj is 1
17 good,dj is not 1
16 not good,dj is 1
15 is not good,dj 1
14 better,dj is not 1
13 is better,dj is 1
12 good,sandeep is better,dj 1
11 is good,sandeep is 1
10 excellent,prem is good,sandeep 1
9 is excellent,prem is 1
8 superb,sandeep is excellent,prem 1
7 is superb,sandeep is 1
6 best,prem is superb,sandeep 1
5 is best,prem is 1
4 cool,gd is best,prem 1
2 best,dj is cool,gd 1
33 COOL,gd is cool 1
Итак, во-первых, он показывает 2 для GD это круто, я не могу понять, почему?.. а затем я хочу отсортировать этот вывод так, чтобы он показал что-то вроде этого
Ngramm Count
dj is cool 4
gd is cool 3
....and so on....
И тогда я хочу, чтобы это делалось для файла Excel строка за строкой.
Я действительно новичок в этом, кто-нибудь может указать мне в правильном направлении?
2 ответа
Как вы видете, text.split(' ')
не разделяется на знаки препинания, как запятые.
Быстрое и грязное исправление для этих конкретных данных (где единственная пунктуация появляется, кажется, запятые, и ни одна из них не отслеживается пробелами) может быть запись.
text.replace(',',' ').split(' ')
>>> "a b,c".split(' ') ['a', 'b,c'] # <--- 2 elements >>> "a b,c".replace(',',' ').split(' ') ['a', 'b', 'c'] # <--- 3 elements
В долгосрочной перспективе вы можете захотеть узнать о регулярных выражениях, что может быть болезненным, но для этого случая это просто:
>>> import re >>> re.split("[ ,]+","a b,c") ['a', 'b', 'c']
Поскольку это CSV-файл, сделайте себе одолжение и сначала проанализируйте CSV-файл! Затем возьмите содержимое и обработайте его так, как вы хотите. Но ваши данные, кажется, содержат одно "предложение" на ячейку, поэтому, если наша цель состоит в том, чтобы найти наиболее распространенное предложение, почему вы бросаете токенизацию и ngrams в этой задаче?
import csv
from collections import Counter
with open('dj.txt', encoding="utf8") as handle:
sentcounts = Counter(cell for row in csv.reader(handle) for cell in row)
print("Frequency Sentence")
for sent, freq in sentcounts.most_common(5):
print("%9d"%freq, sent)
Если вы хотите токены, вы можете просто использовать split()
в этом простом случае, но для более реалистичного использования текста nltk.word_tokenize()
, который знает все о пунктуации.