НЛП Получение наиболее распространенного POS-тега для слова и использование его в словаре с данными обучения - PullRequest
0 голосов
/ 15 октября 2018

У меня есть обучающий текстовый файл в следующем формате (pos, word, tag):

1 i PRP

2 'd MD

3, как VB

4 до

5 - VB

6.,

1 i PRP

Я пытаюсь построить словарь, чтобы при вводе нового корпуса в следующем формате (pos, word):

1 who

2 знает

3, что произойдет

4

5

6.

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

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

i PRP 7905

MD 1262

как VB 2706

как VBP 201

как UH 95

как IN 112

до 4822

до 922

Так что для слова "like",тег с наибольшим числом «VB» на 2706. Я хочу, чтобы мой словарь взял тег с наибольшим количеством и приложил его к моему слову, чтобы, если я добавлю тестовый набор данных только с (pos, word),он вернет этот тег.Вот мой код:

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

from collections import Counter, defaultdict
word_tag_counts = defaultdict(Counter)
for row in file:         
    if not row.strip():
        continue          
    pos, word, tag = row.split()
    word_tag_counts[word.lower()][tag] += 1

stats = word_tag_counts
max(stats, key=stats.get)

with open('/Users/Desktop/training.txt','r') as file:
    for line in file.readlines():
        column = line.split('\t') 
with open('/Users/Desktop/output.txt','w') as file: 
    for tag, num in d.items(): 
        file.write("\t".join([column[0], column[1], tag])+"\n")

Я получаю сообщение об ошибке: TypeError: '>' не поддерживается между экземплярами 'Counter' и 'Counter'

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

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

1 Ответ

0 голосов
/ 15 октября 2018

Если я правильно понимаю, то, чего вы хотели бы достичь сейчас, - это иметь dict, отображающий строчную форму каждого слова в его наиболее частый POS-тег.В stats указано, сколько раз каждый POS-тег каждого слова появлялся в обучающих данных, хранящихся в Counter.

. В строке max(stats, key=stats.get) вы делаете это неправильно.stats.get(word) возвращает Counter, относящееся к слову word, а Counter s несопоставимы в Python 3 (однако они есть в Python 2, но на самом деле это не имеет смысла).Более того, даже если Counter s сопоставимы, функция max будет просто возвращать слово с максимальным значением Counter, а это не то, что вам нужно.

Что нам нужно сделать, так этоиспользовать most_common() метод Counter с.Для каждого слова word, get() его Counter (назовем его c) и вызовем c.most_common(1)[0][0], чтобы получить его наиболее частый POS-тег.Причина, по которой нам нужны подписки [0][0], заключается в том, что most_common(k) возвращает список наиболее часто встречающихся элементов k, и для каждого такого элемента он возвращает кортеж, содержащий сам элемент и его частоту.Таким образом, код будет выглядеть так:

pos_tags = {word: stats[word].most_common(1)[0][0] for word in stats}

И pos_tags - это желаемое отображение.Все, что вам нужно сделать, это закончить оставшуюся часть кода (который применяет этот метод маркировки POS к другим файлам).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...