Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Python разбор полетов с кодом  (Прочитано 2058 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ita_lenin

  • Автор темы
  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Python разбор полетов с кодом
« : 28 Апрель 2014, 17:30:35 »
Здравствуйте, уважаемы дамы и господа

Заранее хочу извиниться, если что-то не так.

Проблема заключается в следующем. На питоне нужно написать скрипт синтаксического разбора и поиска определенных слов в документах (а далее в html-странице). Нашел на хабре статейку Латентно-семантический анализ и поиск на python, прочел, изучил, да вот незадача - решил повторить написанное, но со своими параметрами, то бишь создал txt документ с определенным содержанием, поставил слово в поиск, и пошли ругательства со стороны программы.
P.S. кипит дипломная работа, как-никак только начал разбираться в питоне.

(Нажмите, чтобы показать/скрыть)
(Нажмите, чтобы показать/скрыть)
Полезеы любые комментарии и советы
« Последнее редактирование: 28 Апрель 2014, 17:37:12 от ita_lenin »

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12066
  • Xubuntu 20.04 (64bit)
    • Просмотр профиля
Re: Python разбор полетов с кодом
« Ответ #1 : 28 Апрель 2014, 17:35:45 »
global name 'stemmer' is not defined - как бы намекает очень прямолинейно.... :idiot2:
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: http://help.ubuntu.ru/wiki/uefiboot

Оффлайн ita_lenin

  • Автор темы
  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Re: Python разбор полетов с кодом
« Ответ #2 : 28 Апрель 2014, 17:41:14 »
ага, гуглил. как ообъявить stemmer кошерно?

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12066
  • Xubuntu 20.04 (64bit)
    • Просмотр профиля
Re: Python разбор полетов с кодом
« Ответ #3 : 28 Апрель 2014, 17:47:41 »
sudo apt-get install python-stemmer
или
sudo apt-get install python3-stemmer

и в разделе import его прописать.
« Последнее редактирование: 28 Апрель 2014, 18:36:12 от Sly_tom_cat »
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: http://help.ubuntu.ru/wiki/uefiboot

Оффлайн ita_lenin

  • Автор темы
  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Re: Python разбор полетов с кодом
« Ответ #4 : 28 Апрель 2014, 18:10:36 »
Все сделал как сказал. Ошибка та же самая  ???

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12066
  • Xubuntu 20.04 (64bit)
    • Просмотр профиля
Re: Python разбор полетов с кодом
« Ответ #5 : 28 Апрель 2014, 18:12:45 »
Ну а как со stemmer-ом работать - в примерах посмотреть - никак?

Там скорее всего класс - нужно создать экземпляр (которому, по видимому, надо хотя бы язык указать, который он стиммить будет) и вот его уже использовать...
« Последнее редактирование: 28 Апрель 2014, 18:23:30 от Sly_tom_cat »
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: http://help.ubuntu.ru/wiki/uefiboot

Оффлайн WereBeast

  • Любитель
  • *
  • Сообщений: 85
    • Просмотр профиля
Re: Python разбор полетов с кодом
« Ответ #6 : 09 Май 2014, 03:31:14 »
возможно,
import stemmer
вам подможет.

Программирую пропаганду
Windows - в гландах

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Re: Python разбор полетов с кодом
« Ответ #7 : 09 Май 2014, 23:17:15 »
ita_lenin,
ИМХО,
лучше писать руками с нуля,
под конкретный синтаксис,
чем долго
изучать всякие библиотеки анализа текста,
которые в конечном счете могут и не удовлетворить
параметрам самого синтаксического (и лексического) анализа,
вам требующегося.

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12066
  • Xubuntu 20.04 (64bit)
    • Просмотр профиля
Re: Python разбор полетов с кодом
« Ответ #8 : 11 Май 2014, 16:55:40 »
Señor_Gaga, стимминг слов - это совсем не тривиальная задача как может показаться с первого взгляда. И вот как раз в вопросах стиммминга - лучше ИМХО воспользоваться готовыми решениями. Тем более что многие библиотеки на эту тему подразумевают возможность расширить перечень исключений - т.е. ручками доправить самое проблемное место в этой процедуре.
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: http://help.ubuntu.ru/wiki/uefiboot

Оффлайн Jack Sparrow

  • Активист
  • *
  • Сообщений: 629
    • Просмотр профиля
Re: Python разбор полетов с кодом
« Ответ #9 : 12 Май 2014, 00:22:36 »
Цитировать
лучше писать руками с нуля ... чем долго изучать всякие библиотеки
По-моему, как раз, наоборот, рекомендуют самому писать с нуля только для обучения, а в реальной жизни пользоваться готовыми библиотеками, если они, разумеется, делают то, что нужно. Просто бывают разные нюансы, которые, порой, сразу и не выявишь. А стандартные/популярные библиотеки лучше и больше тестируются.
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Re: Python разбор полетов с кодом
« Ответ #10 : 13 Май 2014, 23:42:04 »
Под конретную задачу - нужный инструмент.
Остаюсь при своем мнении - библиотеки использовать
по минимому, и знать свой код.

Оффлайн ita_lenin

  • Автор темы
  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Re: Python разбор полетов с кодом
« Ответ #11 : 14 Май 2014, 13:23:44 »
Все фигня, заработало. Но к сожалению не так как надо. Может быть у кого-нибудь есть опыт с разбором текста и работой с nltk библиотекой. Я решительно не представляю что надо написать, чтобы все раскладывалось по матрицам как надо

# -*- coding: utf-8 -*-

import nltk
import numpy
from numpy import linalg
import scipy
import gensim
from nltk.stem.porter import *
stemmer = PorterStemmer()

class LSI(object):
    def __init__(self, stopwords, ignorechars, docs):
        self.docs=[]
        self.wdict = {}
        self.dictionary = []
        self.stopwords = stopwords
        if type(ignorechars) == unicode:
            ignorechars = ignorechars.encode('utf-8')
            self.ignorechars = ignorechars
        for doc in docs: self.add_doc(doc)
    def prepare(self):
        self.build()
        self.calc()
    def dic(self, word, add = False):
        if type(word) == unicode:
            word = word.encode('utf-8')
            word = word.lower().translate(None, self.ignorechars)
            word = word.decode('utf-8')
            word = stemmer.stemWord(word)
        if word in self.dictionary:
            return self.dictionary.index(word)
        else:
            if add:
                self.dictionary.append(word)
                return len(self.dictionary) - 1
            else: return None
    def add_doc(self, doc):
        words = [self.dic(word, True) for word in doc.lower().split()]
        self.docs.append(words)
        for word in words:
            if word in self.stopwords:
                continue
            elif word in self.wdict:
                self.wdict[word].append(len(self.docs) - 1)
            else:
                self.wdict[word] = [len(self.docs) - 1]
    def build(self):
        self.keys = [k for k in self.wdict.keys() if len(self.wdict[k]) > 0]
        self.keys.sort()
        self.A = numpy.zeros([len(self.keys), len(self.docs)])
        for i, k in enumerate(self.keys):
            for d in self.wdict[k]:
                self.A[i,d] += 1
    def calc(self):
        self.U, self.S, self.Vt = linalg.svd(self.A)
    def TFIDF(self):
        wordsPerDoc = sum(self.A, axis=0)
        docsPerWord = sum(asarray(self.A > 0, 'i'), axis=1)
        rows, cols = self.A.shape
        for i in range(rows):
            for j in range(cols):
                self.A[i,j] = (self.A[i,j] / wordsPerDoc[j]) * log(float(cols) / docsPerWord[i])
    def dump_src(self):
        self.prepare()
        print u'Здесь представлен расчет матрицы '
        for i, row in enumerate(self.A):
            print self.dictionary[i], row
    def print_svd(self):
        self.prepare()
        print u'Здесь сингулярные значения'
        print self.S
        print u'Здесь первые 3 колонки U матрица '
        for i, row in enumerate(self.U):
            print self.dictionary[self.keys[i]], row[0:3]
        print u'Здесь первые 3 строчки Vt матрица'
        print -1*self.Vt[0:3, :]
    def find(self, word):
        self.prepare()
        idx = self.dic(word)
        if not idx:
            print u'слово не встерчается'
            return []
        if not idx in self.keys:
            print u'слово отброшено как не имеющее значения которое через stopwords'
            return []
        idx = self.keys.index(idx)
        print u'word --- ', word, '=', self.dictionary[self.keys[idx]], '.\n'
        # получаем координаты слова
        wx, wy = (-1 * self.U[:, 1:3])[idx]
        print u'word {}\t{:0.2f}\t{:0.2f}\t{}\n'.format(idx, wx, wy, word)
        arts = []
        xx, yy = -1 * self.Vt[1:3, :]
        for k, v in enumerate(self.docs):
            ax, ay = xx[k], yy[k]
            dx, dy = float(wx - ax), float(wy - ay)
            arts.append((k, v, ax, ay, sqrt(dx * dx + dy * dy)))
        return sorted(arts, key = lambda a: a[4])

docs =[
    "boing"
]
ignorechars = ''',:'!'''
word = "сеть"
lsa = LSI([], ignorechars, docs)
lsa.build()
lsa.dump_src()
lsa.calc()
lsa.print_svd()

for res in lsa.find(word):
    print res[0], res[4], res[1], docs[res[0]]

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Re: Python разбор полетов с кодом
« Ответ #12 : 15 Май 2014, 14:31:48 »
Все фигня, заработало. Но к сожалению не так как надо.

Не думаю, что хочет читать пару страниц
чужого кода без коммент..

Оффлайн Mp3user

  • Любитель
  • *
  • Сообщений: 73
    • Просмотр профиля
Re: Python разбор полетов с кодом
« Ответ #13 : 23 Май 2014, 16:36:41 »
Ребят, чтобы не плодить темы решил написать сюда.
Есть код из учебника Dive into python.
import os
import sys
from UserDict import UserDict

def stripnulls(data):
    "strip whitespace and nulls"
    return data.replace("\00", "").strip()

class FileInfo(UserDict):
    "store file metadata"
    def __init__(self, filename=None):
        UserDict.__init__(self)
        self["name"] = filename

class MP3FileInfo(FileInfo):
    "store ID3v1.0 MP3 tags"
    tagDataMap = {"title"   : (  3,  33, stripnulls),
                  "artist"  : ( 33,  63, stripnulls),
                  "album"   : ( 63,  93, stripnulls),
                  "year"    : ( 93,  97, stripnulls),
                  "comment" : ( 97, 126, stripnulls),
                  "genre"   : (127, 128, ord)}

    def __parse(self, filename):
        "parse ID3v1.0 tags from MP3 file"
        self.clear()
        try:                               
            fsock = open(filename, "rb", 0)
            try:                           
                fsock.seek(-128, 2)       
                tagdata = fsock.read(128) 
            finally:                       
                fsock.close()             
            if tagdata[:3] == "TAG":
                for tag, (start, end, parseFunc) in self.tagDataMap.items():
                    self[tag] = parseFunc(tagdata[start:end])               
        except IOError:                   
            pass                           

    def __setitem__(self, key, item):
        if key == "name" and item:
            self.__parse(item)
        FileInfo.__setitem__(self, key, item)

def listDirectory(directory, fileExtList):                                       
    "get list of file info objects for files of particular extensions"
    fileList = [os.path.normcase(f)
                for f in os.listdir(directory)]           
    fileList = [os.path.join(directory, f)
               for f in fileList
                if os.path.splitext(f)[1] in fileExtList]
    def getFileInfoClass(filename, module=sys.modules[FileInfo.__module__]):     
        "get file info class from filename extension"                             
        subclass = "%sFileInfo" % os.path.splitext(filename)[1].upper()[1:]       
        return hasattr(module, subclass) and getattr(module, subclass) or FileInfo
    return [getFileInfoClass(f)(f) for f in fileList]                             

if __name__ == "__main__":
    for info in listDirectory("/music/_singles/", [".mp3"]):
        print "\n".join(["%s=%s" % (k, v) for k, v in info.items()])
        print

В функции listDirectory создаются 2 итератора списка fileList с одинаковыми названиями. Как это работает?
На уровне того что может вылезти ошибка которая и будет поймана?
время бесконечно,вселенная бесконечна,всё может быть !

Оффлайн Phlya

  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
Re: Python разбор полетов с кодом
« Ответ #14 : 23 Май 2014, 16:56:53 »
Эти строки?
Код: Python
  1. fileList = [os.path.normcase(f)
  2.             for f in os.listdir(directory)]          
  3. fileList = [os.path.join(directory, f)
  4.             for f in fileList
  5.             if os.path.splitext(f)[1] in fileExtList]

Так второй создает с использованием первого, то есть считай заменяется.
Ubuntu 14.04 (Unity), MSI GE40

 

Страница сгенерирована за 0.099 секунд. Запросов: 24.