Trechos de pesquisa chineses aparecem quebrados

Quando tento pesquisar em chinês no meu fórum, vejo que o resultado da pesquisa retorna frases quebradas, a pontuação está faltando e há espaços em branco inesperados entre as palavras, além de algumas palavras ausentes.

Por exemplo, tentei pesquisar 管理员, e a frase original é:

管理人员可见的分类。只有管理员和版主才能阅览主题

Mas o que vi no resultado da pesquisa ficou assim:

Como podem ver, 可见的 está faltando, o ponto final também está ausente, o que quebra a frase. Além disso, 只有 e , assim como 才能, também não aparecem. E há espaços em branco inesperados entre as palavras.

Alguém pode me ajudar com esse problema? Obrigado

2 curtidas

Parece que esses caracteres ausentes são considerados palavras de parada na língua chinesa

(byebug) data = CppjiebaRb.segment(search_data, mode: mode)
["管理人员", "可见", "的", "分类", "。", "只有", "管理员", "和", "版主", "才能", "阅览", "主题"]
(byebug) CppjiebaRb.filter_stop_word(data)
["管理人员", "分类", "管理员", "版主", "阅览", "主题"]
3 curtidas

Espera, então o bug aqui é que o “resumo” no resultado parece estranho? Não que haja um problema funcional real na busca?

Sim, a pesquisa ainda está funcionando, apenas o trecho exibido não é ideal. Para o idioma chinês, a pesquisa é tratada de maneira um pouco diferente. Em vez de ignorar as palavras de parada durante a própria consulta de pesquisa, nós as excluímos completamente dos dados de pesquisa.

3 curtidas

Obrigado por investigar isso.

Isso não é uma palavra vazia em chinês; é um adjetivo que significa “visível”.

É possível corrigir esse problema (incluindo tudo nos resultados de busca)? Ou existe alguma solução alternativa?

Obrigado.

1 curtida

Palavras de parada são palavras muito comuns que prejudicam o desempenho da busca.

“E”, por exemplo, em inglês, é uma palavra de parada.

É possível corrigir isso; levará alguns meses para chegar lá. Enquanto isso, se você precisar de uma correção rápida, há o Marketplace.

Marcado como pr-welcome

2 curtidas

As palavras de parada são determinadas usando GitHub - yanyiwu/cppjieba: "结巴"中文分词的C++版本 · GitHub. Com as recentes mudanças na forma como os trechos de pesquisa são exibidos, devemos simplesmente remover a seguinte linha, pois ela interfere nos dados reais de pesquisa.

De qualquer forma, nosso suporte de pesquisa para o chinês não é ótimo, mas existem extensões do PostgreSQL que podemos considerar para que possamos dar suporte adequado a idiomas que não têm suporte nativo. Talvez https://pgroonga.github.io/?

5 curtidas

Obrigado! Vou tentar isso e ver como corre.

@tgxworld Não tenho certeza se entendi corretamente: o PGroonga não oferece suporte a chinês e japonês. Em https://pgroonga.github.io/,

O PostgreSQL oferece suporte à pesquisa de texto completo apenas para idiomas que usam apenas letras e dígitos. Isso significa que o PostgreSQL não oferece suporte à pesquisa de texto completo para japonês, chinês e assim por diante. Você pode usar o recurso de pesquisa de texto completo super rápido para todos os idiomas instalando o PGroonga no seu PostgreSQL!

@tgxworld Criei um PR conforme sua sugestão FIX: keep chinese stopwords on search by t0t07 · Pull Request #11530 · discourse/discourse · GitHub

O sentido é exatamente o oposto disso. O PostgreSQL normal não oferece suporte a chinês e japonês. O PGroonga adiciona suporte a esses idiomas.

3 curtidas

A propósito, @riking, só para confirmar: atualmente o Discourse implementa a pesquisa de texto completo usando as funções integradas do PostgreSQL, conforme em discourse/lib/search.rb at 1cf057fb1c4e168ce441ddde918636725abeb668 · discourse/discourse · GitHub

Isso está correto?

1 curtida

Desculpe não ter sido mais específico anteriormente. Se realmente quisermos corrigir isso por enquanto, precisamos garantir que não removamos as palavras de parada em chinês dos dados de pesquisa, ao mesmo tempo em que garantimos que as palavras de parada ainda sejam removidas quando usadas como consulta de pesquisa.

1 curtida

@tgxworld Não entendo a diferença entre dados de pesquisa e consulta de pesquisa. Você poderia fornecer mais detalhes? Obrigado.

Se adicionarmos stop words ao índice, ele fica inflado e a performance da busca piora.

Existem duas colunas que armazenamos na tabela PostSearchData: #search_data é usado ao consultar termos de pesquisa. #raw_data é o que usamos ao exibir o trecho da pesquisa. A correção aqui deve ser que as palavras de parada em chinês não sejam removidas do #raw_data, mas continuem sendo removidas do #search_data.

Há algum progresso sobre esse bug?

Acreditei que fiz algumas alterações aqui:

Sua localização está definida como zh_TW, zh_CN ou ja? Se não, search_tokenize_chinese_japanese_korean está definido como true?

Temos uma alternativa aqui:

2 curtidas