Pregunta

Sin obtener un título en recuperación de información, me gustaría saber si existe algún algoritmo para contar la frecuencia con la que aparecen las palabras en un cuerpo de texto determinado.El objetivo es obtener una "sensación general" de lo que la gente dice a través de una serie de comentarios textuales.En la línea de palabra.

Lo que me gustaría:

  • ignorar artículos, pronombres, etc. ('un', 'una', 'el', 'él', 'ellos', etc.)
  • preservar los nombres propios
  • ignorar la separación de palabras, excepto los de tipo suave

Si buscamos las estrellas, estas serían color de rosa:

  • manejo de derivaciones y plurales (p. ej.me gusta, me gusta, me gusta, me gusta coincide con el mismo resultado)
  • agrupación de adjetivos (adverbios, etc.) con sus sujetos ("gran servicio" en contraposición a "excelente", "servicio")

Intenté algunas cosas básicas usando Wordnet, pero solo estoy modificando las cosas a ciegas y esperando que funcione para mis datos específicos.Algo más genérico sería genial.

¿Fue útil?

Solución

Necesitará no uno, sino varios algoritmos interesantes, como los siguientes.

  • ignorar los pronombres se hace a través de un lista de parada.
  • ¿Preservar los nombres propios?Te refieres a detectar entidades con nombre, como Aspiradora Presa y decir "es una palabra" o sustantivos compuestos, como programación idioma?Te daré una pista:Esa es una pregunta difícil, pero existen bibliotecas para ambos.Busque NER (reconocimiento de entidad nombrada) y fragmentación léxica. OpenNLP es un kit de herramientas Java que hace ambas cosas.
  • ¿Ignorando la separación de palabras?¿Quieres decir, como en los saltos de línea?Utilice expresiones regulares y verifique la palabra resultante mediante la búsqueda en el diccionario.
  • manejo de plurales/derivaciones:puedes mirar en el Taladro de bola de nieve.Funciona muy bien.
  • "agrupar" adjetivos con sus sustantivos es generalmente una tarea de análisis superficial.Pero si buscas específicamente adjetivos cualitativos (bueno, malo, de mierda, asombroso...) quizás te interesen análisis de los sentimientos. LingPipe hace esto y mucho más.

Lo siento, sé que dijiste que querías BESAR, pero desafortunadamente tus demandas no son tan fáciles de cumplir.Sin embargo, existen herramientas para todo esto, y usted debería poder unirlas y no tener que realizar ninguna tarea usted mismo, si no lo desea.Si desea realizar una tarea usted mismo, le sugiero que consulte la derivación, es la más fácil de todas.

Si opta por Java, combine Lucena con el OpenNLP kit de herramientas.Obtendrás muy buenos resultados, ya que Lucene ya tiene un lematizador incorporado y muchos tutoriales.Por otro lado, el kit de herramientas OpenNLP está mal documentado, pero no necesitarás mucho de él.Usted también puede estar interesado en NLTK, escrito en Python.

Yo diría que elimine su último requisito, ya que implica un análisis superficial y definitivamente no mejorará sus resultados.

Ah, por cierto.el término exacto de ese documento-término-frecuencia-que estabas buscando se llama tf-idf.Es prácticamente la mejor manera de buscar la frecuencia de los documentos para los términos.Para hacerlo correctamente, no tendrás que evitar el uso de matrices vectoriales multidimensionales.

...Sí, lo sé.Después de asistir a un seminario sobre RI, mi respeto por Google fue aún mayor.Sin embargo, después de hacer algunas cosas en IR, mi respeto por ellos disminuyó igual de rápido.

Otros consejos

Bienvenido al mundo de la PNL ^_^

Todo lo que necesitas es un poco de conocimiento básico y algunas herramientas.

Ya existen herramientas que te dirán si una palabra en una oración es un sustantivo, adjetivo o verbo.Se les llama etiquetadores de parte del discurso.Por lo general, toman texto plano en inglés como entrada y generan la palabra, su forma base y la parte del discurso.Aquí está el resultado de un popular etiquetador de partes del discurso de UNIX en la primera oración de su publicación:

