2015-07-10 2 views
1

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

в текстовый файл «детали» имеет следующие строки

My name is crazyguy 
i am studying in a college and i travel by car 
my brother brings me food for eating and we will go for shopping after food. 

он должен вернуть выход в

4 
10 #(since i is repeated) 
13 #(Since food and for are repeated) 

Если код работает, он будет работать так же, как для больших текстовых файлов в горной промышленности данные?

+0

Я бы предложил вам изучить NLTK, простой скрипт на python не будет эффективен при работе с более крупными файлами. – Leb

+0

Легко. Для каждой строки создайте контейнер. Токенизируйте линию (например, на основе пробелов) и выпустите каждый токен в набор. Затем подсчитайте количество элементов в этом наборе. – Santa

+2

@Leb - NTLK здесь не кажется необходимым. – TigerhawkT3

ответ

4

Вы можете использовать множество траверс через все линии расколоть, чтобы создать lsit и сделать его установить, чтобы найти уникальное значение и найти его подсчитывать

with open("filename","r") as inp: 
    for line in inp: 
     print len(set(line.split())) 
+1

У вас есть ';' перед вашим ':', между прочим. – TigerhawkT3

+0

@ TigerhawkT3 typo thanks – The6thSense

5
with open('details.txt', 'r') as f: 
    for line in f: 
     print(len(set(line.split()))) 
+0

Такие же мысли думают одинаково: p – The6thSense

+2

@ Vignesh - Yep; Здесь не много места для уникальных алгоритмов. – TigerhawkT3

+0

@ TigerhawkT3: Это вызов? –

3

Там целый мир решений, которые хуже, чем Решение TigerhawkT3/Vignesh Kalai. Для сравнения:

>>> timeit.timeit("len(set(string.split()))", "string=\""+string+"\"") 
9.243406057357788 

- их реализация. Я на самом деле были большие надежды на этот:

>>> timeit.timeit("len(set(map(hash,string.split())))", "import numpy\nstring=\""+string+"\"") 
14.462514877319336 

, потому что здесь, то set только надстраивается над хэшей. (И поскольку хеши - это числа, их не нужно сами хэшировать, или я так надеялся. Тип обработки в set, вероятно, все равно убивает меня, иначе теоретически количество вычислений хэшей будет таким же, как в лучшем но там, возможно, был менее неудобный манипулятор PyObject. Я был не прав.)

Так что я попытался разобраться с хэшами в numpy; сначала с необработанными струнами, для сравнения:

>>> timeit.timeit("len(numpy.unique(string.split()))", "import numpy\nstring=\""+string+"\"") 
33.38827204704285 
>>> timeit.timeit("len(numpy.unique(map(hash,string.split())))", "import numpy\nstring=\""+string+"\"") 
37.22595286369324 
>>> timeit.timeit("len(numpy.unique(numpy.array(map(hash,string.split()))))", "import numpy\nstring=\""+string+"\"") 
36.20353698730469 

Последнее применение: Счетчик может просто обходить шаг восстановления. Но опять же, строки Python просто PyObjects и вы действительно не получить, имея вместо этого dict из set:

>>> timeit.timeit("max(Counter(string.split()).values())==1", "from collections import Counter\nstring=\""+string+"\"") 
46.88196802139282 
>>> timeit.timeit("len(Counter(string.split()))", "from collections import Counter\nstring=\""+string+"\"") 
44.15947103500366 

Кстати: Половина времени лучшее решение переходит в расщеплении:

>>> timeit.timeit("string.split()", "import numpy\nstring=\""+string+"\"") 
4.552565097808838 

и контр-интуитивно, что время даже возрастает, если вы указываете, что только хотите разделить вдоль пространства (а не все типичные разделители):

>>> timeit.timeit("string.split(' ')", "import numpy\nstring=\""+string+"\"") 
4.713452100753784 
+0

довольно хороший анализ :) – The6thSense

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