2015-06-06 3 views
0

Я строю небольшой алгоритм «трендов». Токенизер работает так, как изначально планировалось, задерживает пару икота вокруг URL-адресов, что вызывает некоторые проблемы.Удаление URL-адресов из токенов в NLTK

Очевидно, что, поскольку я извлекаю информацию из твиттера, существует много ссылок типа URL-адреса у t.co. Я хотел бы удалить их как «слова», желательно на этапе tokeniser, но в настоящее время я фильтрую их после факта. Я не могу (я не думаю) запускать жетоны против узнаваемого английского белого списка, так же как и Twitter, и сокращения и т. Д.

Мой код, который обертывает функцию, которая тянет 10 самых распространенных слов в любой данный период:

tweets = Tweet.objects.filter(lang='en', created_at__gte=start, created_at__lte=end) 
number_of_tweets = tweets.count() 
most_popular = trending.run_all(start, end, "word").keys()[:10] 
print "BEFORE", most_popular 
for i, thing in enumerate(most_popular): 
    try: 
     if "/" in thing: 
      most_popular.remove(thing) 
      print i, thing, "Removed it." 
    except UnicodeEncodeError, e: 
     print "Unicode error", e 
     most_popular.remove(thing) 
print "NOW", most_popular` 

что попробовать/за исключением блока должен, теоретически, удалить любого из URL признаков слова из списка лексем - за исключением того, что нет, я всегда уходил с парой.

Запуск trending.run_all на период времени дает, например:

[u'//t.co/r6gkL104ai/nKate', u'EXPLAIN', u'\U0001f62b\U0001f62d/nRT', u'woods', u'hanging', u'ndtv/nRT', u'BenDohertyCorro', u'\u0928\u093f\u0930\u094d\u0926\u094b\u0937_\u092c\u093e\u092a\u0942\u2026/nPolice', u'LAST', u'health/nTime']

Запуск остальной части кода ввозимого в питона командной строки дает:

0 //t.co/r6gkL104ai/nKate Removed it 
1 /nRT Removed it 
2 hanging 
3 ndtv/nRT Removed it 
4 निर्दोष_बापू…/nPolice Removed it 
5 health/nTime Removed it 
6 Western 7 //t.co/4dhGoBpzR0 Removed it 
8 //t.co/TkHhI7n…/nRT Removed it 
9 //t.co/WmWkcG1dOz/nRT Removed it 
10 bringing 
... 
32 kids 

NOW [u'EXPLAIN', u'woods', u'hanging', u'BenDohertyCorro', u'LAST', u'scolo', u'Western', u'//t.co/jB0TWYAJSI/nMe', u'BREAKINGNEWS', u'//t.co/9gYG8y5OKK', u'bringing', u'Valls', u'advices', u'Signatures', u'//t.co/vmQfyenXp4/nJury', u'strengthandcondition\u2026', u'HAPPENED', u'\u2705', u'\U0001f60f', u'//t.co/5JR8RXsJ87/nIs', u'Hamilton', u'Logging', u'Happening', u'Foundation', u'//t.co/gC959Q43QD/nRT', u'ISIS=CIA', u'Footnotes', u'ARYNEWSOFFICIAL', u'LoveMyLife', u'-they', u'B\xf6rse', u'InfoTerrorism', u'kids'] 

Так по какой-то причине, что маленький кусок не (последовательно) вырезает их или не действует так, как ожидалось. Это вызывает определенную проблему с обратным поиском в Django, поскольку я намерен использовать верхние X-фразы за период как ссылки с возможностью обращения, что, очевидно, полностью нарушает поиск, и там (по праву), похоже, не является способом исключения из этого в шаблоне, поэтому я лучше позабочусь об этом в представлениях.

ответ

1

Мне кажется, что проблема заключается в том, что вы удаляете список, итерации по нему. Решение простое: Вы должны перебирать на копию вашего списка:

for i, thing in enumerate(most_popular[:]): 

уведомление о «[:]», который будет создавать копию списка.

Причина такого поведения может быть найдена в этом post.

+0

В первой строке должно быть: 'для i, вещь в перечислении (most_popular [:]):' - это теперь выдает другой 'error list.remove (x): x not in list', что предполагает это еще не совсем правильный ответ. – Withnail

+0

Вам нужен объект «enumerate»? Вы можете перебирать список без него. – Tom

+0

Вы правы, я просто имел это для целей отладки, но все равно бросает x не в список ошибок. – Withnail

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