$ echo "Without getting a degree in information retrieval, I'd like to know if there exists any algorithms for counting the frequency that words occur in a given body of text." | tree-tagger-english 
# Word  POS     surface form
Without IN  without
getting VVG get
a   DT  a
degree  NN  degree
in  IN  in
information NN  information
retrieval   NN  retrieval
,   ,   ,
I   PP  I
'd  MD  will
like    VV  like
to  TO  to
know    VV  know
if  IN  if
there   EX  there
exists  VVZ exist
any DT  any
algorithms  NNS algorithm
for IN  for
counting    VVG count
the DT  the
frequency   NN  frequency
that    IN/that that
words   NNS word
occur   VVP occur
in  IN  in
a   DT  a
given   VVN give
body    NN  body
of  IN  of
text    NN  text
.   SENT    .

Como puede ver, identificó "algoritmos" como la forma plural (NNS) de "algoritmo" y "existe" como una conjugación (VBZ) de "existir". También identificó "a" y "el" como "determinantes (DT)" - otra palabra para el artículo.Como puede ver, el etiquetador POS también tokenizó la puntuación.

Para hacer todo menos el último punto de tu lista, sólo necesitas pasar el texto por un etiquetador POS, filtrar las categorías que no te interesan (determinantes, pronombres, etc.) y contar las frecuencias de las formas básicas de las palabras.

A continuación se muestran algunos etiquetadores de puntos de venta populares:

Etiquetador de árboles (solo binario:Linux, Solaris, OS-X)
Etiquetador GENIA (C++:compila tu mismo)
Etiquetador de punto de venta de Stanford (Java)

Para hacer lo último de su lista, necesita algo más que información a nivel de palabra.Una forma fácil de empezar es contando. secuencias de palabras en lugar de sólo palabras en sí.estos se llaman n-gramos.Un buen lugar para empezar es UNIX para poetas.Si está dispuesto a invertir en un libro sobre PNL, le recomendaría Fundamentos del procesamiento estadístico del lenguaje natural.

A continuación se muestra un ejemplo de cómo podría hacerlo en Python; los conceptos son similares en cualquier idioma.

>>> import urllib2, string
>>> devilsdict = urllib2.urlopen('http://www.gutenberg.org/files/972/972.txt').read()
>>> workinglist = devilsdict.split()
>>> cleanlist = [item.strip(string.punctuation) for item in workinglist]
>>> results = {}
>>> skip = {'a':'', 'the':'', 'an':''}
>>> for item in cleanlist:
      if item not in skip:
        try:
          results[item] += 1
        except KeyError:
          results[item] = 1

