2016-04-20 9 views
0

zu implementieren Ich habe book.csv-Datei, die einige bibliographische Listen von Büchern besteht. Ich habe auch Benutzer-Tabelle in der Datenbank, die Benutzerinformationen benötigt. mein Ziel ist es, tf-idf, Kosinusähnlichkeit zwischen Benutzerinformationen brauchen aus der Datenbanktabelle als Abfrage und Buch.csv Reihe als Dokument und drucken die meisten ähnlichen Zeilen mit Benutzerinformationen brauchen, wenn Benutzer_Id eingefügt wird. also habe ich ein Problem beim Einstellen von CSV Raws als Dokument. jede Hilfe bitte mit diesem Fehler IndexError: list index out of range. Das andere Problem ist, selbst wenn ich die rechte User_Id einfüge, werden Fehlermeldungen wiederholt, bis ich die Nummer dieses Benutzers erreicht habe. das heißt, wenn der Benutzer auf Platz 3 in der Datenbanktabelle ist habe ich wie diese hierPython: tf-IDF-Cosine: Wie Dokument Ähnlichkeit in CSV-Datei

insert User_Id 
JU/MF3024/04 
no such User exist 
insert User_Id 
JU/MF3024/04 
insert User_Id 
JU/MF3024/04 
no such User exist 
Fit Vectorizer to train set [[0 1] 
[1 0]] 
Transform Vectorizer to test set [[0 0] 
[0 0] 

dreimal versucht, ist meine Implementierung Code in Python 2.7.11. Früher habe ich einige Codes von Python: tf-idf-cosine: to find document similarity

from sklearn.feature_extraction. text import CountVectorizer 
from sklearn.feature_extraction.text import TfidfVectorizer 
from sklearn.feature_extraction.text import TfidfTransformer 
from sklearn.metrics.pairwise import cosine_similarity 
from sklearn.metrics.pairwise import linear_kernel 
import numpy as np 
import numpy.linalg as LA 
import pandas as pd 
from nltk.corpus import stopwords 
from collections import defaultdict 
import csv 
import mysql.connector as sql 
from mysql.connector import connection 
with open("Book.csv", "rb") as books: 
    reader = csv.reader(books, delimiter =',') 
    reader. next() 
    count = 0 
    docs = {} 
    for row in reader: 
     docs = row[1].split()#I want to consider each row as document similar to train set on the above linked post 
query = "" # like test_set on the above post 
config = {'user': 'root', 'password': '[email protected]', 'host': '127.0.0.1','database': 'juls', 'raise_on_warnings': True,} 
db = ql.connect(**config) 
cursor = db.cursor() 
query = "SELECT * FROM user" 
cursor.execute(query) 
result = cursor.fetchall() 
for r in result: 
    User_Id = r[0] 
    First_Name = r[1] 
    Last_Name = r[2] 
    College = r[3] 
    Department = r[4] 
    Info_need = r[5] 
    email = r[6] 
    print "insert User_Id" 
    Id = str(raw_input()) 
    if Id not in User_Id: 
     print "no such User exist" 
     pass 
    elif Id =="": 
     print "User ID is blank" 
     pass 
    else: 
     query = "SELECT Info_need from user WHERE User_Id = '%s'" % Id 
     cursor.execute(query) 
stopWords = set(stopwords.words('english')) 
vectorizer = CountVectorizer(stop_words = stopWords) 
transformer = TfidfTransformer() 
trainVectorizerArray = vectorizer.fit_transform(docs).toarray() 
testVectorizerArray = vectorizer.transform(query).toarray() 
print 'Fit Vectorizer to train set', trainVectorizerArray 
print 'Transform Vectorizer to test set', testVectorizerArray 
cx = lambda a, b : round(np.inner(a, b)/(LA.norm(a)*LA.norm(b)), 3) 
for vector in trainVectorizerArray: 
    for testV in testVectorizerArray: 
     cosine = cx(vector, testV) 
transformer.fit(trainVectorizerArray) 
transformer.fit(testVectorizerArray) 
tfidf = transformer.transform(testVectorizerArray) 
print tfidf.todense() 
tfidf_vectorizer = TfidfVectorizer() 
tfidf_matrix_train = tfidf_vectorizer.fit_transform(docs) 
print "RANKED TF-IDF" 
print tfidf[0:1] 
cosine_similarities = linear_kernel(tfidf[ 0: 1], tfidf). flatten() 
print cosine_similarities 
related_docs_indices = cosine_similarities.argsort()[:-5:-1] 
print related_docs_indices 
print cosine_similarities[related_docs_indices] 
print docs[14] 

Antwort

0

Diese Antwort ist für Datenbank-Teil in der Frage Benutzerinformationen extrahieren müssen

db = sql.connect(**config) 
cursor = db.cursor() 
Id = str(raw_input("insert User_Id: ")) 
val= cursor.execute("SELECT MajorSubjectInterest, SubsidiarySubjectInterest from user WHERE User_Id = '%s'" % (Id)) 
result = cursor.fetchall() 
for r in result: 
    Major = r[0] 
    Subsidiary = r[1] 
    if Subsidiary =="": #SubsidiarySubjectInterest field in the table is allowed Null input 
     need = Major 
    else: 
     need = Major + '; ' + Subsidiary 
    queries.append(need) after I extracted user information need I want it to be list and so I add it to empty list. it is also possible like this 'needs = need.split(';',5)' 
db.close() 
0

ich das Problem, csv raws als Dokument gelöst haben. so ist der untenstehende Code mein der Lösung. Bitte helfen Sie für den Rest der anderen Fragen in der Post.

stopWords = set(stopwords.words('english')) 
lines = [] 
with open('Booklist.csv', 'rb') as f: 
reader = csv.reader(f) 

for row in reader: 
    if reader.line_num == 1: 
     continue # to skip frist line 
    your_list = row[1] 
    lines.append((your_list)) 
def build_lexicon(corpus): 
lexicon = set() 
for doc in corpus: 
    lexicon.update([word for word in doc.split() if not word in stopWords]) # remove stop words 
return lexicon 
vocabulary = build_lexicon(lines) 
print 'My vocabulary vector is [' + ',' .join(list(vocabulary)) + ']' # prints whole vocabulary words in the column (row[1]) without stop words 
for doc in lines: 
print 'The doc %d is: %s' % ((lines.index(doc) +1), doc) #prints each line as document which is my intention 
+0

Wenn Sie eine andere Frage haben, bitte [Neue Frage] (http://stackoverflow.com/ Fragen/Fragen). Antworten sollten nur für Beiträge verwendet werden, die die Frage beantworten. – JAL

+0

Sehr geehrte JAL, Es ist wirklich die Antwort für meine Frage. aber Entschuldigung! wenn meine Frage in der Post nicht klar ist –

Verwandte Themen