2016-09-19 3 views
0

У меня есть файл, который состоит из многих персидских предложений. каждая строка содержит предложение, затем «вкладку», затем слово, снова «вкладку», а затем английское слово. Я должен знать только количество уникальных слов предложений (слова после вкладок не должны вычисляться). Для этого я изменил файл на список, поэтому у меня есть список, который содержит много строк, и каждая строка содержит три индекса; предложение, персидское слово, английское слово. Теперь я могу выполнить предложения. Проблема в том, что код, который я написал, возвращает количество уникальных слов каждой строки отдельно. Например, если файл имеет 100 строк, он возвращает 100 номеров, каждый в новой строке. Но я хочу суммировать все числа и иметь только одно число, которое показывает общее количество уникальных слов. Как я могу изменить код?вычислить общее количество уникальных слов первого столбца списка

from hazm import* 

def WordsProbs (file): 
    with open (file, encoding = "utf-8") as f1: 
     normalizer = Normalizer() 
     for line in f1: 
     tmp = line.strip().split("\t") 
     tmp[0] = normalizer.normalize(tmp[0]) 
     corpus.append(tmp) 
    for row in corpus: 
     UniqueWords = len(set(row[0].split())) 
     print (UniqueWords) 

Выборочные данные:

باد بارش برف وزش باد, کولاک یخبندان سطح ветер

+0

Вы применяете «нормализатор» только к предложению? – Kasramvd

+0

да. потому что я извлек их из более крупного корпуса. Но я сам пометил слова после вкладок. поэтому просто предложения требуют нормализации – Vahideh

+0

Итак, еще один вопрос: неужели этот модуль имеет функцию 'word_tokenizer'? Как NLTK – Kasramvd

ответ

0

Предполагая TMP [0] содержит фразу из каждой строки, отдельные слова в предложении могут быть подсчитаны без создания корпуса.

from hazm import* 

def WordsProbs (file): 
    words = set() 
    with open (file, encoding = "utf-8") as f1: 
     normalizer = Normalizer() 
     for line in f1: 
      tmp = line.strip().split("\t") 
      words.update(set(normalizer.normalize(tmp[0].split()))) 
    print(len(words), "unique words") 

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

+0

Я знаю, что необходимо разделить tmp [0], но когда я запускаю код, возникает ошибка ниже. Как это исправить? – Vahideh

+0

AttributeError: объект 'list' не имеет атрибута 'translate' >>> – Vahideh

+0

https://www.dropbox.com/s/r88hglemg7aot0w/F.txt?dl=0 – Vahideh

1

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

sample_data = """This is One sentence word1 word2 
This is Second sentence word1 word2""" 
lines = sample_data.split("\n") 
word_list = [] 
for line in lines: 
    line = line.split("\t")[0] 
    word_list.extend(line.split(" ")) 
print len(set(word_list)) 
+0

AttributeError: объект 'list' не имеет атрибута 'split'. Эта ошибка возникает – Vahideh

+0

Список не имеет разбитого объекта, но если ваши данные, как вы описали, должны быть строковыми. –

+0

'len (set (word_list))' будет возвращать только количество наборов, содержащих уникальные слова в каждой строке, и это не то, что планирует OP. – Kasramvd

0

Вам использовать collections.Counter для того, чтобы подсчитать количество слов, после расщепления:

from collections import Counter 
from itertools import chain 

def WordsProbs (file_name): 
    with open (file_name, encoding = "utf-8") as f1: 
     all_words = chain.from_iterable(word_tokenizer(line.split(None, 1)[0]) for line in f1) 
     return Counter(all_words) 

chain.from_iterable будет ЦЕПЬ расщепленные слова вместе, как интегрированный итератор, так что Counter может создавать встречный объект из всех слов.

Если вы просто хотите, количество всех уникальных слов len(WordsProbs(file_name)) даст вам, что, но другой способ использует набор итератора, который мы создали с cahin.from_iterable:

def WordsProbs (file_name): 
    with open (file_name, encoding = "utf-8") as f1: 
     all_words = chain.from_iterable(word_tokenizer(line.split(None, 1)[0]) for line in f1) 
     return len(set(all_words)) 

И если вы хотите, количество уникальные слова для каждой строки:

def WordsProbs (file_name): 
    with open (file_name, encoding = "utf-8") as f1: 
     each_line_numbers = [len(set(word_tokenizer(line.split(None, 1)[0]))) for line in f1) 
     return each_line_numbers 
+0

Спасибо, но эта ошибка возникает: NameError: имя 'строка' не определено – Vahideh

+0

@suneye Была простая опечатка, попробуйте сейчас. – Kasramvd

+0

Ну, он возвращает: Counter ({'باد': 1, 'غرقش': 1, 'کاش': 1, 'مناطق': 1, 'حیف': 1, 'کار': 1, 'افزایش': 1, 'پایان': 1, 'تهران': 1, 'مجبورم': 1, 'الان': 1, 'رطوبتهای': 1, – Vahideh

Смежные вопросы