2016-10-18 8 views
1

Учитывая некоторый Penn Treebank тегов текста в следующем формате:Производства словаря многоуровневых от слова и заочного из речи

«Дэвид/ННП Short/ННП будет/MD стул/В.Б./DT встреча/NN. /./DT boy/NN сидит/VBZ на/IN в стуле/DT/NN ./. "

Я хотел бы создать многоуровневый словарь, в котором есть слово в качестве ключа, и подсчитывает частоту, помечаемую как каждый POS, поэтому у нас есть ['Chair, VB: 1, NN: 1', 'The, DT: 3 ',] и т. Д.

Я полагаю, что я могу использовать регулярные выражения для извлечения слова и соответствующего POS.

r'[A+Za+z]+/' and r'/[A+Z]+' 

Но не может решить, как это сделать, чтобы сделать запись для слова и соответствующих ему записей в POS.

Мысли?

ответ

2

В этом случае вам не нужно использовать регулярные выражения.

Что вы можете сделать, это разделить на пространстве, а затем слэш сбора результатов в defaultdict из defaultdict из int:

In [1]: import re 

In [2]: from collections import defaultdict 

In [3]: s = "David/NNP Short/NNP will/MD chair/VB the/DT meeting/NN ./. The/DT boy/NN sits/VBZ on/IN the/DT chair/NN 
    ...: ./." 

In [4]: d = defaultdict(lambda: defaultdict(int)) 

In [5]: for item in s.split(): 
    ...:  word, tag = item.split("/") 
    ...:  word = word.lower() 
    ...:  d[word][tag] += 1 

Теперь d будет:

In [6]: for word, word_data in d.items(): 
    ...:  for tag, count in word_data.items(): 
    ...:   print(word, tag, count) 
    ...:   
('boy', 'NN', 1) 
('short', 'NNP', 1) 
('on', 'IN', 1) 
('david', 'NNP', 1) 
('will', 'MD', 1) 
('sits', 'VBZ', 1) 
('chair', 'VB', 1) 
('chair', 'NN', 1) 
('.', '.', 2) 
('meeting', 'NN', 1) 
('the', 'DT', 3) 
+0

Это выглядит отличные решения - спасибо! Я бы хотел, чтобы это пропустило пунктуацию, чтобы я мог выполнить регулярное выражение, чтобы сделать это? Кроме того, при выполнении над файлом: – user1893110

+0

@ user1893110 да, вы все равно можете использовать регулярное выражение, чтобы получить слова и теги, а затем применить этот defaultdict части defaultdict. Благодарю. – alecxe

+0

для линии в INFILE: для маркеров в line.split(): слова, тег = token.split ("/") д [слово] [тег] + = 1 получает эту ошибку: слово, тег = token.split ("/") ValueError: слишком много значений для распаковки (ожидается 2) – user1893110