2015-08-13 3 views
0

У меня есть эта функция, и я попытался немного ее изменить для своей цели , но вместо того, чтобы получать bigrams, я получаю униграммы. что мне нужно добавить или изменить? Я действительно новый с питоном и NLTKBigrams and .Join

import nltk 
from nltk.corpus import stopwords 
from nltk.stem import PorterStemmer 
from nltk.tokenize import WordPunctTokenizer 
from nltk.collocations import BigramCollocationFinder 
from nltk.metrics import BigramAssocMeasures 
import re 


def get_bigrams(myString): 
tokenizer = WordPunctTokenizer() 
tokens = tokenizer.tokenize(myString) 

bigram_finder = BigramCollocationFinder.from_words(tokens) 
bigrams = bigram_finder.nbest(BigramAssocMeasures.chi_sq, 500) 

for bigram_tuple in bigrams: 
    x = "%s %s" % bigram_tuple 
    tokens.append(x) 

result = [x for x in tokens if x not in stopwords.words('english') and len(x) > 3] 
return result 


filename = raw_input('Enter File Name :') 
word_list = re.split('\s+', file(filename).read().lower()) 


f=open ('test2.csv', 'w') 


for line in word_list: 
     features = get_bigrams(line) 
     print features 
     f.write(str(line)) 
     f.write("\n") 

передать выходные данные для exmple «Это было давно»

It 
has 
been 
a 
long 
time 

Но я ищу что-то вроде

It has 
has been 
been a 
a long 
long time 
+0

Я имею в виду «Это было давно», как [это, уже, было, а, долго, время] вместо [он был, был, долгое, долгое время] – Cynthia

ответ

1

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

Следующая строка дает вам список слов (как следует из названия)

word_list = re.split('\s+', file(filename).read().lower()) 

но позже вы обрабатываете каждое отдельное слово в строке:

for line in word_list: 

Это просто означает, что ваш код может просто не работать.

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

filename = raw_input('Enter File Name :') 
lines = file(filename).readlines() 

f = open('test2.csv', 'w') 

for line in lines: 
    features = get_bigrams(line) 
    # do more things 
1

Nltk кажется излишним. Почему бы не просто сделать:

def pairs(seq): 
    return zip(seq, seq[1:]) 

s = "It has been a long time" 
words = s.split() 
for bigram in pairs(words): 
    print bigram 

Результат:

('It', 'has') 
('has', 'been') 
('been', 'a') 
('a', 'long') 
('long', 'time') 
0

Ваша функция get_bigrams, кажется, работает для меня, так что я думаю, что проблема является файл или как вы его прочитать. Кстати, Id хотел предложить более короткий код для get_bigrams:

import nltk 

def get_bigrams(sentence): 
    tokens = nltk.word_tokenize(sentence) 
    return zip(tokens, tokens[1:]) 

Использование:

>>> [' '.join(b) for b in get_bigrams("It has been a long time")] 
['It has', 'has been', 'been a', 'a long', 'long time']