Pergunta

Eu tenho um banco de dados completo de caracteres asiáticos registros preenchidos (chinês, japonês e coreano) ao lado daqueles com latino-caráter cheio registros (Inglês, Francês, o nome dele), e eu quero realizar buscas de texto completo sobre eles.

MySQL diz:

línguas ideográfica como o chinês e japonês não tem palavra delimitadores. Portanto, o FULLTEXT analisador não é possível determinar onde as palavras começar e terminar na estes e outros tais línguas. As implicações desta e algumas soluções para o problema estão descritos na Seção 11.8, “Full-Text Funções de Busca”.

Seção 11.8, na verdade, não oferece soluções alternativas ou até mesmo mencionar o problema.

Assim, Como você tipo uma pesquisa para um único caractere chinês em um banco de dados-caráter misto ? %LIKE% iria funcionar, mas ele não tem as classificações de relevância bacana. Devo apenas contar as vezes que um personagem aparece no registro e classificação por que? Agradeço qualquer conselho que você tem. Obrigado!

Foi útil?

Solução

Depende do tamanho do conjunto de dados. Se estamos falando de centenas de milhares de linhas, eu provavelmente dar uma olhada em um dos excelentes soluções de pesquisa de texto completo independentes disponíveis. Eu realmente nunca teve de lidar com este mysqlf problema, então eu não tenho certeza de que soluções que inclui suporte para idiomas asiáticos.

No entanto eu sei que lucene ostenta um analisador para chinês, japonês e coreano, então o meu palpite é que ele tem algum tipo de apoio para o que você está fazendo. O que eu costumo fazer quando eu preciso integrar lucene com php é que eu implementar Lucene como um servidor socket, e conectá-lo a partir de php.

Se o conjunto de dados é pequeno o suficiente, pode ser uma opção para rolar sua própria abordagem ad-hoc. Há duas partes para este problema: Recuperação de documentos a serem classificados, e o ranking real. Há várias maneiras de fazer a recuperação. Um pode ser usar LIKE, se você estiver conjunto de dados é suficientemente pequeno. Outra poderia ser a de rolar o seu próprio esquema de indexação baseado em disco, embora isso seria bastante complexo e demorado. Você também pode usar o MySQL como um caminho do meio, como descrito abaixo.

A fim de implementar um esquema de indexação usando MySQL, você teria que criar algumas mesas com a seguinte estrutura:

document
  document_id
  document_text
  document_tokencount

document_token
  document_id
  token_id
  token_docfrequency
  index (token_id, document_id)

token
  token_id
  token_unicode
  token_globalfrequency
  index (token_unicode)

Então eu processar cada documento e inserir uma linha na tabela document_token para cada personagem (token) em um documento. O campo token_unicode conteria a sequência de inteiros unicode utilizada para referr a este personagem. O campo token_docfrequency contém um número inteiro correspondente ao número de vezes que o documento contém o símbolo, enquanto o campo token_globalfrequency contém o número total de vezes que o termo é utilizado, em todos os documentos.

Isso permitirá que você para fazer pesquisas rápidas de tokens:

SELECT * FROM document_token WHERE token_id = 1
UNION
SELECT * FROM document_token WHERE token_id = 2
UNION
SELECT * FROM document_token WHERE token_id = 3

(a abordagem união é um hack que permite mysql para utilizar índices para todos os seleciona, e provavelmente será mais rápido do que a consulta correspondente utilizando um único selecione e vários ou declarações)

Isso nos deixa com classificação de relevância como o problema restante, que é o que você realmente pediu. :) Isto pode ser feito com bastante bons resultados, utilizando a Vector Model Space (VSM) .

Depois de fazer uma pesquisa, a primeira coisa que você tem a fazer é calcular o tf-idf marcar para esse token. Isso é feito usando a fórmula:

tf-idf = tf(t,d) / tf(d) * log(D / d(t))

where:
tf(t,d) = token frequency in current document
tf(d) = total number of tokens in current document
D = total number of documents
d(t) = number of document that contains the token

Calcular esta pontuação para cada termo na consulta de pesquisa em primeiro lugar, e armazenar o resultado em uma hashmap ou algo semelhante. Este é seu primeiro vector, chamado v_1. Em seguida, avance para o primeiro documento. Calcular a pontuação tf-idf para cada termo no documento, bem como, e armazená-lo como v_2. Agora você pode calcular uma pontuação para este documento usando cosseno similaridade :

score = arccos(v_1 * v_2 / (|v_1| * |v_2|))

O resultado é um valor que pode ser usado para classificar o documento. Continuar e fazer isso para cada documento. O tipo-los em ordem decrescente. O primeiro documento na lista será o mais relevante.

Isto tudo pode parecer um pouco complicado, mas se você tem algum conhecimento básico de álgebra linear, você provavelmente poderia produzir uma solução de trabalho em poucas horas. Ainda assim, se possível, usar uma solução existente, como Lucene.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top