首页 > 解决方案 > FastText 将希伯来文本转换为不可读的编码 - 有什么方法可以转换回来?

问题描述

注意: 从那以后发现 .txt 文件本身已经以不可读的格式编码......有没有办法以可读格式读取 .txt 文件?

b'' b'\xd7\xa7\xd7\x90&\xd7\xa0\xd7\xa6\xd7\x9c\xd7\xa8\xd7\x99\xd7\xaa \xd7\x92\xd7\xa8\xd7\x9e\ xd7\xa0\xd7\x99\xd7\x94\xd7\x90\xd7\xa0\xd7\x92\xd7\x9c\xd7\x94\xd7\x9e\xd7\xa8\xd7\xa7\xd7\x9c\xd7\ x90\xd7\x9e\xd7\xa8 \xd7\x90\xd7\xaa\xd7\x9e\xd7\xa9\xd7\x95\xd7\xaa \xd7\x9e\xd7\xa4\xd7\x9c\xd7\x92\ xd7\x94\xd7\xa9\xd7\x99&\xd7\x9c\xd7\x98\xd7\x95\xd7\x9f \xd7\x93\xd7\xa6\xd7\x9e\xd7\x91\xd7\xa8'

我正在尝试使用 FastText 为希伯来语文本创建词嵌入。看起来 FastText 会自动将文本转换为不同的(不可读的)字符编码。有谁知道为什么会发生这种情况以及如何取消转换?

我在 Windows 计算机上使用 Python 3.5。已尝试将矢量化单词读取为“UTF-8”编码,但它仍然以不可读的格式出现。

model = fasttext.cbow('your_file.txt', 'model')
model.words # list of words in dictionary

向量是这样产生的:

{'': <gensim.models.keyedvectors.Vocab at 0x1ca3f6cc208>,
 '8\\xd7\\x95\\xd7\\xa0\\xd7\\x99\\xd7\\x94': <gensim.models.keyedvectors.Vocab at 0x1ca3b2fbda0>,
 '2.199': <gensim.models.keyedvectors.Vocab at 0x1ca3aadf470>,
 '42381': <gensim.models.keyedvectors.Vocab at 0x1ca3b348160>,
 '7648': <gensim.models.keyedvectors.Vocab at 0x1ca3b0b7208>,
 '1.9841': <gensim.models.keyedvectors.Vocab at 0x1ca3afd8080>,
 '7\\x91\\xd7\\x90"\\xd7\\x90': <gensim.models.keyedvectors.Vocab at 0x1ca3b313e80>,
 "xa0\\xd7\\x92'\\xd7\\x99&\\xd7\\x9e\\xd7\\x99\\xd7\\x9f": <gensim.models.keyedvectors.Vocab at 0x1ca3ab7b7f0>,
 '9e\\xd7\\x90\\xd7\\x9c': <gensim.models.keyedvectors.Vocab at 0x1ca3ad39748>,
 "a4\\xd7\\x99'": <gensim.models.keyedvectors.Vocab at 0x1ca3a8e9b38>,
 '\\x90\\xd7\\x95': <gensim.models.keyedvectors.Vocab at 0x1ca3ad7fe48>,
 '3501': <gensim.models.keyedvectors.Vocab at 0x1ca3aa1fbe0>,
 '7214': <gensim.models.keyedvectors.Vocab at 0x1ca3a798cf8>,
 '87195': <gensim.models.keyedvectors.Vocab at 0x1ca3aab47b8>,

标签: pythoncharacter-encodingfasttext

解决方案


从评论:

这是我从句子列表中创建 txt 文件的方式:

with open('your_file.txt', 'w') as f:
    for item in new_list: 
        f.write("%s\n" % item.encode('utf8'))

这不起作用,将字节(的结果str.encode)插入到字符串中隐式调用strbytes导致

"b'mystring'\n"

请注意引号的“b” - 写入文件的内容是字符串,而不是编码字节。

正确的方法是在打开文件时声明所需的编码,然后写入文本

with open('your_file.txt', 'w', encoding='utf-8') as f:
    for item in new_list:
        f.write('%s\n' % item)  # assuming item is already a str

或以二进制模式打开文件,并写入字节

with open('your_file.txt', 'wb') as f:
    for item in new_list:
        f.write(('%s\n' % item).encode('utf-8'))  # make the string, _then_ encode

如果使用-bstr标志执行 Python,第一次调用bytes实例时会发出警告;如果使用 -bb 标志,将引发异常。


推荐阅读