比较多个目标文档和多个源文档

时间:2019-05-10 03:29:20

标签: python analysis

我是AI和情感分析的初学者。我正在对两个文档进行情感分析。当我仅添加一个源文档而不是多个源文档的列表以将其与多个目标文档进行比较时,此代码可以很好地工作。

有人可以告诉我为处理多个源文档列表需要进行哪些更改?

#Loading pre=trained word2vec model

from gensim.models.keyedvectors import KeyedVectors

# You need to dowload google pre-trained model using below link
# https://drive.google.com/file/d/0B7XkCwpI5KDYNlNUTTlSS21pQmM/edit
#Change the path according to your directory

model_path = 'E:\GoogleNews_vectors_negative300.bin'   
w2v_model = KeyedVectors.load_word2vec_format(model_path, binary=True)



#Setting Parameters for model

class DocSim(object):
    def __init__(self, w2v_model , stopwords=[]):
        self.w2v_model = w2v_model
        self.stopwords = stopwords

    def vectorize(self, doc):
        """Identify the vector values for each word in the given document"""
        doc = doc.lower()
        words = [w for w in doc.split(" ") if w not in self.stopwords]
        word_vecs = []
        for word in words:
            try:
                vec = self.w2v_model[word]
                word_vecs.append(vec)
            except KeyError:
                # Ignore, if the word doesn't exist in the vocabulary
                pass

        # Assuming that document vector is the mean of all the word vectors

        vector = np.mean(word_vecs, axis=0)
        return vector


    def _cosine_sim(self, vecA, vecB):
        """Find the cosine similarity distance between two vectors."""
        csim = np.dot(vecA, vecB) / (np.linalg.norm(vecA) * np.linalg.norm(vecB))
        if np.isnan(np.sum(csim)):
            return 0
        return csim

    def calculate_similarity(self, source_doc, target_docs=[], threshold=0):
        """Calculates & returns similarity scores between given source document & all
        the target documents."""
        if isinstance(target_docs, str):
            target_docs = [target_docs]


        source_vec = self.vectorize(source_doc)
        results = []
        for doc in target_docs:
            target_vec = self.vectorize(doc)
            sim_score = self._cosine_sim(source_vec, target_vec)
            if sim_score > threshold:
                results.append({
                    'score' : sim_score,
                    'doc' : doc
                })
            # Sort results by score in desc order
            results.sort(key=lambda k : k['score'] , reverse=True)

        return results


ds = DocSim(w2v_model)



#Calculate the similarity score between a source rule & a target rule.

source_rule = [ '2.1.1 Context','2.2.3 Value']
target_rule = [ '2.1.1 Context','2.1.2.4 Assist Failed Train']

# This will return one target rules text with a similarity score

sim_scores = ds.calculate_similarity(source_rule, target_rule)

print(sim_scores)

这是我现在遇到的错误。

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-22-041084a3f599> in <module>
      6 # This will return one target rules text with similarity score
      7 
----> 8 sim_scores = ds.calculate_similarity(source_rule, target_rule)
      9 
     10 print(sim_scores)

<ipython-input-20-055f5d25808f> in calculate_similarity(self, source_doc, target_docs, threshold)
     41             source_doc=[source_doc]
     42 
---> 43         source_vec = self.vectorize(source_doc)
     44         results = []
     45         for doc in target_docs:

<ipython-input-20-055f5d25808f> in vectorize(self, doc)
      8     def vectorize(self, doc):
      9         """Identify the vector values for each word in the given document"""
---> 10         doc = doc.lower()
     11         words = [w for w in doc.split(" ") if w not in self.stopwords]
     12         word_vecs = []

AttributeError: 'list' object has no attribute 'lower'

1 个答案:

答案 0 :(得分:0)

请确保将source_rule是一个列表,然后对其进行迭代,然后在其上执行calculate_similarity()函数,而不是将整个列表发送给该函数

#Loading pre=trained word2vec model

from gensim.models.keyedvectors import KeyedVectors

# You need to dowload google pre-trained model using below link
# https://drive.google.com/file/d/0B7XkCwpI5KDYNlNUTTlSS21pQmM/edit
#Change the path according to your directory

model_path = 'E:\GoogleNews_vectors_negative300.bin'   
w2v_model = KeyedVectors.load_word2vec_format(model_path, binary=True)



#Setting Parameters for model

class DocSim(object):
    def __init__(self, w2v_model , stopwords=[]):
        self.w2v_model = w2v_model
        self.stopwords = stopwords

    def vectorize(self, doc):
        """Identify the vector values for each word in the given document"""
        doc = doc.lower()
        words = [w for w in doc.split(" ") if w not in self.stopwords]
        word_vecs = []
        for word in words:
            try:
                vec = self.w2v_model[word]
                word_vecs.append(vec)
            except KeyError:
                # Ignore, if the word doesn't exist in the vocabulary
                pass

        # Assuming that document vector is the mean of all the word vectors

        vector = np.mean(word_vecs, axis=0)
        return vector


    def _cosine_sim(self, vecA, vecB):
        """Find the cosine similarity distance between two vectors."""
        csim = np.dot(vecA, vecB) / (np.linalg.norm(vecA) * np.linalg.norm(vecB))
        if np.isnan(np.sum(csim)):
            return 0
        return csim

    def calculate_similarity(self, source_doc, target_docs=[], threshold=0):
        """Calculates & returns similarity scores between given source document & all
        the target documents."""
        if isinstance(target_docs, str):
            target_docs = [target_docs]


        source_vec = self.vectorize(source_doc)
        results = []
        for doc in target_docs:
            target_vec = self.vectorize(doc)
            sim_score = self._cosine_sim(source_vec, target_vec)
            if sim_score > threshold:
                results.append({
                    'score' : sim_score,
                    'doc' : doc
                })
            # Sort results by score in desc order
            results.sort(key=lambda k : k['score'] , reverse=True)

        return results


ds = DocSim(w2v_model)



#Calculate the similarity score between a source rule & a target rule.

source_rule = [ '2.1.1 Context','2.2.3 Value']
target_rule = [ '2.1.1 Context','2.1.2.4 Assist Failed Train']

if isinstance(source_rule, str):
    source_rule = [source_rule]

# This will return one target rules text with a similarity score
for rule in source_rule:
    sim_scores = ds.calculate_similarity(rule, target_rule)

    print("Similarity with {} is {}".format(rule, sim_scores))