如何为乳胶串创建一包单词?

时间:2014-10-04 18:10:37

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

我有一组乳胶格式的输入段落。我想从他们那里创造一袋文字。

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

"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 
例如,

。我想保留这些。

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

1 个答案:

答案 0 :(得分:2)

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

  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]
    
  4. 请注意,我还没有处理任何单词。您可能想要删除括号或反斜杠。但是这可以通过使用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