【问题标题】:How can I create a bag of words for latex strings?如何为乳胶字符串创建一个词袋?
【发布时间】:2014-10-05 03:59:57
【问题描述】:

我有一组乳胶格式的输入段落。我想用它们创建一个词袋。

采取一组看起来像这样的人:

"Some guy did something with \emph{ yikes } $ \epsilon $"

我想出一本字典:

{ 
  "Some": 40,
   ...
   "yikes": 10
   "epsilon (or unicode for it)": 3
} 

也就是说,我需要一个字典,其中的键集是所有段落中的单词/符号/方程式(为了简洁起见,我将所有这些单词都称为)的集合,以及它们在所有段落中出现的计数。

从那里给定的 k-ordered-tuple 单词,我需要一个 k-array 用于每个段落,其中数组中的第 i 个元素表示该段落中第 i 个元组中单词的计数。

所以说(Some, dunk, yikes, epsilon) 会给我 [1, 0, 1, 1] 用于所述示例。

我已经尝试过使用词法分析器将标记取出并直接处理标记。这很困难且容易出错,更不用说速度慢了。有没有更好的策略或工具可以做到这一点?

有一些特殊字符需要考虑的极端情况:

G\""odel => Gödel 

例如。我想保留这些。

另外,我想将方程式全部放在一起或将它们保留为一个单词。方程出现在 $ ... $ 符号之间。

【问题讨论】:

  • 你想做什么? “矢量化”是什么意思?你能举个例子——输入和期望的输出吗?
  • 嗨 Falko,我认为这篇 wiki 文章提供了一个很好的例子:en.wikipedia.org/wiki/Bag-of-words_model#Example_implementation。除了在我的情况下输入是乳胶
  • 我知道词袋的计算机视觉概念。但仅从“矢量化”和“词袋”这两个术语,就不可能推断出您的实际目标是什么。我猜你想建立字典? - 为了吸引别人来帮助你,你应该给出一个清晰的最低限度的例子,说明你拥有什么以及你想要什么。
  • 好的,谢谢,我会修改它以反映它。
  • 谢谢,好多了! :)

标签: machine-learning scikit-learn text-mining feature-extraction


【解决方案1】:

如果我理解正确,您正在尝试执行以下操作:

  1. 将句子拆分成单词:

    s = "Some guy did something with \emph{ yikes } \epsilon"
    words = s.split()
    print words
    

    输出:

    ['Some', 'guy', 'did', 'something', 'with', '\\emph{', 'yikes', '}', '\\epsilon']
    
  2. 统计出现次数:

    from collections import Counter
    dictionary = Counter(words)
    print dictionary
    

    输出:

    Counter({'did': 1, '}': 1, '\\epsilon': 1, 'Some': 1, 'yikes': 1, 'something': 1, 'guy': 1, 'with': 1, '\\emph{': 1})
    
  3. 访问单词及其对应的数字作为单独的列表:

    print dictionary.keys()
    print dictionary.values()
    

    输出:

    ['did', '}', '\\epsilon', 'Some', 'yikes', 'something', 'guy', 'with', '\\emph{']
    [1, 1, 1, 1, 1, 1, 1, 1, 1]
    

请注意,我还没有处理任何单词。您可能想要去掉括号或反斜杠。但这可以通过使用 for 循环遍历字典(或列表)并单独处理每个条目来轻松完成。


将 LaTeX 变音符号 转换为 unicode 字符在某种程度上是一个全新的问题。关于这个主题有几个 stackoverflow 问题和答案。也许您只需要在初始字符串中查找/替换它们:

s = s.replace('\\"o', unichr(252))

(请注意,根据您的命令行编码,您可能看不到带有print s 的变音符号。但它们不会丢失,如使用print repr(s) 所示。)

要保留方程式,您可以使用正则表达式而不是 split 来拆分字符串:

import re
print re.findall('\$.+\$|[\w]+', s)

输出:

['Some', 'guy', 'did', 'something', 'with', 'emph', 'yikes', '$ \\epsilon $']

请参阅my answer to another question 了解类似示例和更详细的说明。

【讨论】:

  • 谢谢。我尝试过这样的事情,但我正在丢失信息。例如,如果某个单词使用了变音符号,例如 G\""odel(请参阅en.wikipedia.org/wiki/%C3%96),则该单词会丢失。如果可能的话,我还想保留方程式或将它们全部放在一起。等式发生在美元 $ .... $ 之间。有什么建议吗?我也会更改问题以反映这些情况。
  • @ArtisanV:我扩展了我的答案来解决这两个问题。这应该足以让它在原则上工作。我假设您会在其他 stackoverflow 讨论中找到更详细问题的答案。
猜你喜欢
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 2017-11-04
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
  • 1970-01-01
  • 2011-01-12
相关资源
最近更新 更多