Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python NLTK路径_相似性给出值错误_Python_Numpy_Nltk - Fatal编程技术网

Python NLTK路径_相似性给出值错误

Python NLTK路径_相似性给出值错误,python,numpy,nltk,Python,Numpy,Nltk,我目前正在用NLTK做一个coursera作业,以查找两个文档之间的路径相似性,但被卡住了 import numpy as np import nltk from nltk.corpus import wordnet as wn import pandas as pd nltk.download('averaged_perceptron_tagger') nltk.download('wordnet') nltk.download('punkt') def convert_tag(tag):

我目前正在用NLTK做一个coursera作业,以查找两个文档之间的路径相似性,但被卡住了

import numpy as np
import nltk
from nltk.corpus import wordnet as wn
import pandas as pd

nltk.download('averaged_perceptron_tagger')
nltk.download('wordnet')
nltk.download('punkt')

def convert_tag(tag):
    """Convert the tag given by nltk.pos_tag to the tag used by wordnet.synsets"""
    
    tag_dict = {'N': 'n', 'J': 'a', 'R': 'r', 'V': 'v'}
    try:
        return tag_dict[tag[0]]
    except KeyError:
        return None


def doc_to_synsets(doc):
    """
    Returns a list of synsets in document.

    Tokenizes and tags the words in the document doc.
    Then finds the first synset for each word/tag combination.
    If a synset is not found for that combination it is skipped.

    Args:
        doc: string to be converted

    Returns:
        list of synsets

    Example:
        doc_to_synsets('Fish are nvqjp friends.')
        Out: [Synset('fish.n.01'), Synset('be.v.01'), Synset('friend.n.01')]
    """
    tokens=nltk.word_tokenize(doc)
    tokens=nltk.pos_tag(syn)
    
    updated_pos=[convert_tag(x[1]) for x in tokens]
    
    tokens=[(tokens[x][0],updated_pos[x]) for x in range(len(tokens))]
    
    
    
    ds=[wn.synsets(tokens[x][0],pos=tokens[x][1]) for x in range(len(tokens))]
    ds1=[]
    for x in range(len(tokens)):
        try:
            ds1.append(ds[x][0])
        except:
            continue
    return ds1
def similarity_score(s1, s2):
    """
    Calculate the normalized similarity score of s1 onto s2

    For each synset in s1, finds the synset in s2 with the largest similarity value.
    Sum of all of the largest similarity values and normalize this value by dividing it by the
    number of largest similarity values found.

    Args:
        s1, s2: list of synsets from doc_to_synsets

    Returns:
        normalized similarity score of s1 onto s2

    Example:
        synsets1 = doc_to_synsets('I like cats')
        synsets2 = doc_to_synsets('I like dogs')
        similarity_score(synsets1, synsets2)
        Out: 0.73333333333333339
    """
    maxscore=[]
    for x in s1:
        dis=[]
        for y in s2:
            dis.append(x.path_similarity(y))
            dis=[z for z in dis if z!=None]
        maxscore.append(max(dis))
    return sum(maxscore)/len(maxscore)
    
    
def document_path_similarity(doc1,doc2):
    """Finds the symmetrical similarity between doc1 and doc2"""

    synsets1 = doc_to_synsets(doc1)
    synsets2 = doc_to_synsets(doc2)

    return (similarity_score(synsets1, synsets2)+similarity_score(synsets2, synsets1))/ 2

 #This is a test Function to check wether the above funtion is correct or not
def test_document_path_similarity():
    doc1 = 'This is a function to test document_path_similarity.'
    doc2 = 'Use this function to see if your code in doc_to_synsets \
    and similarity_score is correct!'
    return document_path_similarity(doc1, doc2)
我的问题是这个测试函数没有返回浮点值&它给出了这个值错误:

ValueError                                Traceback (most recent call last)
<ipython-input-61-6c20d7dcffc6> in <module>()
----> 1 test_document_path_similarity()

<ipython-input-60-9639d05f12da> in test_document_path_similarity()
      2     doc1 = 'This is a function to test document_path_similarity.'
      3     doc2 = 'Use this function to see if your code in doc_to_synsets     and similarity_score is correct!'
----> 4     return document_path_similarity(doc1, doc2)

<ipython-input-59-849dd19f38dc> in document_path_similarity(doc1, doc2)
     89     synsets2 = doc_to_synsets(doc2)
     90 
---> 91     return (similarity_score(synsets1, synsets2)+similarity_score(synsets2, synsets1))/ 2

<ipython-input-59-849dd19f38dc> in similarity_score(s1, s2)
     79             dis.append(x.path_similarity(y))
     80             dis=[z for z in dis if z!=None]
---> 81         maxscore.append(max(dis))
     82     return sum(maxscore)/len(maxscore)
     83 

ValueError: max() arg is an empty sequence

您的代码看起来不错,只是您需要添加以下语句:if(dis): 因为您需要maxscore.append(max(dis))将仅在“dis”有值时计算,否则将不考虑它

因此,需要修改的代码部分如下所示:

maxscore=[]
对于s1中的x:
dis=[]
对于s2中的y:
dis.append(x.path\u相似性(y))
dis=[z表示dis中的z,如果z!=None]
如果(dis):
追加(最大值(dis))
返回和(maxscore)/len(maxscore)
synsets2=[Synset('use.v.01'),
  Synset('function.n.01'),
  Synset('see.v.01'),
  Synset('code.n.01'),
  Synset('inch.n.01'),
  Synset('be.v.01'),
  Synset('correct.a.01')],


synsets1=[Synset('be.v.01'),
  Synset('angstrom.n.01'),
  Synset('function.n.01'),
  Synset('test.v.01')]