Создайте код на Python, чтобы получить наиболее частую пару тегов и значений из списка - PullRequest
0 голосов
/ 28 сентября 2018

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

Пример файла txt:

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 ]

0 голосов
/ 28 сентября 2018

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

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"]

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

0 голосов
/ 28 сентября 2018

Вы должны иметь отдельный 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
...