Как использовать gensim.similarities.Similarity, чтобы найти сходство между двумя предложениями

Я хотел написать код, чтобы найти сходство между двумя предложениями, и в итоге я написал этот код, используя nltk и gensim. Я использовал токенизацию и gensim.similarities.Similarity для выполнения этой работы. Но это не служит моей цели. Он отлично работает, пока я не введу последнюю строку кода.

import gensim
import nltk

raw_documents = ["I'm taking the show on the road.",
             "My socks are a force multiplier.",
         "I am the barber who cuts everyone's hair who doesn't cut their 
own.",
         "Legend has it that the mind is a mad monkey.",
        "I make my own fun."]
from nltk.tokenize import word_tokenize
gen_docs = [[w.lower() for w in word_tokenize(text)]
        for text in raw_documents]



dictionary = gensim.corpora.Dictionary(gen_docs)
print(dictionary[5])
print(dictionary.token2id['socks'])
print("Number of words in dictionary:",len(dictionary))
for i in range(len(dictionary)):
    print(i, dictionary[i])

corpus = [dictionary.doc2bow(gen_doc) for gen_doc in gen_docs]
print(corpus)

tf_idf = gensim.models.TfidfModel(corpus)
print(tf_idf)
    s = 0
for i in corpus:
s += len(i)
print(s)

sims = gensim.similarities.Similarity('/usr/workdir/',tf_idf[corpus],
                                  num_features=len(dictionary))
print(sims)
print(type(sims))


query_doc = [w.lower() for w in word_tokenize("Socks are a force for good.")]
print(query_doc)
query_doc_bow = dictionary.doc2bow(query_doc)
print(query_doc_bow)
query_doc_tf_idf = tf_idf[query_doc_bow]
print(query_doc_tf_idf)

sims[query_doc_tf_idf]

Выдает эту ошибку. Я не мог найти ответ на этот вопрос нигде в Интернете.

Traceback (most recent call last):
  File "C:\Python36\lib\site-packages\gensim\utils.py", line 679, in save
_pickle.dump(self, fname_or_handle, protocol=pickle_protocol)
TypeError: file must have a 'write' attribute

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "semantic.py", line 45, in <module>
    sims[query_doc_tf_idf]
  File "C:\Python36\lib\site-packages\gensim\similarities\docsim.py", line 
503, in __getitem__
    self.close_shard()  # no-op if no documents added to index since last 
query
 File "C:\Python36\lib\site-packages\gensim\similarities\docsim.py", line 
427, in close_shard
    shard = Shard(self.shardid2filename(shardid), index)
 File "C:\Python36\lib\site-packages\gensim\similarities\docsim.py", line 
110, in __init__
    index.save(self.fullname())
  File "C:\Python36\lib\site-packages\gensim\utils.py", line 682, in save
    self._smart_save(fname_or_handle, separately, sep_limit, ignore, 
pickle_protocol=pickle_protocol)
  File "C:\Python36\lib\site-packages\gensim\utils.py", line 538, in 
_smart_save
    pickle(self, fname, protocol=pickle_protocol)
  File "C:\Python36\lib\site-packages\gensim\utils.py", line 1337, in pickle
    with smart_open(fname, 'wb') as fout:  # 'b' for binary, needed on 
Windows
  File "C:\Python36\lib\site-packages\smart_open\smart_open_lib.py", line 
181, in smart_open
fobj = _shortcut_open(uri, mode, **kw)
  File "C:\Python36\lib\site-packages\smart_open\smart_open_lib.py", line 
287, in _shortcut_open
return io.open(parsed_uri.uri_path, mode, **open_kwargs)

Помогите пожалуйста разобраться где проблема.


person Hemanth    schedule 11.07.2018    source источник


Ответы (1)


Ваш запрос должен работать, если вы укажете действительный путь при создании экземпляра подобия. В приведенном ниже примере я создал каталог Similarity на своем диске C и указал путь к каталогу и имя файла в вызове функции.

sims = gensim.similarities.Similarity('C:/Similarity/sims',tf_idf[corpus],
                                  num_features=len(dictionary))
print(sims)
print(type(sims))

query_doc = [w.lower() for w in word_tokenize("Socks are a force for good.")]
print(query_doc)
query_doc_bow = dictionary.doc2bow(query_doc)
print(query_doc_bow)
query_doc_tf_idf = tf_idf[query_doc_bow]
print(query_doc_tf_idf)

print('Query result:', sims[query_doc_tf_idf])

Query result: [0.       0.84565616   0.      0.06124881   0.        ]
person KRKirov    schedule 11.07.2018
comment
Как я могу интерпретировать возвращенную меру подобия от sims (sims[query_doc_tf_idf])? Например, как я могу показать процентное сходство между двумя документами? - person Animate_Ant; 15.12.2019
comment
gensim.similarities.Similarity возвращает косинусное сходство между документами. en.wikipedia.org/wiki/Cosine_similarity Таким образом, это мера угла между документами и выражать это в процентах, вероятно, не имеет смысла. Вы можете взять arccos нормы возвращаемой матрицы для преобразования вывода в градусы, если это поможет вашему пониманию: np.arccos(np.linalg.norm(sims[query_doc_tf_idf]))*180/np.pi . - person KRKirov; 15.12.2019
comment
Я понимаю, что вы имеете в виду, причина, по которой я спросил, я нашел ресурс dev.to/coderasha/, который вычислял процент сходства, как sum_of_sims =(np.sum(sims[query_doc_tf_idf], dtype=np.float32)) avg = sum_of_sims / len(file_docs) , но я не был в этом уверен. - person Animate_Ant; 15.12.2019