Почему естественный язык Google возвращает неверное значение beginOffset для анализируемой строки?
Я использую google-cloud/language api для выполнения #annotate звонка и анализа сущностей и настроений из CSV комментариев, которые я взял с различных онлайн-ресурсов.
Начнем с того, что строка, которую я пытаюсь проанализировать, содержит commentId, поэтому я переформатирую это:
youtubez22htrtb1ymtdlka404t1aokg2kirffb53u3pya0,i just bot a Nostromo... ( ._.)
youtubez22oet0bruejcdf0gacdp431wxg3vb2zxoiov1da,Good Job Baby! MSI Propeller Blade Technology!
youtubez22ri11akra4tfku3acdp432h1qyzap3yy4ziifc,"exactly, i have to deal with that damned brick, and the power supply can't be upgraded because of it, because as far as power supply goes, i have never seen an external one on newegg that has more power then the x51's"
youtubez23ttpsyolztc1ep004t1aokg5zuyqxfqykgyjqs,"I like how people are liking your comment about liking the fact that Sky DID put Deadlox's channel in the description instead of Ryan's. Nice Alienware thing logo thing, btw"
youtubez12zjp5rupbcttvmy220ghf4ctqnerqwa04,"You know, If you actually made this. People would actually buy it."
Чтобы он не содержал никаких идентификаторов комментариев:
I just bot a Nostromo... ( ._.)
Good Job Baby! MSI Propeller Blade Technology!\n"exactly, i have to deal with that damned brick, and the power supply can't be upgraded because of it, because as far as power supply goes, i have never seen an external one on newegg that has more power then the x51's"
"I like how people are liking your comment about liking the fact that Sky DID put Deadlox's channel in the description instead of Ryan's. Nice Alienware thing logo thing, btw"
"You know, If you actually made this. People would actually buy it."
После отправки запроса в Google cloud / language нужно пометить текст. Я получаю ответ, который включает в себя различные подстроки чувства и величины. Каждой строке также дается beginOffset
значение, которое относится к индексу строк в исходной строке (строка в запросе).
{ content: 'i just bot a Nostromo... ( ._.)\nGood Job Baby!',
beginOffset: 0 }
{ content: 'MSI Propeller Blade Technology!\n"exactly, i have to deal with that damned brick, and the power supply can't be upgraded because of it, because as far as power supply goes, i have never seen an external one on newegg that has more power then the x51's"\n"I like how people are liking your comment about liking the fact that Sky DID put Deadlox's channel in the description instead of Ryan's.',
beginOffset: 50 }
{ content: 'Nice Alienware thing logo thing, btw"\n"You know, If you actually made this.',
beginOffset: 462 }
Моя цель состоит в том, чтобы найти исходный комментарий в исходной строке, которая должна быть достаточно простой. Что-то вроде (originalString[beginOffset])
.....
Это значение неверно!
Я предполагаю, что они не включают в себя определенные символы, но я пробовал множество регулярных выражений, и, похоже, ничего не работает идеально. Кто-нибудь имеет представление о том, что может быть причиной проблемы???
3 ответа
Я знаю, что это старый вопрос, но проблема, похоже, сохраняется даже сегодня. Я недавно столкнулся с той же проблемой и решил ее, интерпретируя смещения Google как "смещения байтов", а не смещения строк в выбранной кодировке. Работает отлично. Надеюсь, это кому-то поможет.
Ниже приводится некоторый код C#, но каждый должен иметь возможность интерпретировать его и перекодировать на своем любимом языке. Если предположить, чтоtext
на самом деле анализируемый текст настроения, затем следующий код преобразует смещения Google в правильные смещения.
int TransformOffset(string text, int offset)
{
return Encoding.UTF8.GetString(
Encoding.UTF8.GetBytes(text),
0,
offset)
.Length;
}
Это как-то связано с кодированием. Поиграйте с одной из кодировок или просто используйте один из примеров подходов, представленных в их репозитории на github:
https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/language/api/analyze.py
Блок ключевого кода:
def get_native_encoding_type():
"""Returns the encoding type that matches Python's native strings."""
if sys.maxunicode == 65535:
return 'UTF16'
else:
return 'UTF32'
Это сработало для меня. Это испортило персонажей вроде'
(то есть \u2019 в юникоде).
Вы должны установить EncodingType в запросе.
Пример использования клиентской библиотеки Java и работы с текстами в кодировке UTF-8:
Document doc = Document.newBuilder().setContent(dreamText).setType(Type.PLAIN_TEXT).build();
AnalyzeEntitiesRequest request = AnalyzeEntitiesRequest.newBuilder().setEncodingType(EncodingType.UTF8).setDocument(doc).build();