0

我想要做的是在我的数据库中循环搜索每个文档中是否存在某些列出的术语——如果有必要,我希望其中一些是二元组和三元组。如果条款存在,我将提交文件的索引和等等等等。

我知道 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)——其中一些是二元组(见突出显示),我正在查询我们的数据库和文档(数据)它返回(对于数据行),我正在清理每一个并构建一个新列表(文档 = [])。我想在我的文档列表中搜索每个文档,看看它是否有我的 word_list 中的一个词(包括二元组)。我希望这很清楚并且可以很容易地解决。

我唯一的问题是如何使用 NLTK 的二元组来确定我的 word_list 中的任何二元组是否位于我的文档列表中。有人可以解释一下吗?先感谢您。

4

1 回答 1

0

这是我想出的答案(请参阅上面的描述(尤其是 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() 非常可笑),我欢迎反馈。谢谢。

于 2013-06-19T19:04:37.217 回答