как возвращать/искать документы с помощью биграмм nltk?

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

Я знаю, что NLTK предлагает вызов nltk.bigrams(), но так и не реализовав его, я не могу заставить его работать, а даже если бы и мог, я понятия не имею, как обеспечить правильное использование. Я надеюсь, что кто-то на SO может помочь.

Вот упрощенная версия того, как мой код выглядит сейчас:

word_list        = ['**live music'**, 'classical', 'local band', 'new album', 'punk
rock','pop music', 'rap', 'blues', 'electronic','original compositions', 'musical',
'russian music', 'music festival', 'start', '**rap battle**', 'country music', 'rapper
live', 'rap duo', 'r&b', 'live', 'music', 'bands', 'call', 'ska', 'electro', '**bluegrass
band**', 'reggae', 'play','latin','quintet', 'jazz', 'the piano', 'band', 'techno',
'facebook', 'reggae music', 'tribute band', 'must', 'backup band','country rock',
'last', 'rap live', 'country', 'concert series', 'metal', 'the depot', 'big band', 'hip
hop', 'rock', 'usually', 'gospel', '**upcoming release**']

idx_list         = []

##initialize db cursor:
db_conn = crawler_library.connect_to_db("events")
cursor  = db_conn.cursor()

##make query:
query = "SELECT event_title,description,extra_info,venue_name FROM events WHERE
events.idx in" + str(tuple(category_list)) #this will return *all* docs from this database.

#execute the query and catch any errors that show up and print them so I am not flying
blind
try:
    cursor.execute(query)
except MySQLdb.Error, e:
     print("MySQL Error [%d]: %s") % (e.args[0], e.args[1])
crawler_library.close_db_connection(db_conn)

#loop through all results in the query set, one row at-a-time
documents = []


if cursor.rowcount > 0: #don't bother doing anything if we don't get anything from the
database
    data = cursor.fetchall()
    for row in data:
         temp_string  = nltk.clean_html(str(row[0]).strip(string.punctuation).lower()+"
                        "+str(row[1]).strip(string.punctuation).lower() \
                        +" "+str(row[2]).strip(string.punctuation).lower() +"
                        "+str(row[3]).strip(string.punctuation)).lower().split()
         fin_doc   = ""
         for word in temp_string:
             if word not in stopwords and len(word) >= 3:
                 fin_doc += " " + word.strip(string.punctuation)
             documents.append(fin_doc)

Таким образом, как я надеюсь, это ясно из кода, у меня есть список терминов, которые я ищу (word_list), некоторые из которых являются биграммами (см. выделено), я запрашиваю нашу базу данных и документы (данные), которые он возвращает (для строки в данных), я очищаю каждый и создаю новый список (documents = []). Я хотел бы искать каждый документ в моем списке документов, чтобы определить, есть ли в нем термин из моего списка слов (включая биграммы). Я надеюсь, что это ясно и может быть легко решено.

Мой единственный вопрос заключается в том, как использовать биграмму NLTK, чтобы определить, находятся ли какие-либо биграммы в моем списке слов в моем списке документов. Может кто-нибудь объяснить это? Заранее спасибо.


person Bee Smears    schedule 19.06.2013    source источник


Ответы (1)


вот ответ, который я придумал (см. Описание выше (особенно цикл for) для большей ясности):

for row in data:
    temp_string  = nltk.clean_html(str(row[0]).strip(string.digits + string.punctuation).lower() +" "+str(row[1]).strip(string.digits + string.punctuation).lower() \
    +" "+str(row[2]).strip(string.digits + string.punctuation).lower()+" "+str(row[3]).strip(string.digits + string.punctuation)).lower().split()
    temp_string     = [word for word in temp_string if word not in stopwords and len(word) >= 3]
    bigrams         = nltk.bigrams(word_tokenize(str(' '.join(temp_string))))
    all_terms_list  = temp_string + [str(bigram).replace(",","").replace("'", "").strip("()") for bigram in bigrams]
    [live_music_idx_list.append(row[4]) for word in live_music_word_list if word in all_terms_list]

если кто-нибудь знает, как я могу лучше оптимизировать этот код или если я что-то напортачил (string.replace().replace() довольно смешно), я приветствую отзывы. Спасибо.

person Bee Smears    schedule 19.06.2013