Создайте код на Python, чтобы получить наиболее частую пару тегов и значений из списка

У меня есть файл.txt с 3 столбцами: положение слова, слово и тег (NN, VB, JJ и т. Д.).

Пример текстового файла:

1   i   PRP

2   want    VBP

3   to  TO

4   go  VB

Я хочу найти частоту слова и тега как пары в списке, чтобы найти наиболее часто назначаемый тег для слова. Пример результатов: 3 (еда, NN), 2 (храбрый, ADJ)

Моя идея состоит в том, чтобы начать с открытия файла из папки, прочитать файл построчно и разделить, установить счетчик, используя словарь, и печатать с наиболее распространенными или необычными в порядке убывания.

Мой код очень грубый (я почти стесняюсь его опубликовать):

file=open("/Users/Desktop/Folder1/trained.txt")
wordcount={}
for word in file.read().split():
    from collections import Counter
    c = Counter()
    for d in dicts.values():
        c += Counter(d)

print(c.most_common())

file.close()

Очевидно, я не получаю результатов. Все поможет. Благодарю.

ОБНОВИТЬ:

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

file=open("/Users/Desktop/Folder1/trained.txt").read().split('\n')

d = {}
for i in file:
    if i[1:] in d.keys():
        d[i[1:]] += 1
    else:
        d[i[1:]] = 1

print (sorted(d.items(), key=lambda x: x[1], reverse=True))

вот мои результаты:

[('', 15866), ('\t.\t.', 9479), ('\ti\tPRP', 7234), ('\tto\tTO', 4329), ('\tlike\tVB', 2533), ('\tabout\tIN', 2518), ('\tthe\tDT', 2389), ('\tfood\tNN', 2092), ('\ta\tDT', 2053), ('\tme\tPRP', 1870), ('\twant\tVBP', 1713), ('\twould\tMD', 1507), ('0\t.\t.', 1427), ('\teat\tVB', 1390), ('\trestaurant\tNN', 1371), ('\tuh\tUH', 1356), ('1\t.\t.', 1265), ('\ton\tIN', 1237), ("\t'd\tMD", 1221), ('\tyou\tPRP', 1145), ('\thave\tVB', 1127), ('\tis\tVBZ', 1098), ('\ttell\tVB', 1030), ('\tfor\tIN', 987), ('\tdollars\tNNS', 959), ('\tdo\tVBP', 956), ('\tgo\tVB', 931), ('2\t.\t.', 912), ('\trestaurants\tNNS', 899),

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

2 ответа

Решение

Вам нужно иметь отдельный collections.Counter за каждое слово. Этот код использует defaultdict создать словарь счетчиков, не проверяя каждое слово, чтобы увидеть, если оно известно.

from collections import Counter, defaultdict

counts = defaultdict(Counter)
for row in file:           # read one line into `row`
    if not row.strip():
        continue           # ignore empty lines
    pos, word, tag = row.split()
    counts[word.lower()][tag] += 1

Вот и все, теперь вы можете проверить самый распространенный тег любого слова:

print(counts["food"].most_common(1))
# Prints [("NN", 3)] or whatever

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

import pandas as pd
df = pd.read_csv("/Users/Desktop/Folder1/trained.txt", sep=" ", header=None, names=["position", "word", "tag"])
df["word_tag_counts"] = df.groupby(["word", "tag"]).transform("count")

Тогда, если вы хотите, чтобы максимум из каждой группы вы могли сделать:

df.groupby(["word", "tag"]).max()["word_tag_counts"]

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

Другие вопросы по тегам