如何使用nltk bigrams返回/搜索文档?

时间:2013-06-19 15:20:10

标签: python nlp nltk n-gram

我想要做的是遍历我的数据库搜索每个文档是否存在某些列出的条款 - 其中一些我想成为bigram和trigram如有必要。如果条款存在,我将提交文件索引,等等等等。

我知道NLTK提供了一个nltk.bigrams()调用,但是从来没有实现它我无法实现它,即使我可以,我也不知道如何确保正确使用。我希望有人可以提供帮助。

以下是我的代码目前的简化版本:

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

我唯一的问题是如何使用NLTK的bigram来确定我的word_list中的任何一个bigrams是否位于我的文档列表中。有人可以解释一下吗?提前谢谢。

1 个答案:

答案 0 :(得分: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()是非常可怕的),我欢迎反馈。感谢。