>>> results
{'': 17, 'writings': 3, 'foul': 1, 'Sugar': 1, 'four': 8, 'Does': 1, "friend's": 1, 'hanging': 4, 'Until': 1, 'marching': 2 ...

La primera línea solo obtiene bibliotecas que ayudan con partes del problema, como en la segunda línea, donde urllib2 descarga una copia del "Devil's Dictionary" de Ambrose Bierce. Las siguientes líneas hacen una lista de todas las palabras del texto, sin puntuación.Luego creas una tabla hash, que en este caso es como una lista de palabras únicas asociadas con un número.El bucle for recorre cada palabra del libro de Bierce, si ya existe un registro de esa palabra en la tabla, cada nueva aparición suma uno al valor asociado con esa palabra en la tabla;si la palabra aún no ha aparecido, se agrega a la tabla, con un valor de 1 (lo que significa una aparición). Para los casos de los que estás hablando, querrás prestar mucha más atención a los detalles, por ejemplo, usando mayúsculas. para ayudar a identificar nombres propios sólo en medio de oraciones, etc., esto es muy aproximado pero expresa el concepto.

Para profundizar en las cuestiones de derivación y pluralización, experimentar y luego buscar trabajos de terceros. He disfrutado partes de NLTK, que es un proyecto académico de código abierto, también en Python.

Escribí un programa completo para hacer esto hace un tiempo.Puedo subir una demostración más tarde cuando llegue a casa.

Aquí está el código (asp.net/c#):http://naspinski.net/post/Findingcounting-Keywords-out-of-a-Text-Document.aspx

La primera parte de tu pregunta no suena tan mal.Básicamente, todo lo que necesita hacer es leer cada palabra del archivo (o transmitir w/e) y colocarla en un árbol de prefijos y cada vez que encuentre una palabra que ya existe, incremente el valor asociado a ella.Por supuesto, también tendrá una lista de ignorados de todo lo que le gustaría dejar fuera de sus cálculos.

Si utiliza un árbol de prefijos, se asegura de que para encontrar cualquier palabra vaya a O(N), donde N es la longitud máxima de una palabra en su conjunto de datos.La ventaja de un árbol de prefijos en esta situación es que si desea buscar plurales y raíces, puede verificar en O(M+1) si eso es posible para la palabra, donde M es la longitud de la palabra sin raíz o pluralidad. (¿Es esa una palabra?jeje).Una vez que haya construido su árbol de prefijos, lo volvería a analizar para las raíces y demás y lo condensaría para que la palabra raíz sea la que contenga los resultados.

Al buscar, podría tener algunas reglas simples para que la coincidencia resulte positiva en el caso de la raíz o el tallo o lo que sea.

La segunda parte parece extremadamente desafiante.Mi ingenua inclinación sería mantener resultados separados para agrupaciones adjetivo-sujeto.Utilice los mismos principios anteriores pero manténgalos separados.

Otra opción para el análisis semántico podría ser modelar cada oración como un árbol de relaciones de sujeto, verbo, etc. (la oración tiene un sujeto y un verbo, el sujeto tiene un sustantivo y un adjetivo, etc.).Una vez que haya dividido todo el texto de esta manera, parece que podría ser bastante fácil repasarlo y obtener un recuento rápido de los diferentes emparejamientos apropiados que ocurrieron.

Sólo algunas divagaciones, estoy seguro de que hay mejores ideas, pero me encanta pensar en estas cosas.

El algoritmo que acabas de describir.Un programa que lo hace de inmediato con un botón grande que dice "Hazlo"...No sé.

Pero permítanme ser constructivo.te recomiendo este libro Programación de Inteligencia Colectiva.Los capítulos 3 y 4 contienen ejemplos muy pragmáticos (en realidad, no hay teorías complejas, sólo ejemplos).

Puede utilizar el diccionario de Worldnet para obtener la información básica de la palabra clave de la pregunta, como su pasado, extraer sinónimos, y también puede hacer lo mismo con su documento para crear el índice.luego podrá hacer coincidir fácilmente la palabra clave con el archivo de índice y clasificar el documento.luego veranícelo.

Todo lo que ha enumerado está bien manejado por espacioso.

  1. Ignora algunas palabras; usa palabras vacías.
  2. Extraiga el asunto: utilice etiquetas de parte del discurso para identificarlo (funciona de forma inmediata).Después de analizar una oración, busque "RAÍZ", el verbo principal de la oración.Por navegando por el árbol de análisis Encontrarás un sustantivo que se relaciona con este verbo.Será el tema.
  3. Ignore la separación de palabras: su tokenizador maneja guiones en la mayoría de los casos.Se puede ampliar fácilmente para manejar casos más especiales.

Si la lista de temas está predeterminada y no es enorme, puedes incluso ir más allá:construir un modelo de clasificación que prediga el tema.Digamos que tienes 10 sujetos.Recopilas frases o textos de muestra.Los cargas en otro producto: prodigio.Usando su excelente interfaz, asigna rápidamente temas a las muestras.Y finalmente, utilizando las muestras categorizadas, entrena el modelo espacial para predecir el tema de los textos u oraciones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top